首页 > 试题广场 >

以下代码输出什么____.

[单选题]
以下代码输出什么____.
#include <stdio.h>
int main(){
   int a[5] = {1, 2, 3, 4, 5};
   int *p = (int *)(&a + 1);
   printf("%d", *(p - 1));
}
  • 1
  • 2
  • 5
  • 出现错误
选择c,&a表示一个指向大小为5数组的指针,那么&a+1就是表示一个指向大小为5的下一个数组的指针,也就是数组a最后一个元素的下一个位置,那么int*p=(int*)(&a+1)进行强制类型转换,将指向数组的指针转换为指向第二个数组中首元素的指针,所以p-1则是指向第一个数组中最后一个元素的指针,所以输出是5
编辑于 2015-09-06 11:15:29 回复(8)
感觉这个提有问题,最后一句打印那,*p已经越界访问了,本意应该是*(p-1)。
引用Radar同学
数组名a可以作为数组的首地址,而&a是数组的指针。int *p=(int *)(&a+1);//这条语句中&a代表整个数组的地址,+1应加上sizeof(a)的长度( 类似与二维数组一样 ),故指针p指向a[5]处。printf("%d",*(p-1));//*(p-1) == a[4],语句输出a[4]的值,为5, 答案 C


发表于 2015-09-06 11:04:20 回复(0)
这题是选D,这是数组越界问题,P解引用 (*)的优先级是高于算术运算符“-”的,所以*p的值我们无从得知(指向内存的另一个位置),继而*p-1的值我们不知道,所以出现错误!!!
发表于 2015-09-06 10:38:58 回复(0)
数组名a可以作为数组的首地址,而&a是数组的指针。int *p=(int *)(&a+1);//这条语句中&a代表整个数组的地址,+1应加上sizeof(a)的长度,故指针p指向a[5]处。printf("%d",(*p-1));//(*p-1) == a[4],语句输出a[4]的值,为5,答案 C
编辑于 2015-09-06 10:27:49 回复(3)
本题选C。此题考查对C语言类型与内存的关系的理解,下面讲解一下通用的解题思路。

首先确认一点:a的类型为5个元素的int数组,其类型可以看作是int[5],虽然不存在这种类型,但是这么理解是没有问题的。

C/C++中指针和数字的运算是将指针按照其类型大小进行前后移动相应个数的字节数。如int类型大小(sizeof值)为4,char为1。 比如,int *p; char* q; p+1;就是将p的值(内存地址)加4(int类型的字节数),q+1则是将q的值加1(char类型的字节数)。

所以,题目中 &a+1 的意思就是将a的地址加上5个int的字节数,因为a的类型为int[5],然后将结果强制类型转换为 int *后赋值给p。

可是,a的地址又是什么呢? a的类型为int[5],所以,a的地址是指向了5个int类型元素的首地址,它的sizeof值是4*5=20,所以 &a+1 就是数组a最后一个元素后面的20个字节的首地址。

强制类型转换后,变成数组后面一个int空间的首地址。 所以,最后p-1就是数组最后一个int空间的首地址,*(p-1)就是数组最后一个元素了。

总之,类型只是标记内存读写的方式,或者说是内存分配的方式。而指针作为一种可以与内存地址等价的存在,其算术运算必须要结合类型的sizeof值。
编辑于 2021-04-18 16:22:52 回复(8)
该选D,第5行写错了,应该是
printf("%d",*(p-1));

具体解释http://www.oschina.net/question/234345_48794
发表于 2015-09-06 10:19:02 回复(2)
妈的,上当了。p定义是int *,p+i或者p-i编译器按p+i*4或p-i*4来算。 &a的类型是 int [5],指向五个int空间的指针,所以a+1编译器做 a地址+4*5来算,那么p-1最后指向a[4]   哥这是正确解释。大意了,我也着了道
发表于 2015-09-07 20:43:24 回复(2)
首先a指代a[0]的地址,也就是数组的首地址。(这里相当于一个指针指向数组的首地址)
&a相当于一个指向数组首地址指针的指针。
(&a+1)就是指向数组a下一行数组的指针的指针。然后强制转换成(int  *)变成了指向数组a
下一行的指针,打印输出*(p-1)就是向前移动一个。就是a[4]
发表于 2015-10-10 22:55:50 回复(1)
a表示一个1行5列的数组,在内存中表示为一个5个元素的序列,int*p=(int*)(&a+1)表示指向a数组的第6个元素(这里不存在第六个元素),p-1所指想的数据就是a数组的第五个元素5
发表于 2015-09-06 15:03:57 回复(0)
这样就可以知道,&a+1这个操作就是把指针指向了a后面的一个地址,最后*(p-1)就是回到了a的最后一个元素的地址,然后再解引用,就得到5了。

编辑于 2018-03-08 16:52:03 回复(0)
a的类型int[5],步长为int;
&a的类型为int[5]* , 步长为int[5];
p的类型为int* ,步长为int;
发表于 2018-09-08 12:31:53 回复(0)
a指向数组初始地址,&a+1为该数组之后后继地址,*p-1则纸箱a数组的最后一个数
发表于 2015-09-06 10:01:19 回复(0)
选择c,&a表示一个指向大小为5数组的指针,那么&a+1就是表示一个指向大小为5的下一个数组的指针,也就是数组a最后一个元素的下一个位置,那么int*p=(int*)(&a+1)进行强制类型转换,将指向数组的指针也就是指针的指针转换为指向第二个数组中首元素的指针,所以p-1则是指向第一个数组中最后一个元素的指针,所以输出是5
发表于 2017-08-29 11:38:39 回复(0)
int a[5]={1,2,3,4,5}等价于
int (*q)[5]={1,2,3,4,5}那么*q=a,q=&a
所以&a+1等于q+1 ,我们知道q是一个指向大小为5的数组的指针,

q+1将使得q右移1个单位(也就是5个int大小的数组,指针移动是以所指向的元素类型为单位进行移动)
再强制从(指向5个元素的数组的指针)转换为(指向一个int变量的指针),也就是指向a[6](虽然是溢出的),
最后*(p-1)输出a[5]=5;.
发表于 2017-07-31 21:50:06 回复(1)
第5行是
*(p-1)
不是(*p-1)
发表于 2015-09-06 10:24:31 回复(0)
#include <stdio.h>
int main()
{
   int a[5] = {1, 2, 3, 4, 5};
   int *p = (int *)(&a + 1);
   printf("%d\n", *(p - 1));
   printf("-----------------------\n");
   printf("p    = %lx\n",p);
   printf("p - 1 = %lx\n",p - 1);
   printf("&a[4]  = %lx\n",&a[4]);
   printf("a    = %lx\n",a);
   printf("&a    = %lx\n",&a);
   printf("&a + 1 = %lx\n",&a + 1);
   return 0;
}
输出结果如下:
5
-----------------------
p         = 7fff343700b4
p - 1    = 7fff343700b0
&a[4]   = 7fff343700b0
a         = 7fff343700a0
&a       = 7fff343700a0
&a + 1 = 7fff343700b4

解析:一个数组名取地址表示整个数组地址:&a。因此&a+1的步长为:5 x sizeof(int) = 20个字节。因此上述输出结果:&a = 7fff343700a0,&a + 1 = 7fff343700b4。两地址相减为0x14,转换十进制为20字节。
指针p指向&a + 1,而p的步长为int型(4个字节)。因此p  = 7fff343700b4,而p - 1 = 7fff343700b0。与&a[4]  = 7fff343700b0地址相同,因此输出结果为数组的第五个元素,结果为5。
发表于 2022-10-19 21:14:23 回复(0)
应该是*(p-1),指针的优先级高于-号的优先级,否则运行结果为随机值。亲测。
发表于 2015-09-06 10:19:20 回复(1)
&a+1,&a指向的是整个数组的地址,对&a+1指向了a[5]后的地址,后面的运算又回到a[5],所以答案是5
发表于 2024-06-25 17:16:30 回复(0)
选择c,
1. &a表示一个指向大小为5数组的指针,那么&a+1就是表示一个指向大小为5的下一个数组的指针,也就是数组a最后一个元素的下一个位置,那么int*p=(int*)(&a+1)进行强制类型转换,将指向数组的指针转换为指向第二个数组中首元素的指针,所以p-1则是指向第一个数组中最后一个元素的指针,所以输出是5
2. 若想 *(p-1) = 1;    则将 int *p = (int *) (&a + 1); 改成 int *p = (int *) (a + 1);
编辑于 2023-12-07 08:10:15 回复(0)
懂了为什么错了,是因为&a是整个数组的地址,a[0]才是首地址的地址。&a+1出了数组,*(p-1)又取回来,a的最后一个元素地址的值
发表于 2023-03-21 08:30:07 回复(0)