指针进阶的内容基本介绍完毕,如果你自我感觉不错,没有对里面的内容感到迷惑的话,那么我们就开始下面的内容
目录
1.一维数组
1.1int型
首先看下面的代码:
int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(a+0));
printf("%d\n",sizeof(*a));
printf("%d\n",sizeof(a+1));
printf("%d\n",sizeof(a[1]));
printf("%d\n",sizeof(&a));
printf("%d\n",sizeof(*&a));
printf("%d\n",sizeof(&a+1));
printf("%d\n",sizeof(&a[0]));
printf("%d\n",sizeof(&a[0]+1));
现在告诉我它们的值分别是什么,在没有给出自己的答案前不要往下看
答案如下:
现在来说说为什么
int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));数组名单独在sizeof内部,求的是数组的大小,单位字节
printf("%d\n",sizeof(a+0));数组名不是单独在sizeof内部,故代表首元素地址,求的是首元素的地址的大小,为4或8
printf("%d\n",sizeof(*a));首元素地址解引用,求的是首元素的数据类型的大小
printf("%d\n",sizeof(a+1));同sizeof(a+0)类似,不过求的是a[1]的地址的大小,为4或8
printf("%d\n",sizeof(a[1]));这个你要不知道建议把C语言的数组和指针重新再看一遍,别往下看了
printf("%d\n",sizeof(&a));求数组地址的大小,为4或8
printf("%d\n",sizeof(*&a));取数组地址再进行解引用,那就是数组的所有元素
printf("%d\n",sizeof(&a+1));数组的地址再+1,依旧是求地址的大小,为4或8
printf("%d\n",sizeof(&a[0]));求a[0]的地址的大小,4或8
printf("%d\n",sizeof(&a[0]+1));a[0]地址+1后还是地址,4或8
上述求地址的值32位机器下为4,64位为8,在vs2019中将x86改为x64就可以看到
后面就不再展示
1.2字符串
现在将数组由int型改为char型
char arr[] = {'a','b','c','d',&