C语言 传地址一定会改变主函数中变量的值吗?



我们都知道在函数调用中,参数传递的方式有传值和传地址之分,如果主函数传递给子函数参数时采用传地址的方式,主函数的变量值一定会变化吗?请先看下面的程序:

程序1

#include<stdio.h>

void swap(int *x,int *y)

{

int t;

t=*x;

*x=*y;

*y=t;

}

扫描二维码关注公众号,回复: 1780308 查看本文章

int main(void)

{

int a=10,b=20;

swap(&a,&b);

printf("a=%d,b=%d\n",a,b);

return 0;

}

程序2


#include<stdio.h>

void swap(int *x,int *y)

{

int *t;

t=x;

x=y;

y=t;

}

int main(void)

{

int a=10,b=20;

swap(&a,&b);

printf("a=%d,b=%d\n",a,b);

return 0;

}

以上两个程序是不是都会改变主函数中a和b两个变量的值,并输出a=20,b=10呢?


接下来,分析一下两个程序:


关于怎么快速学C/C++,可以加下小编的C/C++学习群:341+636+727,不管你是小白还是大牛,小编我都欢迎,不定期分享干货,欢迎初学和进阶中的小伙伴。

每天晚上20:00都会开直播给大家分享C/C++游戏编程学习知识和路线方法,群里会不定期更新最新的教程和学习方法,最后祝所有程序员都能够走上人生巅峰,让代码将梦想照进现实


先分析程序1,在交换语句执行前的状况如图1所示:

(图1)

交换的内容是*x和*y,实际交换的内容是变量a和b的值,交换语句执行后的状况如图2:

(图2)

所以,在主程序中输出的内容是a=20,b=10。

接下来看看程序2,由于传递参数的方式与程序1完全一样,所以交换语句执行前的状态与程序1中交换语句执行前的状况一样,如图1所示。

但是,程序2中交换的内容是x和y,也就是这两个变量内所存储的地址值,所以交换语句执行后的结果如图3所示:

(图3)

程序2中变量a和b的值并没有改变,输出的结果为a=10,b=20。

所以程序1中变量a和b的值发生了交换,程序2中变量a和b的值没有交换,你的想法与我的一样吗?

我们都知道在函数调用中,参数传递的方式有传值和传地址之分,如果主函数传递给子函数参数时采用传地址的方式,主函数的变量值一定会变化吗?请先看下面的程序:

程序1

#include<stdio.h>

void swap(int *x,int *y)

{

int t;

t=*x;

*x=*y;

*y=t;

}

int main(void)

{

int a=10,b=20;

swap(&a,&b);

printf("a=%d,b=%d\n",a,b);

return 0;

}

程序2


#include<stdio.h>

void swap(int *x,int *y)

{

int *t;

t=x;

x=y;

y=t;

}

int main(void)

{

int a=10,b=20;

swap(&a,&b);

printf("a=%d,b=%d\n",a,b);

return 0;

}

以上两个程序是不是都会改变主函数中a和b两个变量的值,并输出a=20,b=10呢?


接下来,分析一下两个程序:


关于怎么快速学C/C++,可以加下小编的C/C++学习群:341+636+727,不管你是小白还是大牛,小编我都欢迎,不定期分享干货,欢迎初学和进阶中的小伙伴。

每天晚上20:00都会开直播给大家分享C/C++游戏编程学习知识和路线方法,群里会不定期更新最新的教程和学习方法,最后祝所有程序员都能够走上人生巅峰,让代码将梦想照进现实


先分析程序1,在交换语句执行前的状况如图1所示:

(图1)

交换的内容是*x和*y,实际交换的内容是变量a和b的值,交换语句执行后的状况如图2:

(图2)

所以,在主程序中输出的内容是a=20,b=10。

接下来看看程序2,由于传递参数的方式与程序1完全一样,所以交换语句执行前的状态与程序1中交换语句执行前的状况一样,如图1所示。

但是,程序2中交换的内容是x和y,也就是这两个变量内所存储的地址值,所以交换语句执行后的结果如图3所示:

(图3)

程序2中变量a和b的值并没有改变,输出的结果为a=10,b=20。

所以程序1中变量a和b的值发生了交换,程序2中变量a和b的值没有交换,你的想法与我的一样吗?

猜你喜欢

转载自blog.csdn.net/chengxuyuan997/article/details/80809727
今日推荐