C语言教程-C语言中的值传递和引用传递

在C语言中,有两种方法可以将数据传递给函数,分别是值传递(Call by value)和引用传递(Call by reference)。
让我们逐一了解C语言中的值传递和引用传递。
值传递(Call by value)在C中
- 在值传递方法中,实际参数的值被复制到形式参数中。换句话说,在值传递方法中,函数调用时使用的是变量的值。
- 在值传递方法中,无法通过形式参数修改实际参数的值。
- 在值传递中,实际参数和形式参数分别分配不同的内存,因为实际参数的值被复制到形式参数中。
- 实际参数是函数调用时使用的参数,而形式参数是函数定义时使用的参数。
让我们通过以下示例来理解C语言中的值传递:
#include <stdio.h>
void change(int num) {
printf("在函数内添加值之前,num=%d \n",num);
num = num + 100;
printf("在函数内添加值之后,num=%d \n", num);
}
int main() {
int x = 100;
printf("在函数调用之前,x=%d \n", x);
change(x); // 将值传递给函数
printf("在函数调用之后,x=%d \n", x);
return 0;
}
输出结果
Copy code
在函数调用之前,x=100
在函数内添加值之前,num=100
在函数内添加值之后,num=200
在函数调用之后,x=100
值传递示例:交换两个变量的值
#include <stdio.h>
void swap(int a, int b) {
int temp;
temp = a;
a = b;
b = temp;
printf("在函数中交换值之后,a = %d, b = %d\n",a,b); // 形式参数, a = 20, b = 10
}
int main() {
int a = 10;
int b = 20;
printf("在main函数中交换值之前,a = %d, b = %d\n",a,b); // 在main函数中打印a和b的值
swap(a,b);
printf("在main函数中交换值之后,a = %d, b = %d\n",a,b); // 在值传递中,通过更改形式参数来改变实际参数的值是不起作用的,a = 10, b = 20
return 0;
}
输出结果
在main函数中交换值之前,a = 10, b = 20
在函数中交换值之后,a = 20, b = 10
在main函数中交换值之后,a = 10, b = 20
引用传递(Call by reference)在C中
- 在引用传递中,将变量的地址作为实际参数传递给函数调用。
- 通过更改形式参数,可以修改实际参数的值,因为传递了实际参数的地址。
- 在引用传递中,形式参数和实际参数的内存分配是相同的。函数中的所有操作都是在实际参数的地址存储的值上执行的,并且修改后的值存储在相同的地址上。
考虑以下关于引用传递的示例:
#include <stdio.h>
void change(int *num) {
printf("在函数内添加值之前,num=%d \n",*num);
(*num) += 100;
printf("在函数内添加值之后,num=%d \n", *num);
}
int main() {
int x = 100;
printf("在函数调用之前,x=%d \n", x);
change(&x); // 将引用传递给函数
printf("在函数调用之后,x=%d \n", x);
return 0;
}
输出结果
在函数调用之前,x=100
在函数内添加值之前,num=100
在函数内添加值之后,num=200
在函数调用之后,x=200
引用传递示例:交换两个变量的值
#include <stdio.h>
void swap(int *a, int *b) {
int temp;
temp = *a;
*a = *b;
*b = temp;
printf("在函数中交换值之后,a = %d, b = %d\n",*a,*b); // 形式参数, a = 20, b = 10
}
int main() {
int a = 10;
int b = 20;
printf("在main函数中交换值之前,a = %d, b = %d\n",a,b); // 在main函数中打印a和b的值
swap(&a,&b);
printf("在main函数中交换值之后,a = %d, b = %d\n",a,b); // 在引用传递中,实际参数的值会改变,a = 10, b = 20
return 0;
}
输出结果
在main函数中交换值之前,a = 10, b = 20
在函数中交换值之后,a = 20, b = 10
在main函数中交换值之后,a = 20, b = 10
值传递和引用传递在C中的区别
No. | 值传递(Call by value) | 引用传递(Call by reference) |
---|---|---|
1 | 将值的副本传递给函数 | 将值的地址作为实际参数传递给函数 |
2 | 在函数内部进行的更改仅限于函数内部。通过更改形式参数来改变实际参数的值是不起作用的。 | 在函数内部进行的更改在函数外部也会生效。通过更改形式参数来改变实际参数的值。 |
3 | 实际参数和形式参数在不同的内存位置分配 | 实际参数和形式参数在相同的内存位置分配 |