函数的指针传参和引用传参
概念: 当调用一个函数,需要将一些数据传递给函数进行处理时,C++ 提供了三种常用的参数传递方式:值传递、指针传递和引用传递。
-
值传递: 在调用函数时,将实参的值复制一份传递给形参。函数内部对形参的修改不会影响到实参的值。
-
指针传递: 在调用函数时,将实参的内存地址传递给形参。形参是一个指针变量,指向实参的内存地址。函数内部可以通过解引用指针来修改实参的值。
-
引用传递: 在调用函数时,将实参的别名传递给形参。形参是实参的一个别名,它们指向同一块内存空间。函数内部对形参的修改会直接影响到实参的值。
示例代码:
#include <iostream>
// 值传递
void swapByValue(int a, int b) {
std::cout << "值传递函数内部:交换前 a = " << a << ", b = " << b << std::endl;
int temp = a;
a = b;
b = temp;
std::cout << "值传递函数内部:交换后 a = " << a << ", b = " << b << std::endl;
}
// 指针传递
void swapByPointer(int* a, int* b) {
std::cout << "指针传递函数内部:交换前 *a = " << *a << ", *b = " << *b << std::endl;
int temp = *a;
*a = *b;
*b = temp;
std::cout << "指针传递函数内部:交换后 *a = " << *a << ", *b = " << *b << std::endl;
}
// 引用传递
void swapByReference(int& a, int& b) {
std::cout << "引用传递函数内部:交换前 a = " << a << ", b = " << b << std::endl;
int temp = a;
a = b;
b = temp;
std::cout << "引用传递函数内部:交换后 a = " << a << ", b = " << b << std::endl;
}
int main() {
int x = 10, y = 20;
std::cout << "交换前:x = " << x << ", y = " << y << std::endl;
// 值传递
swapByValue(x, y);
std::cout << "值传递后:x = " << x << ", y = " << y << std::endl;
// 指针传递
swapByPointer(&x, &y);
std::cout << "指针传递后:x = " << x << ", y = " << y << std::endl;
// 引用传递
swapByReference(x, y);
std::cout << "引用传递后:x = " << x << ", y = " << y << std::endl;
return 0;
}
讲解要点:
- 三种传参方式的区别:
| 传参方式 | 传递内容 | 是否会修改实参 | 效率 (一般情况下) | 使用场景 |
|---|---|---|---|---|
| 值传递 | 实参的值 | 否 | 低 (需要复制) | 不需要修改实参,传递简单数据类型 |
| 指针传递 | 实参的地址 | 是 | 中 | 需要修改实参,传递大型数据结构,动态内存管理 |
| 引用传递 | 实参的别名 | 是 | 高 (无需复制) | 需要修改实参,语法更简洁 |