数组与指针进阶|指针进阶-ONE(包含对数组的加深理解)

这是一系列的题目。
指针的题目对于初学者,算比较折磨人的,尤其是和数组密不可分,来看看一道题目吧。

#include int main(void) { 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)); printf("%d\n", sizeof(*a)); printf("%d\n",sizeof(&a+1)); return 0; }

计算这几个的输出。
先来看看sizeof(),这个关键字。
sizeof()是计算类型的大小。以字节为单位。
如:sizeof(int)------4
而上面的题也是计算括号内的类型的大小。
先来看两个规则之类的条件
sizeof(数组名)–数组名此时表示整个数组
&数组名————表示整个数组
除此之外,全都表示数组首元素地址
且,在内存中,无论什么类型元素的地址,地址大小都占4个字节大小。
1.printf("%d\n", sizeof(a));
此时,a,表示整个数组,计算整个数组占内存的大小,int 占4个字节
则答案是4*4=16个字节。
2.printf("%d\n", sizeof(a + 0));
此时,a+0,并不是单独一个数组名,不表示整个数组。其代表首元素地址,而地址是只占4个字节的(不知道往上看)。答案是4.
3.printf("%d\n", sizeof(&a));
【数组与指针进阶|指针进阶-ONE(包含对数组的加深理解)】取地址符,符合两个条件。则代表取出数组的地址,但数组地址也是首元素,是地址,那就只占4个字节。
4.printf("%d\n", sizeof(*&a));
又取地址又解引用,相互抵消了。且还是相当于单独的一个a,同上,16bytes.
printf("%d\n",sizeof(&a+1));
这个&a+1与a+1不一样,a+1和第二题是一个类型,而&a则得到的是整个数组的地址,虽然与首元素是一样的 ,但是&a是一个占用4个int类型的对象的地址,而a是一个占用1个int类型的对象的地址。代表的对象不同,则指针移动大小也不一样
数组与指针进阶|指针进阶-ONE(包含对数组的加深理解)
文章图片

但&a+1表示的依旧是地址,那就是4给字节。
还有,待发布。
如有问题,烦请大佬指点。
指针进阶-TWO

    推荐阅读