在程序设计时,有时需要传递地址,有时需要传递值。有个例子在谭浩强的书中就有明确的介绍。我们来复述一下这段代码。
void swap(unsigned char a, unsigned char b)
{
unsigned char c;
c=a;
a=b;
b=c;
}
int main(void)
{
unsigned char x,y;
x=100;
y=200;
swap(x,y);
return 0;
}
谭老师明确指出过swap( )函数不会实现x,yde值的交换。因为整个过程是值的传递,将x、y的值传递给a,b变量。但是a、b是局部变量。在swap( )执行结束后a、b变量的作用域结束,被销毁。不在存在。
其实我们也可以通过编译器,编译结果来分析,为什么没有实现x、y两个变量的交换。我们来备注一个程序执行过程。
13: int main(void)
14: {
15: volatile unsigned char x,y;
16:
17: x=100;
C:0x0003 750864 MOV 0x08,#0x64 //立即数100移入0x08地址,
18: y=200;
19:
C:0x0006 7509C8 MOV 0x09,#T2CON(0xC8) //立即数200移入0x09地址,
20: swap(x,y);
21:
C:0x0009 AD09 MOV R5,0x09 //0x08地址的内容移入R5
C:0x000B AF08 MOV R7,0x08 //0x08地址的内容移入R7
C:0x000D 120014 LCALL swap(C:0014) //调用swap函数
22: return 0;
24: }
3: void swap(volatile unsigned char a, volatile unsigned char b)
C:0x0014 8F0A MOV 0x0A,R7 //R7寄存器的内容(y的值200)移入0x0A地址
C:0x0016 8D0B MOV 0x0B,R5 //R5寄存器的内容(x的值100)移入0x0B地址
4: {
5:
6: volatile unsigned char c;
7:
8: c=a;
C:0x0018 850A0C MOV 0x0C,0x0A //0x0A地址的内容(y的值200)移入0x0C地址
9: a=b;
C:0x001B 850B0A MOV 0x0A,0x0B//0x0B地址的内容(x的值200)移入0x0A地址
10: b=c;
C:0x001E 850C0B MOV 0x0B,0x0C//0x0C地址的内容(y的值200)移入0x0B地址
11: }
C:0x0021 22 RET
通过浏览以上代码,我们可以发现,在swap函数开始执行之前, x的值存入R5寄存器中,y的值存入R7中。
swap( )函数通过R5、R7接收了x、y的值,并且将其存入0x0A、0X0B地址中。函数结束。
x、y对应的地址0x08、0x09中的值并没有发生变化。但是a,b确实接收到了,但是对a、b的地址是0x0A和0X0B,对这两个地址中数据任何操作对0X08(x)、0x09(y)没有任何影响。