const int *
和 int * const
的区别
在C/C++中,const
关键字用于定义常量。const
的位置决定了它是修饰指针本身还是指针所指向的值。具体来说:
const int *
: 指向常量整数的指针,不允许通过指针修改所指向的值。int * const
: 常量指针,指针本身是常量,不允许重新指向其他地址,但可以通过指针修改所指向地址的值。
详细说明
-
const int *
:- 含义:
const
修饰的是int
,表示指针所指向的整数是常量。 - 特点:
- 不能通过该指针修改所指向的整数值。
- 可以改变指针本身指向的地址。
- 适用于保护数据不被意外修改的场景。
- 示例:
const int *ptr; int a = 10, b = 20; ptr = &a; // 合法,ptr指向a std::cout << *ptr << std::endl; // 输出: 10 ptr = &b; // 合法,ptr指向b std::cout << *ptr << std::endl; // 输出: 20 // *ptr = 30; // 非法,不能通过ptr修改b的值
- 含义:
-
int * const
:- 含义:
const
修饰的是指针本身,表示指针是常量。 - 特点:
- 不能改变指针本身指向的地址。
- 可以通过该指针修改所指向的整数值。
- 适用于需要固定指针指向的场景。
- 示例:
int a = 10, b = 20; int * const ptr = &a; // 合法,ptr指向a std::cout << *ptr << std::endl; // 输出: 10 *ptr = 30; // 合法,可以通过ptr修改a的值 std::cout << a << std::endl; // 输出: 30 // ptr = &b; // 非法,不能改变ptr的指向
- 含义:
-
const int * const
:- 含义:
const
同时修饰指针和指针所指向的值。 - 特点:
- 不能改变指针本身指向的地址。
- 不能通过指针修改所指向的值。
- 适用于需要完全保护数据和指针指向的场景。
- 示例:
int a = 10, b = 20; const int * const ptr = &a; // 合法,ptr指向a std::cout << *ptr << std::endl; // 输出: 10 // ptr = &b; // 非法,不能改变ptr的指向 // *ptr = 30; // 非法,不能通过ptr修改a的值
- 含义:
总结
特性 | const int * | int * const | const int * const |
---|---|---|---|
指针指向的地址 | 可以改变 | 不能改变 | 不能改变 |
指针指向的值 | 不能修改 | 可以修改 | 不能修改 |
适用场景 | 保护数据不被修改 | 固定指针指向,允许修改数据 | 完全保护数据和指针指向 |
示例代码
#include <iostream>
int main() {
int a = 10, b = 20;
// const int * 示例
const int *ptr1 = &a;
std::cout << "ptr1 points to: " << *ptr1 << std::endl; // 输出: 10
ptr1 = &b; // 合法,ptr1指向b
std::cout << "ptr1 now points to: " << *ptr1 << std::endl; // 输出: 20
// *ptr1 = 30; // 非法,不能通过ptr1修改b的值
// int * const 示例
int * const ptr2 = &a;
std::cout << "ptr2 points to: " << *ptr2 << std::endl; // 输出: 10
*ptr2 = 30; // 合法,可以通过ptr2修改a的值
std::cout << "a is now: " << a << std::endl; // 输出: 30
// ptr2 = &b; // 非法,不能改变ptr2的指向
// const int * const 示例
const int * const ptr3 = &a;
std::cout << "ptr3 points to: " << *ptr3 << std::endl; // 输出: 30
// ptr3 = &b; // 非法,不能改变ptr3的指向
// *ptr3 = 40; // 非法,不能通过ptr3修改a的值
return 0;
}
ptr1 points to: 10
ptr1 now points to: 20
ptr2 points to: 10
a is now: 30
ptr3 points to: 30
进一步理解
const int *
的应用场景
当函数参数需要传递一个只读的指针时,使用 const int *
可以防止函数内部意外修改数据。
示例:
void printValue(const int *ptr) {
std::cout << *ptr << std::endl;
// *ptr = 10; // 非法,不能修改数据
}
int * const
的应用场景
当需要固定指针指向某个地址,但允许修改该地址的值时,使用 int * const
。
示例:
void modifyValue(int * const ptr) {
*ptr = 100; // 合法,可以修改数据
// ptr = nullptr; // 非法,不能改变指针指向
}
const int * const
的应用场景
当需要完全保护指针指向的地址和数据时,使用 const int * const
。
void printAndProtect(const int * const ptr) {
std::cout << *ptr << std::endl;
// ptr = nullptr; // 非法,不能改变指针指向
// *ptr = 100; // 非法,不能修改数据
}