前几天做了个笔试, 里面有一道题是这样的
我跑了一下, 结果是6
我暂时把它分成两份 一个*(a+1) ,一个是后面剩下的一堆
这个a在这里表示的是数组的首地址,那么a+1就是a[1]的地址,这个地址指向的就是2
我跑了一下 *(a+1)确实是2 , 证明我的想法没错
那么后面的 *((int*)(&a + 1) - 1) 就是4
这里我先说一下a和&a的区别
a和&a我都输出了一下是一个结果 ,那么他们都表示数组的地址 ,但是区别在于 a+1和&a+1 他们的步长不一样
这里是我的输出结果 ,可以看到a+1的步长是4, 而&a+1的步长是16
我的老师给出的解释是:
a:数组首地址,类型是指针(int *) ,步长是sizeof(int) ,因为数组a的类型int
&a:数组的地址, 指向整个数组 ,类型是数组指针(int [4]) ,步长为指针的步长 sizeof(int)*4,至于为什么乘以4,是因为数组里面有四个元素,每个元素都是int
简单的来说a的步长就是一个数组元素的长度,而&a的步长是整个数组的长度
所以对后半部分的式子我有如下解释:
如果有不对的地方希望各位大佬批评指正。