31-c语言值传递和地址传递
在C语言中,值传递是将实参的值复制给形参,形参的修改不会影响实参(适用于基本数据类型且无需修改原始数据);地址传递是将实参的地址传递给形参(通常通过指针实现),形参的修改会直接影响实参(适用于需要修改原始数据、处理数组或大型结构的场景)。选择方式取决于是否需要修改原始数据:值传递安全但可能有性能开销,地址传递高效但需谨慎操作指针。
在C语言中,函数参数传递主要有两种方式:值传递和地址传递。它们有着本质的区别,适用于不同的编程场景。
一、值传递
定义
值传递是指在函数调用时,将实参的值复制一份传递给形参,形参和实参占用不同的存储单元。
特点
- 单向传递:实参→形参,形参的修改不会影响实参
- 独立存储:形参和实参分别占用不同的内存空间
- 生命周期:函数调用结束后,形参的存储空间被释放
示例代码
#include <stdio.h>
void swap(int x, int y) {
int temp = x;
x = y;
y = temp;
printf("swap函数中: x=%d, y=%d\n", x, y);
}
int main() {
int a = 12, b = 24;
printf("调用前: a=%d, b=%d\n", a, b);
swap(a, b);
printf("调用后: a=%d, b=%d\n", a, b);
return 0;
}
输出结果:
调用前: a=12, b=24
swap函数中: x=24, y=12
调用后: a=12, b=24
适用场景
- 不需要修改原始数据的场景
- 传递基本数据类型(int, char等)
- 需要保护原始数据不被修改
二、地址传递
定义
地址传递是指将实参的地址传递给形参,形参接收的是实参的地址,形参和实参共享同一存储空间。
特点
- 共享内存:形参和实参指向同一内存地址
- 双向影响:函数内部对形参的修改会直接影响实参
- 指针实现:通常使用指针作为形参
示例代码
#include <stdio.h>
void swap(int *x, int *y) {
int temp = *x;
*x = *y;
*y = temp;
printf("swap函数中: *x=%d, *y=%d\n", *x, *y);
}
int main() {
int a = 12, b = 24;
printf("调用前: a=%d, b=%d\n", a, b);
swap(&a, &b);
printf("调用后: a=%d, b=%d\n", a, b);
return 0;
}
输出结果:
调用前: a=12, b=24
swap函数中: *x=24, *y=12
调用后: a=24, b=12
适用场景
- 需要修改原始数据的场景
- 处理数组(数组名本质是首地址)
- 需要返回多个值的场景
- 操作大型数据结构(避免复制)
三、关键区别对比
| 特点 | 值传递 | 地址传递 |
|---|---|---|
| 传递内容 | 实参的值 | 实参的地址 |
| 存储关系 | 不同存储单元 | 共享同一存储单元 |
| 修改影响 | 不影响实参 | 影响实参 |
| 传递方式 | 直接传递变量值 | 传递变量地址 |
| 适用数据类型 | 基本数据类型 | 数组、指针、结构体等 |
| 内存开销 | 需要复制数据,开销较大 | 仅传递地址,开销小 |
| 安全性 | 更安全,不会意外修改实参 | 需要小心,可能意外修改实参 |
四、重要注意事项
-
数组传递:在C语言中,数组名本身就是数组的首地址,所以传递数组名时实际上是地址传递。
void modifyArray(int arr[], int size) { for (int i = 0; i < size; i++) { arr[i] = i * 2; } } -
指针传递的特殊情况:
- 如果需要修改指针本身(如让指针指向新分配的内存),需要传递指针的指针(二级指针)。
void getMemory(char **p) { *p = (char *)malloc(100); } int main() { char *str = NULL; getMemory(&str); // 现在str指向了分配的内存 } -
局部变量作为返回值:
- 局部变量存储在栈区,函数返回后会被释放,不能直接返回局部变量的地址。
- 如需返回字符串,应使用静态变量或动态分配内存。
五、总结
- 值传递:适用于不需要修改原始数据的场景,安全但可能有性能开销。
- 地址传递:适用于需要修改原始数据的场景,效率高但需注意指针操作。
在实际编程中,应根据需求选择合适的传递方式。如果不需要修改原始数据,使用值传递;如果需要修改原始数据,使用地址传递(指针)。
了解这两种传递方式的区别对编写高效、安全的C语言程序至关重要,可以避免常见的指针操作错误。
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 软件从业者Hort
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果

