const int*, const int * const, 和 int * const 的区别

const int*, const int * const, 和 int * const 的区别

技术背景

在C和C++编程中,const 关键字用于定义常量,当它与指针结合使用时,会产生不同的语义。理解 const int*const int * constint * const 的区别对于编写高质量、安全的代码至关重要。

实现步骤

1. 指针基本概念

在理解这些复杂的指针声明之前,需要明确指针的基本概念:指针是一个变量,它存储的是另一个变量的内存地址。

2. 不同指针声明的含义

  • const int*int const*:这两种声明方式是等价的,都表示指向常量整数的指针。指针本身可以指向不同的地址,但不能通过该指针修改所指向的整数的值。
1
2
3
4
5
int a = 5, b = 10;
const int* foo;
foo = &a; // 指针可以指向不同的地址
// *foo = 6; // 错误:不能通过指针修改所指向的值
foo = &b; // 指针可以指向不同的地址
  • int * const:表示常量指针,即指针本身的值(所指向的地址)不能被修改,但可以通过该指针修改所指向的整数的值。
1
2
3
4
int c = 15;
int *const bar = &c; // 必须在声明时初始化
*bar = 16; // 可以通过指针修改所指向的值
// bar = &a; // 错误:指针本身的值不能被修改
  • const int * const:表示指向常量整数的常量指针,指针本身的值(所指向的地址)不能被修改,也不能通过该指针修改所指向的整数的值。
1
2
3
4
int d = 20;
const int * const baz = &d; // 必须在声明时初始化
// *baz = 21; // 错误:不能通过指针修改所指向的值
// baz = &a; // 错误:指针本身的值不能被修改

3. 指针的多级引用

除了上述基本情况,还可以有指针的多级引用,如指针的指针。

1
2
3
4
int x = 10;
int *p = &x;
int **pp = &p;
// int ***ppp = &pp; // 可以继续扩展到多级指针

核心代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
int main() {
int a = 5, b = 10, c = 15, d = 20;

// const int* 示例
const int* foo;
foo = &a;
// *foo = 6; // 错误
foo = &b;

// int * const 示例
int *const bar = &c;
*bar = 16;
// bar = &a; // 错误

// const int * const 示例
const int * const baz = &d;
// *baz = 21; // 错误
// baz = &a; // 错误

// 多级指针示例
int x = 10;
int *p = &x;
int **pp = &p;
std::cout << **pp << std::endl;

return 0;
}

最佳实践

  • 尽量使用 const:在代码中,尽量将不需要修改的变量或指针声明为 const,这样可以提高代码的安全性和可读性。
  • 避免使用 const_castconst_cast 可以去除 const 限定,但应该尽量避免使用,因为它可能会破坏代码的安全性。
  • 使用引用代替指针:在可能的情况下,优先使用引用,因为引用比指针更安全,避免了空指针和野指针的问题。

常见问题

1. 为什么 const int* 不能修改所指向的值,但原变量可以修改?

const int* 只是保证不能通过该指针修改所指向的值,但原变量本身可能不是常量,所以可以通过其他方式修改。

1
2
3
4
int x = 5;
const int *p = &x;
x = 6; // 合法
// *p = 7; // 错误

2. 如何记忆这些指针声明的含义?

可以遵循以下规则:

  • 如果 const 出现在 * 的左边,那么所指向的对象是常量。
  • 如果 const 出现在 * 的右边,那么指针本身是常量。
  • 如果 const 出现在 * 的两边,那么指针和所指向的对象都是常量。

const int*, const int * const, 和 int * const 的区别
https://119291.xyz/posts/difference-between-const-int-const-int-const-and-int-const/
作者
ww
发布于
2025年5月26日
许可协议