在程序设计时,有时需要传递地址,有时需要传递值。有个例子在谭浩强的书中就有明确的介绍。我们来复述一下这段代码。
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)没有任何影响。