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

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

#include <stdio.h>
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));

取地址符,符合两个条件。则代表取出数组的地址,但数组地址也是首元素,是地址,那就只占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类型的对象的地址。代表的对象不同,则指针移动大小也不一样
在这里插入图片描述
但&a+1表示的依旧是地址,那就是4给字节。
还有,待发布。
如有问题,烦请大佬指点。
指针进阶-TWO

猜你喜欢

转载自blog.csdn.net/weixin_52199109/article/details/112297949