数组名与指针那点破事

#include <stdio.h>

 

int main()

{

     int a[4][5]={0};

     a[3][4]=45;

 

     //此处貌似个编译器bug,printf出来的是,int* 

     //而监视出的结果是,类型是int[4][5]

     printf("%d\n",sizeof(a+1));     

 

     //规律(知识点):数组类型+1是地址偏移个数组内元素类型大小,它指向的也是这个元素空间.但这是结果.

     //原因:a的类型是int[4][5]。在表达式a+1中,a 会退化为一个指针,即int(*)[5]

     //而指针+1则是地址偏移个指针所指向类型的大小

 

     //本例而言:a+1 a是代表了整个[4][5]数组,是数组类型,a+1就在a地址值基础上偏移个内部元素个单位,

     //并指向该元素,即第二行,a+1指向类型是int[5].  在监视中a+1类型为int[4][5]我觉得这是不对的,其类型应为int(*)[5](个人观点)

     //&a+1则是偏移一个(&a)所指向类型个大小,&aint[4][5]*类型,指向类型为int[4][5],所以&a+1的地址值为a+4*5*sizeof(int),

     //a[3][4]元素的下一个位置,注意(&a+1)类型是int[4][5]*,让其强制转化为int*,它便是个普通的整型指针

     //(int*)(&a+1)-1就是&a+1的值的基础上负偏移个(int*)(&a+1)所指向的类型个单位,正好是a[3][4]

     printf("%d\n",*((int*)(&a+1)-1));

 

     return 0;

}

打印结果

4

45

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值