C++ 的* &

围巾🧣 2025年01月06日 102次浏览

在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 的地址
    

&&

  1. 右值引用(C++11起):绑定到临时对象(移动语义或完美转发)。

    int&& rref = 42;  // 右值引用,绑定到字面量
    
  2. 逻辑与运算符:在表达式中表示逻辑与。

    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++的移动语义。