int vb = 11;
// 指针  常量  指针 
// 定义 指向 地址
int* pa = &vb;

cout << pa << endl;
cout << *pa << endl;
cout << "sizeof *pa     " <<  sizeof(*pa) << endl;

1. 常量指针(Pointer to Constant)

  • 含义:指针指向的值是常量,不能通过指针修改这个值,但指针本身可以指向其他地址。

  • 语法const int* ptr;

  • 记忆技巧const* 前面,表示指向的值是常量。

  • 例子

    int a = 10;
    int b = 20;
    const int* ptr = &a;  // ptr 指向 a,a 的值是常量
    // *ptr = 30;  // 错误!不能通过 ptr 修改 a 的值
    ptr = &b;      // 正确!ptr 可以指向其他地址
    

2. 指针常量(Constant Pointer)

  • 含义:指针本身是常量,不能指向其他地址,但可以通过指针修改指向的值。

  • 语法int* const ptr;

  • 记忆技巧const* 后面,表示指针本身是常量。

  • 例子

    int a = 10;
    int b = 20;
    int* const ptr = &a;  // ptr 是常量,只能指向 a
    *ptr = 30;            // 正确!可以通过 ptr 修改 a 的值
    // ptr = &b;          // 错误!ptr 不能指向其他地址
    

3. 常量指针常量(Constant Pointer to Constant)

  • 含义:指针本身是常量,且指向的值也是常量。

  • 语法const int* const ptr;

  • 记忆技巧:两个 const,一个在 * 前面,一个在 * 后面。

  • 例子

    int a = 10;
    int b = 20;
    const int* const ptr = &a;  // ptr 是常量,且指向的值也是常量
    // *ptr = 30;               // 错误!不能通过 ptr 修改 a 的值
    // ptr = &b;                // 错误!ptr 不能指向其他地址
    

4. 总结对比

类型语法指针能否改变指向的值能否改变
常量指针const int* ptr;可以不可以
指针常量int* const ptr;不可以可以
常量指针常量const int* const ptr;不可以不可以

5. 记忆技巧

  • const* 前面:指向的值是常量(常量指针)。
  • const* 后面:指针本身是常量(指针常量)。
  • 两个 const:指针和指向的值都是常量(常量指针常量)。

6. 实际应用场景

  • 常量指针:当你希望保护数据不被修改时使用。
  • 指针常量:当你希望指针固定指向某个地址时使用。
  • 常量指针常量:当你既希望指针固定,又希望数据不被修改时使用。