连生成的汇编代码都一模一样,这个是在VC6下测试的代码: 6: unsigned char i[5]={0,1,2,3,4}; 00401038 mov byte ptr [ebp-8],0 //由此可知i的地址为epb-8,我这里是一个临时数组,被分配在栈中,通过ebp变址寻址来访问 0040103C mov byte ptr [ebp-7],1 00401040 mov byte ptr [ebp-6],2 00401044 mov byte ptr [ebp-5],3 00401048 mov byte ptr [ebp-4],4 7: unsigned char * p; 8: p=(char *)(&i); 0040104C lea eax,[ebp-8] //这是取地址的代码,指针p的位置在ebp-0C处。 0040104F mov dword ptr [ebp-0Ch],eax 9: p=i; 00401052 lea ecx,[ebp-8] //不取地址,生成的代码完全一样 00401055 mov dword ptr [ebp-0Ch],ecx
另外,我改成一个函数,test2,测试的结果也是一样的,加不加&都一样。
11: unsigned char * p; 12: p=(char *)(&test2); 0040108C mov dword ptr [ebp-0Ch],offset @ILT+0(_test2) (00401005) 13: p=(char *)test2; 00401093 mov dword ptr [ebp-0Ch],offset @ILT+0(_test2) (00401005)
另外,对于指针或者数组,里面的偏移量放前面也无所谓, unsigned char i[5]={0,1,2,3,4}; unsigned char * p; p=i; 3[p]=2; //非典用法,但工作正常
|