关于指针4——值的传递

来源:本站
导读:目前正在解读《关于指针4——值的传递》的相关信息,《关于指针4——值的传递》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《关于指针4——值的传递》的详细说明。
简介:在程序设计时,有时需要传递地址,有时需要传递值。有个例子在谭浩强的书中就有明确的介绍。我们来复述一下这段代码。

在程序设计时,有时需要传递地址,有时需要传递值。有个例子在谭浩强的书中就有明确的介绍。我们来复述一下这段代码。

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)没有任何影响。

提醒:《关于指针4——值的传递》最后刷新时间 2024-03-14 01:04:28,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《关于指针4——值的传递》该内容的真实性请自行鉴别。