问题:
int main(int argc, char* argv[])
{int a[4]={1,2,3,4};
int *ptr1=(int*)(&a+1);
int *ptr2=(int*)((int)a+1);
printf("%x,%x",ptr1[-1],*ptr2);
return 0;
}
程序运行的结果是:4,2000000
解答:
a指向的是数组第一个元素的地址,指向的是一个int型
&a指向的是整个数组,指向的是一个int [4]型
所以&a+1就是a[3]的下一个元素。
感想:
学习用反汇编也会有很大帮助。
利用工作时间学习汇编,再将这个问题从汇编角度弄懂。
汇编:
int a[4]={1,2,3,4};
00F413BE mov dword ptr [a],1
00F413C5 mov dword ptr [ebp-10h],2
00F413CC mov dword ptr [ebp-0Ch],3
00F413D3 mov dword ptr [ebp-8],4
int *ptr1=(int*)(&a+1);
00F413DA lea eax,[ebp-4]
00F413DD mov dword ptr [ptr1],eax