010. 理解函数参数的传递方式
在C语言中,函数参数的传递方式主要有两种:值传递(Pass by Value) 和 地址传递(Pass by Address,也称为指针传递)。理解这两种参数传递方式对于编写高效且正确的C语言程序非常重要。
1. 值传递(Pass by Value)
值传递是指在调用函数时,将实际参数的值复制一份传递给函数的形参。在函数内部对形参的修改不会影响到实际参数。
示例代码
#include <stdio.h>
// 函数定义:值传递
void increment(int x) {
x = x + 1; // 在函数内部修改形参x
printf("Inside function: x = %d\n", x);
}
int main() {
int a = 10;
printf("Before function call: a = %d\n", a);
increment(a); // 调用函数,传递a的值
printf("After function call: a = %d\n", a);
return 0;
}
输出结果
Before function call: a = 10
Inside function: x = 11
After function call: a = 10
解释
-
在调用
increment(a)
时,a
的值(10)被复制到形参x
中。 -
在函数内部,
x
被修改为11,但这不会影响到a
的值。 -
因此,函数调用后,
a
的值仍然是10。
2. 地址传递(Pass by Address)
地址传递是指在调用函数时,将实际参数的地址传递给函数的形参。在函数内部通过指针操作可以修改实际参数的值。
示例代码
#include <stdio.h>
// 函数定义:地址传递
void increment(int *x) {
(*x)++; // 通过指针修改实际参数的值
printf("Inside function: *x = %d\n", *x);
}
int main() {
int a = 10;
printf("Before function call: a = %d\n", a);
increment(&a); // 调用函数,传递a的地址
printf("After function call: a = %d\n", a);
return 0;
}
输出结果
Before function call: a = 10
Inside function: *x = 11
After function call: a = 11
解释
-
在调用
increment(&a)
时,a
的地址被传递给形参x
。 -
在函数内部,通过
(*x)++
操作,直接修改了a
的值。 -
因此,函数调用后,
a
的值被修改为11。
3. 值传递与地址传递的比较
值传递:
-
优点:简单,安全,不会修改实际参数的值。
-
缺点:如果传递的是大型结构或数组,效率较低,因为需要复制整个数据。
地址传递:
-
优点:高效,尤其是对于大型数据结构,因为只传递地址。
-
缺点:需要谨慎使用指针,否则可能导致程序错误(如野指针、内存泄漏等)。
4. 数组参数的传递
在C语言中,数组参数本质上也是通过地址传递的。当你将数组传递给函数时,实际上是传递了数组的首地址。
示例代码
#include <stdio.h>
// 函数定义:数组参数传递
void incrementArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
arr[i]++; // 直接修改数组元素
}
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
int size = sizeof(arr) / sizeof(arr[0]);
printf("Before function call: ");
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
incrementArray(arr, size); // 调用函数,传递数组
printf("After function call: ");
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
输出结果
Before function call: 1 2 3 4 5
After function call: 2 3 4 5 6
解释
-
在调用
incrementArray(arr, size)
时,数组arr
的首地址被传递给函数。 -
在函数内部,通过
arr[i]++
操作,直接修改了数组的元素。 -
因此,函数调用后,数组
arr
的值被修改。
视频讲解
BiliBili: 视睿网络-哔哩哔哩视频 (bilibili.com)