数组名和数组名取地址的区别

int main()
{
   int a[3]={1,2,3};
   printf("%d\n",a);
   printf("%d\n",&a);
   printf("%d\n",a+1);
   printf("%d\n",&a+1);
   printf("%d\n",&a[0]+1);
   printf("%d\n",(int)a+1);
    return 0;
}


分析:
      由运行结果可知,数组名a和&a得内存地址相同。我们由数组和指针的关系知道,a代表这个数字,它相当于一个指针,指向第一个元素(&a[0]),即指向数组的首地址。数组中的其他元素可以通过a的位移得到,此时的进阶是以数组中单个的元素类型为单位的。所以有a+1为2686648,即数组中a[1]的地址是2686648(在首地址2686644基础上加int的字节数4得到的)。
      然而,&a代表的不是取a这个变量的地址,而是取数组元素的地址。虽然&a和a得内存地址相同,但它们的意义不相同,它是代表整个数组的,它的进阶单位是整个数组的字节长度(这里是4*3=12),所以&a+1得内存地址为2686656。

     其实,a的类型是int[3]    数组
              &a的类型是int(*)[3]   指针——指向int[3]数组的指针,所以+1相当于加上3个int型的长度
              &a[0]的类型是int*      指针——指向int类型的指针, 所以+1相当于加上1个int的长度
 (int)a+1             将ad地址转换成int型,+1,就是整型数+1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值