求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Model Center   Code  
会员   
要资料
 
 

C语言教程
C语言历史
C语言特点
C语言VS开发环境安装
C语言第一个程序
C语言程序执行流程
C语言printf()和scanf()函数
C语言变量
C语言数据类型
C语言关键字
C语言运算符
C语言注释
C语言转义序列
C语言常量
C语言控制语句
C语言if-else语句
C语言switch语句
C语言循环
C语言do-while循环
C语言while循环
C语言for循环
C语言break语句
C语言continue语句
C语言goto语句
C语言类型转换
C语言函数
C语言函数
C语言通过值和引用函数
C语言递归
C语言存储分类
C语言数组
C语言数组
C语言二维数组
C语言将数组传递给函数
C语言指针
C语言指针
C语言指针的指针
C语言指针算术运算
C语言字符串
C语言字符串
C语言gets()和puts()函数
C语言字符串函数
C语言strlen()函数
C语言strcpy()函数
C语言strcat()函数
C语言strcmp()函数
C语言strrev()函数
C语言strlwr()函数
C语言strupr()函数
结构联合体
C语言结构体
C语言结构体数组
C语言结构体嵌套
C语言联合体
文件处理
C语言文件处理
C语言fprintf()和fscanf()函数
C语言fputc()和fgetc()函数
C语言fputs()和fgets()函数
C语言fseek()函数
C语言rewind()函数
C语言ftell()函数
预处理器
C语言预处理器指令
C语言宏
C语言#include指令
C语言#define指令
C语言#undef指令
C语言#ifdef指令
C语言#ifndef指令
C语言#if指令
C语言#error指令
C语言#pragma指令
其它杂项
C语言数学函数
C语言命令行参数
 
 

C语言通过值和引用函数
904 次浏览
5次  

将参数值或数据传递给C语言函数有两种方法:通过值调用和通过引用调用。原始值在通过值调用时不修改,但通过引用调用时,在函数中可进行修改。

下面将分别讲解如何通过值调用和通过引用调用,并用使用示例逐个调用演示执行。

通过值调用

在通过值调用函数时,原始值不被修改。

在通过值调用时,传递给函数的值由函数参数在堆栈内存位置中本地存储。如果更改函数参数的值,则仅对当前调用函数中的值进行临时更改。它不会改变调用者方法(如:main())中的变量的值。即:函数只是使用参数值的一个副本,函数执行完成副本删除,而原始值不会有任何影响。

我们试着通过下面的例子来了解C语言中的通过值调用的概念,首先创建一个工程:function-call-by-value-reference,并在这个工程下创建一个源文件:call-by-value.c,其代码如下所示-

#include <stdio.h>
void change(int num) {
printf("Before adding value inside function num=%d \n", num);
num = num + 10;
printf("After adding value inside function num=%d \n", num);
}
int main() {
int x = 10;
// 更新之前参数x的值
printf("Before function call x=%d \n", x);
change(x); // passing value in function
// 更新之后参数x的值
printf("After function call x=%d \n", x);
return 0;
}

 

执行上面示例代码,得到以下结果 -

Before function call x=10
Before adding value inside function num=10
After adding value inside function num=20
After function call x=10

通过引用调用

在通过引用的调用中,原始值可被修改并反映到外部调用者。

这里,使用值的地址传递到函数中,所以实际和形式的参数共享相同的地址空间。 因此,函数内部的值被改变,都会反映在函数内部和外部,因为函数内部和外部此时都指向参数的地址空间。

注意:要了解通过引用调用,您必须具有指针的基本知识。

让我们通过下面的例子来尝试理解C语言中通过引用调用的概念,创建一个源文件:call-by-reference.c,其代码如下所示-

#include <stdio.h>
// 定义函数,注意这里的参数名称前加了一个星号(*)
void change2(int *num) {
printf("Before adding value inside function num=%d \n", *num);
(*num) += 100;
printf("After adding value inside function num=%d \n", *num);
}
int main() {
int x = 200;
printf("Before function call x=%d \n", x);
// 注意,下面传递的参数名称前加了一个符号(&)
change2(&x);// passing reference in function
printf("After function call x=%d \n", x);
return 0;
}

执行上面示例代码,得到以下结果 -

Before function call x=200
Before adding value inside function num=200
After adding value inside function num=300
After function call x=300

C语言中通过值调用和通过引用调用之间的差异

通过值调用 通过引用调用
将值的副本传递给函数 将值的地址传递给函数
函数内的更改不会反映在函数外 函数内部的改变也反映在函数的外部
将在不同的内存位置创建实际和正式的参数
将在相同的内存位置创建实际和正式的参数

 

 


您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码: 验证码,看不清楚?请点击刷新验证码 必填



904 次浏览
5次
 捐助