首页 > 试题广场 >

下面程序的输出结果是( &n...

[单选题]
下面程序的输出结果是()
#include <stdio.h>
int main() { 
    int  intArray[] = {1, 2, 3, 4, 5}; 
    int  *p = (int *)(&intArray+1); 
    printf("%d,%d",*(intArray+1),*(p-1)); 
    return 0; 
}
  • 1,5
  • 1,6
  • 2,4
  • 2,5
主要是要理解这句话:int  *p = (int *)(&intArray+1);
intArray:是数组的首地址,
&intArray:就是存放这个数组首地址的地址,可用int (*)[5]的指针保存,
&intArray+1:相当于int (*)[5]这个指针的指针偏移,偏移量是指向元素的大小*1,(比如double *p,p+1的偏移量就是一个double的大小*1)
(int *)(&intArray+1):相当于把偏移后的地址(也是一个int[5])强转给p保存;
可得p指的是数组intArray结尾的下个地址,用二维数组理解的话就是intArray是第一个int[5],即int[0][5],p指向的是int[1][5]
发表于 2019-10-30 15:09:32 回复(0)
intarray是数组的首地址,& intarray得到的是一个指向数组的指针。若定义int (*s) [5] = & intarray; s是一个指针,它指向的是一个包含5个int元素的数组。 那么执行s+1后,s的偏移量相当于 s+ sizeof(int) * 5。因此p最初指向& intarray[0]+sizeof(int)*5。本题强制将指针p转换成一个int* 那么 p -1 其实就是 & intarray[0]+sizeof(int)*5 - sizeof(int) 。所以,p -1 指向intarray[4],也就是 5
编辑于 2019-01-17 09:08:24 回复(0)

*(intArray+1)其实很简单就是指intArray[1],输出为2.

问题关键就在于第二个点,*(p-1)输出为多少?

解释如下,&intArray+1不是首地址+1,系统会认为加了一个整个intArray数组,偏移了整个数组intArray的大小(也就是5个int的大小)。所以int*p=(int*)(&intArray+1);其实ptr实际是&(intArray[5]),也就是intArray+5.

原因为何呢?

&intArray是数组指针,其类型为int(*)[5];

而指针加1要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同,intArray是长度为5的int数组指针,所以要加5*sizeof(int),所以p实际是intArray[5],但是p与(&intArray+1)类型是不一样的,这点非常重要,所以p-1只会减去sizeof(int*),intArray,&intArray的地址是一样的,但意思就不一样了,intArray是数组首地址,也就是intArray[0]的地址,&intArray是对象(数组)首地址,intArray+1是数组下一元素的地址,即intArray[1],&intArray+1是下一个对象的地址,即intArray[5]。

发表于 2020-09-29 09:07:36 回复(0)

根据各层楼的评论,主要关键点在于:
&intArray+相当于往后移动了整个数组

发表于 2021-10-01 00:08:26 回复(0)
*intArray+1:取intArray[0]的值+1为2
*(intArray+1):取intArray[0]向后一位即intArray[1]的值为2
&intArray+1:是intArray的首地址+sizeof(intArray),取后面的地址空间
所以p就是intArray[5]
*(p-1)就是intArray[5]向前一位即intArray[4]的值


发表于 2021-03-07 10:52:58 回复(0)
理解一下   (int *)( &intArray +1 )  和 p -1
&intArray + 1 = intArray的首地址 + sizeof(intArray)  此时 p指向数组intArray的末尾
p - 1 = p目前指向的地址 - sizeof(p) p指针的内存大小==sizeof(int)   正好是intArray数组里面一个元素的内存大小
结果 p指向intArray数组的倒数第二个元素 
发表于 2019-10-12 17:48:18 回复(1)
数组元素的指针+1,偏移该数组类型长度。
数组指针+1,偏移一个该数组的长度。
发表于 2022-09-28 23:12:03 回复(0)
数组名取地址&a: 对于一个普通的变量b,&b是指用取地址符号取得变量b的存放地址;a在内存中没有分配空间,只对数组a的各个元素分配了存储空间, 此处数组名字a显然不是普通的变量,&a也不代表所取a的存储地址。 &a在数值上等于&a[0],也等于a。此时,&a数值上等于整个数组的起始位置地址,含义上代表整个数组所占内存的大小,因为它的进阶 单位是整个数组的字节长度,(&a+1)等于的是数组结束之后的下一段的起始位置地址。
发表于 2022-07-15 15:21:07 回复(0)