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

简介: 调用函数有两种方式,传值调用和传址调用,其中包含很基础很基础的细节,一定要掌握!

在这里插入图片描述
啊我摔倒了..有没有人扶我起来学习....


@TOC


前言

调用函数有两种方式,传值调用和传址调用,其中包含很基础很基础的细节,一定要掌握!


一、传值调用

先来个简单代码测试一下:
#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;
}
输出结果: 在这里插入图片描述
  • 输出结果依然是相同的,这也是属于传址调用,只不过用指针p先接收了a的地址再传过去。
  • 但是但是!!这个传址调用是对于a来说的!对于指针p来说,还是传值调用,如果试图修改指针x的值(值是地址),那只是改变了指针x的指向,指针p的指向还是不会变,相当于修改指针x的值并不能影响指针p的值,能理解了叭?
  • 所以,所谓传值调用还是传址调用,要看对象是谁,就如物理课里的参考系。说到这里是因为很多铁汁涉及指针的传参的时候一时没考虑这个细节,一级指针传址调用就要使用二级指针接收了。

四、总结

  • 当不需要对实参的值进行修改的时候,就可以用传值调用
  • 相反,需要修改实参的值,就必须使用传址调用
  • ==误区:并不是用了指针就是传址调用,要特别注意==

在这里插入图片描述

相关文章
|
5月前
|
安全 C++ 开发者
C++一分钟之-函数参数传递:值传递与引用传递
【6月更文挑战第19天】C++中函数参数传递涉及值传递和引用传递。值传递传递实参副本,安全但可能效率低,适合不变对象;引用传递传递实参引用,允许修改,用于高效修改或返回多值。值传递示例显示交换不生效,而引用传递示例实现交换。常量引用则防止意外修改。选择传递方式需考虑效率与安全性。
48 2
|
C语言
C语言进阶教程(传值调用和传址调用的区别)
C语言进阶教程(传值调用和传址调用的区别)
117 0
|
C++ Python
Python函数参数传递:传值还是传引用
Python函数参数传递:传值还是传引用
60 0
|
6月前
|
C语言
【C语言】指针进阶之传值调用与传址调用
【C语言】指针进阶之传值调用与传址调用
我应该使用按值调用还是按引用调用?
我应该使用按值调用还是按引用调用?
|
6月前
传址与传值
传址与传值
33 0
|
11月前
传值调用与传址调用
传值调用与传址调用
68 0
|
C语言
C语言 传址调用、二级指针做参数
空间的操作有两种: 名字,地址。如果传名字不行,传地址一定可以。 如果使用变量改变函数外部的参数时,要定义全局变量,如果使用局部变量的话,并不能实现该功能。例如:(不能实现改变外部变量的值)
112 0
C语言 传址调用、二级指针做参数
|
编译器
【为什么】将指针传递给函数
【为什么】将指针传递给函数
|
C语言
【C语言函数调用详解】——传值调用&传址调用
【C语言函数调用详解】——传值调用&传址调用
422 0