a,&a,*&a,**&a的区别

昨天遇到了一个很迷的问题,话不多说看代码。
int *b ,*c;
int a[100] = { 0,1,2,3,4};

printf("%d\n", sizeof(a));
printf("%d\n", sizeof(a[10]));
printf("%d\n", sizeof(&a));
printf("%d\n", sizeof(&a[0]));
printf("\n");
printf("a=%d\n", a);
printf("a[3]=%d\n", a[3]);
printf("&a=%d\n", &a);
printf("&a[0]=%d\n", &a[0]);
b = &a;	
c = &b;
printf("\n");
printf("*a=%d\n", *a);
printf("*(&a)=%d\n", *(&a));
printf("**(&a)=%d\n", **(&a));
printf("*b=%d\n", *b);
printf("*c=%d\n", *c);
printf("*&a[0]=%d\n", *&a[0]);


看到a和&a,&a[0]打印出来是一样的。理所当然就认为他们一样,其实不然,以至于在我指向a,&a,&a[0]的时候,结果是不同的,a和&a[0]都是a[0]的值0,&a却是数组首地址。
指向
&a的结果才是0,即**&a=0。

在此说下我的理解,之后用几行代码证明我的理解。
a是数组的首地址,即a[0]的地址。&a是整个数组的首地址,
&a同时也是指向数组指针a的指针。我画了张图,只不过地址f和地址g在一位数组下恰好相同。所以*&a就是a,**&a就是a[0]的值。
在这里插入图片描述
以下证明我的理解
在这里插入图片描述
之前a是数组,这次将定义为int型指针,
此时看a和&a打印出来是不一样的,a是存放i的地址,&a是存放a的地址,

下图对代码解析图
在这里插入图片描述
为了更加深刻理解数组中a和&a到地有啥区别,输出结果是2,4
int as[5] = { 1,2,3,4,5 };
int ptr = (int)(&as + 1);

printf("(as + 1)=%d,(ptr - 2)=%d\n", *(as + 1), *(ptr - 2));
as+1代表数组内a[1]
&as+1代表下一个连续数组整个数组首地址。也可以理解为a数组最后一个元素的下个地址。

  • 9
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值