在C语言中,有如下的写法:int a = 5; int *pa; pa = &(a + 1);

问题描述:

在C语言中,有如下的写法:int a = 5; int *pa; pa = &(a + 1);
不对的话,请说明理由!
1个回答 分类:综合 2014-10-06

问题解答:

我来补答
pa = &(a+1)这一句不对.
a是一个变量,a+1是一个数值,无法再通过在前面加“&”获得一个地址.有的编译器可以用&(int )(a+1)的方式强制获得一个地址,但结果不确定,属于极危险的操作.
再问: 我对内存不太懂,还有个问题。a+1是个数值,可是在计算机中它不也应该存放吗?它存放的地方没地址吗?
再答: a是有地址的,但a+1的值,在编译的时候还不存在,只有在代码执行时才会计算出结果,并且如果a+1的计算结果没有通过形如 b=a+1这样的语句储存到变量b的话,只是临时存放在寄存器中(其实前提还是要有xxx=a+1这样的语句,a+1的结果才有机会放进寄存器)。既然只是临时放入寄存器,就无法通过在前面加&来获取地址了。 如果没有特殊目的,把变量加上一个常数再赋值给一个指针,这种情况极少,而且这种语句即危险又导致代码可读性很差,不提倡采用这种方法和这种思路编程。
再问: 灰常感谢您的回答,您说得很清楚。你真是厉害,希望以后可以多多向您请教!
再答: 看这段代码的反汇编,你就明白为什么a+1没有地址了。 b=a+1; //执行b=a+1时 004113D2 mov eax,dword ptr [a] //先把a的值放进寄存器exa(ptr [a]是指向变量a的地址) 004113D5 add eax,1 //然后将eax的值加1(这个时间eax的值就是a+1的值) 004113D8 mov dword ptr [b],eax //然后将eax的值(或者说是a+1的值)转移给变量b //整个过程中a+1的结果只在寄存器里存在过,然后就转移给b int main() { int a=2; int b=0; int *p; p=&b; b=a+1; return 0; } int main() { 004113A0 push ebp 004113A1 mov ebp,esp 004113A3 sub esp,0E4h 004113A9 push ebx 004113AA push esi 004113AB push edi 004113AC lea edi,[ebp-0E4h] 004113B2 mov ecx,39h 004113B7 mov eax,0CCCCCCCCh 004113BC rep stos dword ptr es:[edi] int a=2; 004113BE mov dword ptr [a],2 int b=0; 004113C5 mov dword ptr [b],0 int *p; p=&b; 004113CC lea eax,[b] 004113CF mov dword ptr [p],eax b=a+1; 004113D2 mov eax,dword ptr [a] 004113D5 add eax,1 004113D8 mov dword ptr [b],eax return 0; 004113DB xor eax,eax }
 
 
展开全文阅读
剩余:2000