首页 > 试题广场 >

x86_64 环境中,下面 C 程序的执行结果为() #in

[单选题]
x86_64 环境中,下面 C 程序的执行结果为()
#include <stdio.h>

int main() {

	int a[4][4] = {
		{1, 2, 3, 4},
		{50, 60, 70, 80},
		{900, 1000, 1100, 1200},
		{13000, 14000, 15000, 16000}
	};

	int( * p1)[4] = a;
	int( * p2)[4] = &a[0];
	int * p3 = &a[0][0];
	
	printf("%d,%d,%d,%d\n",
		* ( * (a + 1) - 1),
		* ( * (p1 + 3) - 2) + 1,
		* ( * (p2 - 1) + 16) + 2,
		* (p3 + sizeof(p1) - 3));
}
  • 4,1101,13002,60
  • 4,1101,13002,2
  • 编译错误
  • 运行错误
答案:4,1001,13002,2
答案解释:
假设给一个一维数组 int a[5]; 首先要明白 a 和 &a 的意思,他们地址值一样,可以理解把a理解安徽的省会合肥市,&a理解为安徽省,那么a+1的值就是安徽省里的其他市比如安庆市;&a+1理解为安徽的邻省比如江苏省,所以&a+1可能就输出一个不确定的数了。
在二维数组里也是一样,int a[4][4],a+1的话代表a[0](这是二维数组里的第一个含有4个元素的一维数组)下一个的一维数组a[1],&a+1就是一个不确定的数了;
那么分析:
1):* ( *(a + 1) - 1), *(a+1)指向a[1]这个一维数组,也即指向50,然后-1(减4个字节)就是指向上一个元素4,然后*运算就是输出4;
2):* (*(p1 + 3) - 2) + 1, p1指向的是二维数组名,所以同1)的解释输出1100+1=1101;
3):* (*(p2 - 1 ) + 16 ) + 2, p2指向的是二维数组里的第一个一维数组首元素,p2-1相当于向前移动1*16字节,然后又加上16*4个字节(注意加的字节个数),此时指向13000,然后*运算并加2,所以输出13002
4):* (p3 + sizeof(p1)  - 3 ), p1是一个指针,sizeof只会是4,p3指向的是二维数组的首元素,*运算后结果是2
发表于 2014-12-29 17:10:05 回复(0)
4   1101   13002   2
 * ( * (a + 1) - 1);  a+1指向50的地址   然后在这个地址的基础上 -1   就是4的地址 然后就是4了

* ( * (p1 + 3) - 2) + 1; 看这个int( * p1)[4] = a; 所以p1+3 指向13000的地址 然后在这个地址的基础上-2  指向1100  然后这个值+1  1101
   
* ( * (p2 - 1) + 16) + 2;   int( * p2)[4] = & a[0];  p2-1  指向距离数组为4字节的地方 然后加16 指向13000的地址 然后这个数+2  13002

* (p3 + sizeof(p1) - 3); int* p3 = & a[0][0]; p3指向 数组a的首部 sizeof(p1)=4,4-3=1,*(P3+1)相当于a[0][1]=2
发表于 2015-10-06 14:24:24 回复(0)
4,1101,13002,2
理由:数组在内存中是顺序存储的,数组的维度指示了数组指针递增的步长,处在不同的维度会有不同的步长!另外在x86_64环境下指针的长度为4字节,据此得到了上面的结果
编辑于 2015-10-06 00:21:56 回复(0)
4,1101,13002,2
数组的名称a、指针p1,指针p3都是指向数组的收地址
所以,(*(a+1)-1),其实就是数组元素a[0][3]=4;
   * ( * (p1 + 3) - 2) + 1,其实就是数组元素a[2][2]+1=1101;
       * (p3 + sizeof(p1) - 3),其实就是数组元素a[0][1]=2;
其中特别注意指针p2,它的-1操作是整个数组的地址-1,即地址移到了数组首地址
的上一个地址,所以+16就指向了元素a[3][0],所以      * ( * (p2 - 1) + 16) + 2=13002
发表于 2015-10-06 00:18:41 回复(0)

4,1101,13002,60

发表于 2015-02-06 11:42:13 回复(0)
谈一下为什么是60不是2,因为在x86_64环境下指针的长度为8字节不是4字节
发表于 2024-10-24 14:02:37 回复(0)
为什么评论区一堆选2的啊
发表于 2024-10-28 17:26:36 回复(0)