C++ 引用传参机制
很好,接下来我将为你扩展这两个代码版本(指针传参和引用传参),分别打印出:
- 变量本身的地址和值
- 参数类型名称(用
typeid
) - 指针或引用的地址和值
- 解引用后的值(对指针)
- 全部带详细中文注释
✅ 一、指针版本(int*
)
#include <iostream>
#include <typeinfo> // 用于 typeid
using namespace std;// 接收一个 int 型指针
void func(int* a) {cout << "\n[函数 func - 指针传参]" << endl;// 打印 a 的类型cout << "类型(typeid(a)):" << typeid(a).name() << endl;// a 是一个指针,打印它自己的值(指向谁)和地址(自己的地址)cout << "a 的值(即指向对象的地址): " << a << endl;cout << "a 本身的地址(指针变量的地址): " << &a << endl;// 解引用 a,打印 a 所指对象的值cout << "*a(解引用,访问 x 的值): " << *a << endl;
}int main() {int x = 42; // 普通整型变量cout << "[主函数 main]" << endl;cout << "x 的值: " << x << endl;cout << "x 的地址: " << &x << endl;func(&x); // 传入 x 的地址return 0;
}
✅ 二、引用版本(int&
)
#include <iostream>
#include <typeinfo>
using namespace std;// 接收一个 int 类型的引用
void func(int& a) {cout << "\n[函数 func - 引用传参]" << endl;// 打印 a 的类型cout << "类型(typeid(a)):" << typeid(a).name() << endl;// a 是 x 的别名,打印它的值和地址cout << "a 的值: " << a << endl;cout << "a 的地址(即 x 的地址): " << &a << endl;// 注意:不能对引用做“解引用”操作,a 本身就是变量,直接用即可
}int main() {int x = 42;cout << "[主函数 main]" << endl;cout << "x 的值: " << x << endl;cout << "x 的地址: " << &x << endl;func(x); // 直接传变量return 0;
}
✅ 示例输出说明(示意):
🔹 指针传参输出:
[主函数 main]
x 的值: 42
x 的地址: 0x7ffee6b48d4c[函数 func - 指针传参]
类型(typeid(a)):Pi // Pi = pointer to int
a 的值(即指向对象的地址): 0x7ffee6b48d4c
a 本身的地址(指针变量的地址): 0x7ffee6b48d40
*a(解引用,访问 x 的值): 42
🔹 引用传参输出:
[主函数 main]
x 的值: 42
x 的地址: 0x7ffee6b48d4c[函数 func - 引用传参]
类型(typeid(a)):i // i = int
a 的值: 42
a 的地址(即 x 的地址): 0x7ffee6b48d4c
✅ 总结图表:
内容 | 指针方式 (int* ) | 引用方式 (int& ) |
---|---|---|
传入方式 | func(&x) | func(x) |
类型(typeid) | Pi (Pointer to int) | i (int) |
参数本身的地址 | &a 是新地址(func 内部) | &a 与 &x 相同 |
参数本身的值 | 是地址 | 是变量的值 |
解引用操作 | 需要 *a | 不需要,a 本身就是变量 |
是否可以修改原值 | ✅ 是 | ✅ 是 |