2025-03-06 学习记录--C/C++-C语言 函数参数传递的两种主要方法
奋斗不息每日新, 莫让此刻闲, 化作未来悔。💪🏻
C
语言 函数参数传递的两种主要方法 👑
在
C
语言中,函数参数传递有两种主要方式:值传递 和 地址传递。
一、值传递
(Pass by Value)🍭
(一)、定义 📚
- 值传递 是指将实际参数的值复制一份,传递给函数的形式参数。
- 函数内部对形式参数的修改不会影响实际参数。
(二)、特点 🐱
1、复制数据: ⭐️ ❥(^_-)
- 实际参数的值会被复制到形式参数中。
- 函数内部操作的是复制后的值,而不是原始数据。
2、不影响实际参数: ⭐️ ❥(^_-)
- 函数内部对形式参数的修改不会影响调用函数中的实际参数。
3、适用于简单数据类型: ⭐️ ❥(^_-)
- 通常用于传递基本数据类型(如
int
、float
、char
等)。
(三)、举例 🌰
#include <stdio.h>
// 值传递示例
void modifyValue(int x) {
x = x + 10; // 修改形式参数的值
printf("Inside function: x = %d\n", x);
}
int main() {
int a = 5;
modifyValue(a); // 将 a 的值传递给函数
printf("Outside function: a = %d\n", a); // a 的值不变
return 0;
}
(四)、分析 🪜
a
的值是5
,传递给modifyValue
函数后,函数内部的x
被修改为15
。- 但函数外部的
a
仍然是5
,因为值传递不会影响实际参数。
二、地址传递
(Pass by Address / Pass by Reference)🍭
(一)、定义 📚
- 地址传递 是指将实际参数的地址传递给函数的形式参数。
- 函数内部通过指针操作实际参数的值。
(二)、特点 🐱
1、传递地址: ⭐️ ❥(^_-)
- 实际参数的地址被传递给形式参数(指针)。
2、影响实际参数: ⭐️ ❥(^_-)
- 函数内部通过指针可以直接修改实际参数的值。
3、适用于复杂数据类型: ⭐️ ❥(^_-)
- 通常用于传递数组、结构体或需要修改实际参数的情况。
(三)、举例 🌰
#include <stdio.h>
// 地址传递示例
void modifyValueByAddress(int *x) {
*x = *x + 10; // 通过指针修改实际参数的值
printf("Inside function: *x = %d\n", *x);
}
int main() {
int a = 5;
modifyValueByAddress(&a); // 将 a 的地址传递给函数
printf("Outside function: a = %d\n", a); // a 的值被修改
return 0;
}
(四)、分析 🪜
a
的地址传递给modifyValueByAddress
函数,函数内部通过指针修改了a
的值。- 函数外部的
a
也被修改为15
,因为地址传递会影响实际参数。
三、值传递 vs 地址传递 🍭
特性 | 值传递 | 地址传递 |
---|---|---|
传递内容 | 实际参数的值 | 实际参数的地址 |
函数内部操作 | 操作的是复制后的值 | 操作的是实际参数的值 |
是否影响实际参数 | 不影响 | 影响 |
适用场景 | 基本数据类型(int 、float 等) | 数组、结构体、需要修改实际参数 |
性能 | 复制数据,可能消耗较多内存 | 传递地址,效率更高 |
1、实际应用场景 🌈
(1)值传递 🦋
- 当函数不需要修改实际参数时,使用值传递。
- 例如 🌰,计算两个数的和:👇🏻
int add(int a, int b) {
return a + b;
}
(2)地址传递 🦋
- 当函数需要修改实际参数时,使用地址传递。
- 例如 🌰,交换两个数的值:👇🏻
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
四、总结 🍭
- 值传递 🎀:传递的是实际参数的值,函数内部操作的是复制后的值,不影响实际参数。
- 地址传递 🎀:传递的是实际参数的地址,函数内部通过指针操作实际参数的值,会影响实际参数。
- 在实际编程中,根据需求选择合适的传递方式:👇🏻
- 如果函数不需要修改实际参数,使用值传递。
- 如果函数需要修改实际参数,使用地址传递。