C | 传值调用&传址调用(进阶版)
【摘要】 【摘要】调用函数有两种方式,传值调用和传址调用,其中包含很基础很基础的细节,一定要掌握!
啊我摔倒了..有没有人扶我起来学习....
你好,我是CGod,每个人都可以5分钟编程。
欢迎来到我的主页:《CGod的后花园》
前言
调用函数有两种方式,传值调用和传址调用,其中包含很基础很基础的细节,一定要掌握!
一、传值调用
先来个简单代码测试一下:
#include<stdio.h>
int Max(int x,int y)
{
if (x > y)
return x;
else if (x < y)
return y;
}
int main()
{
int a = 10;
int b = 20;
printf("较大值是%d",Max(a, b));
return 0;
}
输出结果:
较大值是20
- 相信以上代码大家都很熟悉,目的是输出较大值。但你知道其中的原理吗?
- 以上属于传值调用,咱把实参
a
和b
的值传给了形参x
和y
,由于是传值,那么就需要额外开辟空间去存这些值。==所以传值调用时,形参相当于实参的一份拷贝==
二、传址调用
2.1 对比传值调用(一)
咱们先看看下面这段代码:
#include<stdio.h>
void Modify(int x)
{
x = 20;
}
int main()
{
int a = 10;
Modify(a);
printf("%d",a);
return 0;
}
输出结果:
- 我们的本意是给
a
重新赋值为20
的,结果输出还是10
!因为这还是属于传值调用,我们分析看看
- 发现只是改了
x
的值!因为传值调用下,x
是a
的拷贝,也有属于自己存值的空间,所以改变x
不能影响a
2.2 对比传值调用(二)
- 可以发现,某些情况下传值调用是不行的,所以需要有传址调用
修改一下
2.1
的代码:
#include<stdio.h>
void Modify(int* x)
{
*x = 20;
}
int main()
{
int a = 10;
Modify(&a);
printf("%d",a);
return 0;
}
输出结果:
-
发现成功修改了
a
的值!可是为什么呢?我们来分析分析
-
可以发现,当我们把
a
的地址传递给指针x
时,指针x
就指向了a
所在内存空间,这时修改的值就是a
的值
三、传值调用&传址调用的误区
观察以下代码:
#include<stdio.h>
void Modify(int* x)
{
*x = 20;
}
int main()
{
int a = 10;
int* p = &a;
Modify(p);
printf("%d",a);
return 0;
}
输出结果:
- 输出结果依然是相同的,这也是属于传址调用,只不过用
指针p
先接收了a
的地址再传过去。 - 但是但是!!这个传址调用是对于
a
来说的!对于指针p
来说,还是传值调用,如果试图修改指针x
的值(值是地址),那只是改变了指针x
的指向,指针p
的指向还是不会变,相当于修改指针x
的值并不能影响指针p
的值,能理解了叭? - 所以,所谓传值调用还是传址调用,要看对象是谁,就如物理课里的参考系。说到这里是因为很多铁汁涉及指针的传参的时候一时没考虑这个细节,一级指针传址调用就要使用二级指针接收了。
四、总结
- 当不需要对实参的值进行修改的时候,就可以用传值调用
- 相反,需要修改实参的值,就必须使用传址调用
- ==误区:并不是用了指针就是传址调用,要特别注意==
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)