tfsf.net
当前位置:首页>>关于int a[5]={1,2,3,4,5}; int * ptr=(int *)(&a+1); ...的资料>>

int a[5]={1,2,3,4,5}; int * ptr=(int *)(&a+1); ...

这个问题的关键是理解 &a a是一个数组名,也就是数组的首地址.对a进行取地址运算符,得到的是一个指向数组的指针!!!!这句话尤为重要!也就相当于int (*p) [5] = &a;p是一个指针,它指向的是一个包含5个int元素的数组!!那么执行p+1后,p的偏移量相当于 p + sizeof(int) * 5 !!而程序中强制将指针p转换成一个int* 那么 p -1 其实就是 p - sizeof(int)所以,p -1 指向了数组中得最后一个元素,也就是 5

翻译一下:int *ptr2 = ***;声明一个整形指针指向某个地址;这个地址是:(int*)((int)a+1);(int)a,a是数组名,也是数组首地址,一般是32为的某一个数值,比如说 a =0x12345678,(int)a将a转换成整型值,0x12345678,然后将这个数值加

&a + 1 &a的类型为 int (*)[5] 那么&a+1 后 +1 其实 +上5*sizeof(int)的大小 然后你你又强转为int*类型 而p-1 减去的其实就Int的大小 因为他的类型为int*

这题的关键在int *ptr=(int *)(&a+1);这一句上,&a表示取得数组a存储区域的首地址,再加1表示数组a存储区域的后的地址,这就使得ptr指针指向数组的最后一个元素后面的那个存储单元的地址,而ptr减1后,再进行数据访问,则访问的是ptr指针的前一个存储单元的值,所有最后的答案是2,5

p是一个一维数组.它的内容是1~12.也就是将a中的元素按行存入了p中了.*((p+2)+3)=*(p+5)就是p[5],而p[5]=6.a[1][2]=6,所以这两者是等价的.

地址 0-3 4-7 8-11 12-15 16-19 20-23 数值 1 2 3 4 5 &a+1 就是地址为20的地方*ptr1[-1]就是20-4=16这个地方 一个Int 占用4个地址(int)a+1 跟a+1不一样 前者地址为1 后者为4 所以*ptr2表示的是指向地址为1的指针地址

相关文档
网站首页 | 网站地图
All rights reserved Powered by www.tfsf.net
copyright ©right 2010-2021。
内容来自网络,如有侵犯请联系客服。zhit325@qq.com