C 传值调用&传址调用(进阶版)

#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

  • 相信以上代码大家都很熟悉,目的是输出较大值。但你知道其中的原理吗?
  • 以上属于传值调用,咱把实参ab的值传给了形参xy,由于是传值,那么就需要额外开辟空间去存这些值。所以传值调用时,形参相当于实参的一份拷贝
    在这里插入图片描述

二、传址调用

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的值!因为传值调用下,xa的拷贝,也有属于自己存值的空间,所以改变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;


![img](https://img-blog.csdnimg.cn/img_convert/f7fe040610293ba73d7690f63ecebd6b.png)
![img](https://img-blog.csdnimg.cn/img_convert/4e71d967cb9a365b1101cafcc4eef5f1.png)
![img](https://img-blog.csdnimg.cn/img_convert/bb419a3ead0871bdcd419fa82253a525.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

]
[外链图片转存中...(img-aEaAxfZP-1725771001881)]
[外链图片转存中...(img-wW7TNzMw-1725771001881)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值