为何取址运算符(&)会生成引用?附相关C++测试代码
为什么C++中的取址运算符(&)会生成引用?结合测试代码解析
嘿,这个问题刚好戳中了C++里一个容易让人迷糊的点——&符号其实有两个完全不同的身份,咱们结合你给出的测试代码一步步拆解清楚。
首先得明确:你代码里函数参数的&,并不是取址运算符,而是用来声明「引用类型」的语法符号。这俩用法虽然长得一样,但完全是两回事:
1. &的两种核心用法区分
- 作为取址运算符(表达式场景):当你在一段执行代码里写
&变量名时,这才是取址操作——它会返回该变量的内存地址,结果是一个指针类型。比如:int num = 10; int* ptr = # // 这里的&是取址运算符,得到num的地址,赋值给指针ptr - 作为引用声明符(类型声明场景):当你在变量/参数的类型定义里写
类型&时,这是在声明一个引用——引用是变量的「别名」,它和原变量绑定在一起,操作引用就等于操作原变量。比如你测试代码里的:
这里的void test3(const int &a){ cout << "const int &a passed a "<< a << endl; }const int &a,就是声明a是一个const int类型的引用,而不是对某个变量取址。
2. 结合你的测试代码具体分析
你的四个test函数,参数都是const int &a,这种写法的目的是让函数接收实参的引用而非拷贝:
- 如果你调用
test3(20),编译器会临时创建一个const int类型的临时对象来存储20,然后让a绑定到这个临时对象上; - 如果你调用
test3(num)(假设num是一个int变量),a就直接绑定到num上,相当于num的别名,函数里操作a就是操作num本身。
可能你混淆的点是:为什么同样是&,在参数里是引用,而在其他地方是取址?其实只要看上下文就清楚了:
- 当
&出现在类型定义里(比如参数类型、变量声明类型),它是引用声明; - 当
&出现在执行表达式里(比如赋值语句、函数调用的实参里),它才是取址运算符。
举个直观的对比例子:
void test(const int &a) { int* ptr = &a; // 这里的&是取址运算符,取的是a绑定的变量的地址,得到int*指针 } int main() { int x = 5; test(x); // 这里的x直接绑定到函数的引用参数a上,没有取址操作 test(&x); // 这会报错!因为&x是int*类型,和const int&类型不匹配 }
简单总结:&的含义完全由它所在的上下文决定,你代码里的&是引用声明符,和取址运算符是两个完全不同的语法元素~
内容的提问来源于stack exchange,提问作者trisimix
相关产品推荐
相关产品推荐

