在C++中,*
和&
符号的含义及使用场景取决于上下文。以下是详细解释:
1. *
和 &
的基本区别
在变量声明中
-
*
声明指针:表示变量存储的是内存地址。int* ptr; // ptr 是一个指向 int 的指针
-
&
声明引用:表示变量是另一个变量的别名(必须初始化)。int a = 10; int& ref = a; // ref 是 a 的引用
在表达式中(运算符)
-
*
解引用指针:获取指针指向的值。int b = *ptr; // 获取 ptr 指向的值
-
&
取地址:获取变量的内存地址。int* p = &a; // p 存储 a 的地址
2. 符号的位置(变量前 vs 后)
变量前
-
*
和&
作为运算符时,必须放在变量前:int val = *ptr; // 解引用 int* p = &a; // 取地址
类型后
-
在声明中,
*
和&
是类型修饰符,可以紧跟在类型后或变量前(风格问题):int* p; // 常见风格:强调类型是指针 int *p; // 另一种风格:强调 * 属于变量
-
注意:多个变量声明时,
*
只作用于当前变量:int* a, b; // a 是指针,b 是 int! int *c, *d; // c 和 d 都是指针
-
3. **
和 &&
的含义
**
:多级指针
-
指向指针的指针:
int a = 10; int* p = &a; int** pp = &p; // pp 存储 p 的地址
&&
-
右值引用(C++11起):绑定到临时对象(移动语义或完美转发)。
int&& rref = 42; // 右值引用,绑定到字面量
-
逻辑与运算符:在表达式中表示逻辑与。
if (x > 0 && y < 10) { ... }
4. 组合使用示例
-
指针的引用:
int* ptr = &a; int*& ref_ptr = ptr; // ref_ptr 是 ptr 的引用
-
右值引用的指针:
int&& rref = 5; int&&* pr = &rref; // 错误!右值引用不能直接用指针指向。
总结表
符号 | 上下文 | 含义 |
---|---|---|
* |
声明 | 声明指针(int* p ) |
* |
表达式 | 解引用(*p ) |
& |
声明 | 声明引用(int& ref ) |
& |
表达式 | 取地址(&a ) |
** |
声明 | 多级指针(int** pp ) |
&& |
声明(C++11+) | 右值引用(int&& rref ) |
&& |
表达式 | 逻辑与(a && b ) |
通过理解上下文和符号的位置,可以避免混淆。关键点:
- 声明中:
*
和&
是类型修饰符。 - 表达式中:它们是运算符。
- 右值引用(
&&
)用于现代C++的移动语义。