C语言 详解多级指针与指针类型的关系

//V推论①:指针变量的步长只与‘指针变量的值’的类型有关(指针的值的类型 == 指针指向数据的类型)
//指针类型跟指针的值有关,指针是占据4个字节大小的内存空间,但是指针的类型却是各不相同的 //指针的类型决定了指针指向的内存空间从哪个位置开始,从哪个位置结束 //普通变量名是一段内存空间的标识,普通变量名代表的是一段内存空间, //对于复杂变量(例如指针):要知道某个指针的步长,必须确定指针的类型 //指针的值永远是一个十六进制数字,但是这个十六进制数字指向的内存空间却是不相同的 //int a[5]; char *arr[4]={"aa","ss","dd","ee"};对于这2个一维数组而言 //a是一个指针,a指针的值是a[0]这个int型变量的地址,所以a的类型是int *; //arr是一个指针,arr指针的值是arr[0]这个char *型变量的地址,所以arr的类型是char ** //有人会想a的类型是int *,那么a的步长应该是sizeof(int *) 是4;其实不对,a的步长应该是a指向的内存空间的大小 //a指向的内存空间是int型的变量a[0],a[0]的大小是4个字节,因此a的步长是sizeof(int) 是4 虽然都是4 但是意义不一样 //再来讨论arr,由以上推论可得,arr的步长应该是arr指向内存空间的大小,arr指向内存空间是一个字符串的指针, //字符串的指针的大小是 sizeof(char *) = 4 个字节,所以arr的步长是4个字节 //举例int a[5]={0},讨论a和&a的步长 //a指向的是一个int型变量(上面已经详述),a的步长是sizeof(int) = 4; //&a这指针指向的是一个int型的一维数组,这个int型的一维数组的大小是sizeof(int)*5 = 20; //所以&a的步长是20 //V推论②:多级指针是人为为‘指针本身’做的一种区分 //二级指针是指针本身类型的一种人为自定类别,但通常意义上指针的类型没有任何关系 //一级指针与二级指针的区别在于,一级指针的值是某种类型的数据的地址,而二级指针的值是一个指针的地址 //指针的步长只跟指针的类型有关系,跟指针是几级指针没关系 #include<stdio.h> #include<stdlib.h> void main(){ int a[5] = { 1, 2, 3, 2, 1 }; printf("%x ", &a); // 打印 76fc54 printf("%x ", &a + 1); // 打印 76fc68 得出结论:&a的步长是20(特别提醒:这是十六进制) printf(" ----------------- "); char *myarr[] = {"aaaaa","bb","c","dede"}; printf("%x ", myarr); // 打印 81fe88 printf("%x ", myarr + 1); // 打印 81fe8c 得出结论:myarr的步长是4 system("pause"); }
原文地址:https://www.cnblogs.com/zhanggaofeng/p/5366259.html