【C语言函数调用详解】——传值调用&传址调用

简介: 【C语言函数调用详解】——传值调用&传址调用

我们已经知道了如何调用一个函数,如何传参(分为实参和形参),知道了形参实例化之后是实参的一份临时拷贝。


但是,函数的调用又分为两种方式,传值调用和传址调用,接下来我们就一起来学习一下什么是传值调用,什么是传址调用!!!


一.传值调用

什么是传值调用呢?顾名思义,传值调用就是直接将实参的值传递给形参。


这样形参和实参的值是一样的,但是函数的形参和实参分别占有不同的内存块,实参是一个独立的个体,形参也是一个独立的个体,只是形参的值与实参相同。

但实际两者之间并没有建立起真正的联系,对形参的修改不会影响实参。


来举个例子:

我们来写一个函数交换两个变量的内容:

#include <stdio.h>
//实现成函数,但是不能完成任务
void Swap1(int x, int y) {
  int tmp = 0;
  tmp = x;
  x = y;
  y = tmp;
}
int main()
{
  int num1 = 1;
  int num2 = 2;
  Swap1(num1, num2);
  printf("Swap1::num1 = %d num2 = %d\n", num1, num2);
  return 0;
}

我们来简单分析一下这段代码:

6243e76d46cb43f4b9fc9056af69b4b2.png

根据我们的分析,传值调用好像不能达到交换num1,num2的目的,我们看看结果是什么样的:

165a4252b81c40ae8f871768cc71c5d5.png

因此,传值调用,要想在函数内部交换两个变量的值,是不可行的。

那要怎么做呢?这里就需要传址调用。


🐵二.传址调用

那什么是传址调用呢?这里的“址”指的是地址。

传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。


这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。


那现在我们用传址调用的方法对上面的函数重新进行实现:

#include <stdio.h>
//正确的版本
void Swap2(int* px, int* py) {
  int tmp = 0;
  tmp = *px;
  *px = *py;
  *py = tmp;
}
int main()
{
  int num1 = 1;
  int num2 = 2;
  Swap2(&num1, &num2);
  printf("Swap2::num1 = %d num2 = %d\n", num1, num2);
  return 0;
}

对代码进行一下分析:

cfef038ef7e248639be3d43d56116324.png

这次我们再来看看结果:

ac3c019fb0b645ef994887234e013486.png

所以,传址调用可以让实参和形参建立起真正的联系。

以上就是对函数调用的两种方式,传值调用和传址调用的介绍,欢迎大家指正,我们一起进步!!!

目录
相关文章
|
C语言
C语言进阶教程(传值调用和传址调用的区别)
C语言进阶教程(传值调用和传址调用的区别)
608 0
|
编译器 C语言
C语言中的按值调用(Call by Value)技术详解
C语言中的按值调用(Call by Value)技术详解
401 0
|
存储 安全 编译器
C语言详解指针(指针海洋的探索,将传值与传址刻在心里)
C语言详解指针(指针海洋的探索,将传值与传址刻在心里)
214 0
|
C语言
【C语言】指针进阶之传值调用与传址调用
【C语言】指针进阶之传值调用与传址调用
|
C语言
C语言结构体传值和传址及内存使用
C语言结构体传值和传址及内存使用
228 0
|
C语言
C语言 传址调用、二级指针做参数
空间的操作有两种: 名字,地址。如果传名字不行,传地址一定可以。 如果使用变量改变函数外部的参数时,要定义全局变量,如果使用局部变量的话,并不能实现该功能。例如:(不能实现改变外部变量的值)
340 0
C语言 传址调用、二级指针做参数
|
C语言
C语言结构体传值和传址及内存使用
C语言结构体传值和传址及内存使用
323 0
C语言结构体传值和传址及内存使用
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
1085 23
|
安全 C语言
C语言中的字符、字符串及内存操作函数详细讲解
通过这些函数的正确使用,可以有效管理字符串和内存操作,它们是C语言编程中不可或缺的工具。
646 15
|
存储 C语言
`scanf`是C语言中用于按格式读取标准输入的函数
`scanf`是C语言中用于按格式读取标准输入的函数,通过格式字符串解析输入并存入指定变量。需注意输入格式严格匹配,并建议检查返回值以确保读取成功,提升程序健壮性。
1706 0