指针与函数参数传递详解 —— 值传递与地址传递的区别及应用
资料合集下载链接:
https://pan.quark.cn/s/472bbdfcd014
在C语言中,函数参数的传递方式主要有两种:值传递和地址传递(通过指针)。理解两者的区别及应用对于正确操作数据和优化程序逻辑至关重要。本文将通过详细代码示例,帮助你彻底理解这两种传递方式,并演示如何利用指针实现对实参的修改,比如实现两个数的交换。
一、值传递(传值调用)
原理
函数接收的是实参的拷贝,函数内部对形参的操作不会影响到实参。
示例代码
#include <stdio.h>// 交换两个数(值传递)
void swap_by_value(int x, int y) {int temp = x;x = y;y = temp;printf("Inside swap_by_value: x = %d, y = %d\n", x, y);
}int main() {int a = 10, b = 20;printf("Before swap_by_value: a = %d, b = %d\n", a, b);swap_by_value(a, b);printf("After swap_by_value: a = %d, b = %d\n", a, b);return 0;
}
运行结果说明
Before swap_by_value: a = 10, b = 20
Inside swap_by_value: x = 20, y = 10
After swap_by_value: a = 10, b = 20
- 函数内部
x
和y
的值被交换了,但实参a
和b
的值没有发生变化。 - 因为传入的是实参的拷贝,函数修改的是副本,不影响原变量。
二、地址传递(指针传递)
原理
函数接收的是实参变量的地址,通过指针可以间接修改实参的值。
示例代码
#include <stdio.h>// 交换两个数(指针传递)
void swap_by_pointer(int *x, int *y) {int temp = *x;*x = *y;*y = temp;printf("Inside swap_by_pointer: *x = %d, *y = %d\n", *x, *y);
}int main() {int a = 10, b = 20;printf("Before swap_by_pointer: a = %d, b = %d\n", a, b);swap_by_pointer(&a, &b);printf("After swap_by_pointer: a = %d, b = %d\n", a, b);return 0;
}
运行结果说明
Before swap_by_pointer: a = 10, b = 20
Inside swap_by_pointer: *x = 20, *y = 10
After swap_by_pointer: a = 20, b = 10
- 函数接收了实参
a
和b
的地址,利用指针间接修改了实参的值。 - 实参
a
和b
的值被真正交换。
三、总结对比
传递方式 | 形参类型 | 实参是否改变 | 优缺点 |
值传递 | 基本变量(拷贝) | 不改变 | 简单安全,但无法修改实参 |
地址传递 | 指针(地址) | 会改变 | 可修改实参,灵活但需注意指针安全 |
四、完整代码示例
#include <stdio.h>// 交换两个整数,值传递版
void swap_by_value(int x, int y) {int temp = x;x = y;y = temp;printf("Inside swap_by_value: x = %d, y = %d\n", x, y);
}// 交换两个整数,指针传递版
void swap_by_pointer(int *x, int *y) {int temp = *x;*x = *y;*y = temp;printf("Inside swap_by_pointer: *x = %d, *y = %d\n", *x, *y);
}int main() {int a = 10, b = 20;printf("---- 值传递示例 ----\n");printf("Before swap_by_value: a = %d, b = %d\n", a, b);swap_by_value(a, b);printf("After swap_by_value: a = %d, b = %d\n", a, b);printf("\n---- 地址传递示例 ----\n");printf("Before swap_by_pointer: a = %d, b = %d\n", a, b);swap_by_pointer(&a, &b);printf("After swap_by_pointer: a = %d, b = %d\n", a, b);return 0;
}
五、指针传递的其他应用场景
- 修改数组元素
- 动态内存管理(malloc/free)
- 传递结构体指针以减少内存开销
- 实现函数返回多个值(通过指针参数)