You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何取址运算符(&)会生成引用?附相关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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:08:04