万箭穿心演员陈刚:解析“一道考遍东北三省和青岛没有一人做出来的简单题目 ”

来源:百度文库 编辑:偶看新闻 时间:2024/05/10 06:10:19

CSDN上有人出了这么个题目,原帖如下:

 

我们公司要在学校招一批应届毕业生,我被任命出软件笔试题和面试主考官,由于我们公司是一家以硬件为主的公司,即便是招软件人员,也最好是软硬结合的,在此前提下,我出了下面一道简单的C语言题目,主要考查考生对C语言指针和内存布局的了解。 

下面的C代码在VC++6.0下的运行结果是什么?请详细说明原因。 
#include   
int main() 

int a[5]={1,2,3,4,5}; 
int *ptr1=(int *)(&a+1); 
int *ptr2=(int *)((int )a+1); 
printf("%x,%x",ptr1[-1],*ptr2); 
return 0; 


结果出乎我们的意料,全部答对的没有一个人,有3-5个人ptr1[-1]回答对了。到底我的题目出得太难还是现在的学生确实太差了?我认为这是一道很容易的题,我把它放在试卷的第一题,作为送分的,结果却让我大跌眼镜。当然还有一个原因,我们公司虽然在学电子、单片机的学生中大受追捧,但是计算机专业的学生却对它了解不够,所以很多计算机专业的高手没有过来参加笔试。 

 

 

---------------------------------------------这道题比较有意思,拿来解析下,我的是在PC+Dev C++下面操作:

 

先看a[5]={1,2,3,4,5}; 在内存中分布  

big endian(motorola处理器)

00 00 00 01      00 00 00 02   00 00 00 03       00 00 00 04   00 00 00 05

little endian  (intel处理器)

01 00 00 00      02 00 00 00   03 00 00 00      04 00 00 00   05 00 00 00

(&a+1)中的&a取得是整个数组的首地址,&是对整个数组操作的,所以(&a+1)即ptr1指向了a[4]后面的内存区,ptr1[-1]指针后退一步,指向a[4]输出为5

 

(int )a+1);把地址强制转化为一整型变量,地址加1,此时指针指向00 00 00 02

 

所以最后的输出是5,2000000