这题如何算出来的

来源:百度知道 编辑:UC知道 时间:2024/06/21 20:28:45
#include <iostream>
using namespace std;

int main()
{
int num[5]={1,2,3,4,5};
cout<<*((int *)(&num+1)-2)<<endl;

return 0;
}

这个题比较有意思,答案应该是输出4吧。
首先,int num[5];这句话是声明一个整形的数组,那么,num是个什么类型呢?? 可以这样理解num是一个int[5]类型的变量,这种声明方式就好比你声明一个函数指针,只能这样声明 int(*Func)(int),而不能int(*)(int)一样。
既然num相当于一个int[5]类型的变量,那么再看(&num+1)这句话的结果应该是一个地址,关键是这个地址在哪里?
再看一个例子,int *ptr = 1;ptr = ptr + 1;那么现在这个ptr所指的位置应该向后移了4个字节,也就是说 +1是指加上一个单位长度,而这个单位长度指的就是变量的类型。
现在,可以求出(&num + 1)的结果应该是num的地址在加上一个int[5]的长度,那么他现在刚好是num[4]后面的地址,姑且就叫他num[5]。注意,现在这个地址应该是存的体格int(原因是int[5]里面的每个元素都是int) 所以(&num+1)- 2的结果应该是个地址,应该是num[3].现在我们求出的结果还都是地址。(int *)(&num+1)-2),这个表达式做了强制类型转换,涵义可以这样理解:将(&num+1)-2)这个地址里面存的东西作为int类型来理解。
好了,现在剩下最后一步,在加上间址运算符*,就可以球道这个地址里面的东西了,就是num[3]。

所以最后的结果就应该是 4 。

这是我的理解,希望对你有所帮助。

guanzhu

int num[5]={1,2,3,4,5};
int占4个字节,num有5个元素,int(*)[5]共4×5=20个字节。
&num是int(*)[5]类型的,(&num+1)是num向后偏移20个字节的地址,也就是在元素5后面的那个地址。
(int *)(&num+1)把int(*)[5]类型强制转化成int *类型的了,再-2表示向前偏移2个int类型的宽度
所以,((int *)(&num+1)-2)指向了元素4的地址上了,并且类型是int *类型的
*((int *)(&num+1)-2)是取内容,所以,就是4了

&num