深信服科技的笔试题
问:以下程序的运行结果是多少?
#include <iostream>
using namespace std;
int main()
{
int num[5]={1,2,3,4,5};
cout<<*((int *)(&num+1)-2)<<endl;
return 0;
}
一开始,我觉得num是个常量整型指针,那么&num就是个二级指针,那么对二级指针的加减操作会使得指针指向未知的位置,所以结果应该是一个无意义的数字
可运行后发现是4!于是输入以下实验代码
#include <iostream>
using namespace std;
int main()
{
int num[5]={1,2,3,4,5};
cout << *( (int *)(&num+1) - 2 ) << endl;
printf("num代表的地址:%d/n", num);
printf("num[1]代表的地址:%d/n", &num[1]);
printf("&num+1代表的地址:%d/n", &num+1);
return 0;
}
终于发现原来&num确实是二级指针,并且由于num指向一维数组,所以&num指向一个二维数组!
&num+1就指向二维数组的第二行,所以转型(将int **转为int *)后就相当于指向num[4]后的第一个位置,所以再减2就指向num[3],即4!