在 C++ 中,const int *p
和 int *const p
是两种不同的指针声明方式,它们的核心区别在于 const
修饰的对象不同,导致指针的行为不同。以下是详细对比:
const int *p
(或 int const *p
)• 含义:
• 指针 p
可以指向不同的内存地址。
• 不能通过 p
修改其指向的数据(数据是常量)。
• 用途:
用于保护数据不被意外修改,常用于函数参数传递只读数据。
示例:
int a = 10, b = 20;
const int *p = &a; // 正确:p 指向 a(a 不需要是 const)
// *p = 15; // 错误:不能通过 p 修改 a
p = &b; // 正确:p 可以指向其他地址
int *const p
• 含义:
• 指针 p
的地址不可变(指针本身是常量)。
• 可以通过 p
修改其指向的数据(数据可变)。
• 用途:
用于固定指针的指向地址,但允许修改数据(如硬件寄存器操作)。
示例:
int a = 10, b = 20;
int *const p = &a; // p 必须初始化且无法修改地址
*p = 15; // 正确:可以通过 p 修改 a 的值
// p = &b; // 错误:p 的地址不可变
const int *const p
• 含义:
• 指针 p
的地址不可变。
• 也不能通过 p
修改其指向的数据。
• 用途:
完全固定指针和数据,适用于只读且地址固定的场景(如全局常量)。
示例:
const int a = 10;
const int *const p = &a; // p 指向 a,且不可修改地址和数据
// *p = 20; // 错误:数据不可修改
// p = nullptr; // 错误:指针地址不可修改
声明形式 | 指针地址是否可变 | 指向数据是否可变 | 典型场景 |
---|---|---|---|
const int *p | ✅ | ❌ | 传递只读数据 |
int *const p | ❌ | ✅ | 固定地址,允许修改数据 |
const int *const p | ❌ | ❌ | 完全固定指针和数据 |
• const
在 *
左侧 → 数据不可变。
• const
在 *
右侧 → 指针不可变。
const int *p
:
void printData(const int *arr, int size) {
// 保证函数内不会修改 arr 指向的数据
for (int i = 0; i < size; i++) {
cout << arr[i] << " ";
}
}
int *const p
:
int buffer[100];
int *const ptr = buffer; // ptr 始终指向 buffer 首地址
*ptr = 1; // 允许修改数据
掌握 const
与指针的组合使用,能有效提升代码的安全性和可读性!