分享

C|从形参与实参的内存地址区别值传递与址传递

 昵称11935121 2018-03-01

1 值传递

函数调用时,为函数的形参分配地址。

同样的,实参也要分配地址,当然与形参的地址不同。

实质就是传值时,实参只是简单把自己的值赋值给形参,形参与实参之间没有关系;

//传数值不会改变原来值的例子。

#include

void swap(int, int); //函数参数采用传数值方式

void main()

{

int a=585, b=696;

swap(a, b); //传数值

printf('In main: a=%d, b=%d\n', a, b); //返回主函数后

printf('In main: a=%#p, b=%#p\n', &a, &b); //返回主函数后

system('pause');

}

//将变量作为参数,以传数值方式传递参数

void swap(int a, int b)

{

int temp=a;

a=b;

b=temp;

printf('In swap: a=%d, b=%d\n', a, b); //在被调函数里

printf('In swap: a=%#p, b=%#p\n', &a, &b); //返回主函数后

}

运行结果:

In swap: a=696, b=585

In swap: a=0X0012FEEC, b=0X0012FEF0

In main: a=585, b=696

In main: a=0X0012FF44, b=0X0012FF40

2 址传递

在传递地址时,系统为指针变量分配地址,指针变量存储的是指向实参的存储地址,所以在被调函数中若改变形参的值,也就改变了原来变量的数值。

传址时,实参的把自己的地址传址给形参,在实参与形参之间通过指针指向建立了逻辑关系。

//传递指针改变实参值的例子。

#include

void swap(int*, int*); //函数参数采用传地址值的方式

void main()

{

int a=585, b=696;

printf('&a=%#p\t &b=%#p\n', &a, &b); //实参地址

swap(&a, &b); //传地址值

printf('返回后数据:a=%d, b=%d\n',a, b);

}

void swap(int *p, int *t)

{

int temp;

printf('&p=%#p\t &t=%#p\n', &p, &t); //指针地址

printf(' p=%#p\t t=%#p\n', p, t); //形参地址

temp=*p; //交换两个变量的值

*p=*t;

*t=temp;

printf('交换数据为:a=%d, b=%d\n', *p,*t);

}

运行结果:

&a=0X0012FF44 &b=0X0012FF40

&p=0X0012FEEC &t=0X0012FEF0

p=0X0012FF44 t=0X0012FF40

交换数据为:a=696, b=585

返回后数据:a=696, b=585

-End-

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多