地址是内存字节的编号,指针是存储地址的变量,引用是已有变量的别名;三者本质不同但均支持间接访问:地址为硬件编号(如0x7fff5fbff6ac),非C++类型;指针是真实类型(如int*),可空、可重赋值、支持算术运算;引用是绑定即固定的别名,不占内存,不可重绑、无空引用。

地址是内存中某个字节的编号,指针是存储地址的变量,引用是已有变量的别名——三者本质不同,但都服务于间接访问。
地址:内存的“门牌号”
地址是硬件层面的概念,表示内存单元的唯一编号(如 0x7fff5fbff6ac)。它不是 C++ 的数据类型,不能直接声明或赋值,只能通过取址运算符 & 获取,或由编译器/运行时系统分配。你无法定义一个叫 “address” 的变量来存地址——除非用指针或整数(如 uintptr_t)去承载它。
指针:能存地址、能改指向、能为空的“地址容器”
指针是一个真实的数据类型(如 int*),它在内存中占固定空间(通常 8 字节),内容是某个变量的地址。
- 可被初始化为 nullptr 或其他有效地址
- 可以重新赋值,改变指向(p = &b;)
- 支持算术运算(p + 1 指向下一个同类型元素)
- 解引用(*p)访问目标值,可能引发空指针或野指针崩溃
- 有独立生命周期,可作为函数参数、返回值、数组元素等自由传递
引用:绑定即固定、不可重绑、必有对象的“别名”
引用(int& r = a;)不是对象,不占额外内存(通常由编译器优化为直接使用原变量地址),它是已有变量的另一个名字。
立即学习“C++免费学习笔记(深入)”;
- 必须在定义时初始化,且只能绑定一次
- 不能绑定到字面量或临时对象(除非是 const 引用)
- 没有空引用的概念,不存在“未初始化引用”
- 不能取引用的地址(&r 实际上是取 a 的地址)
- 函数参数中用引用可避免拷贝,且允许修改实参(非 const 引用)
底层关键差异速查
指针是实体,引用是别名;地址是数值,指针是持有该数值的变量。
- sizeof(int&) == sizeof(int),而 sizeof(int*) 是指针大小(通常 8)
- 引用在汇编层常被完全优化掉,指针一定对应一条内存加载指令
- 指针可构成多级(int**),引用不能“引用引用”,但可有引用的引用(即 int& & 等价于 int&)
- const int& 可绑定临时量(如函数返回值),int* 则需显式取址,且不能指向纯右值










