指针常量和常量指针是两个不同的概念,它们分别描述了指针和指针所指向的内容的常量性质。
一、概念介绍
- 指针常量(Pointer to Constant):
指针常量是指一个指针本身是常量,不能通过该指针修改其所指向的内容。声明方式为在指针类型前加const
关键字。
int* const ptr;
在这个例子中,ptr
是一个指向常量整数的指针,意味着你不能通过ptr
来修改所指向的整数的值,但是你可以让ptr
指向其他地方。
-
常量指针(Constant Pointer):
常量指针是指指针本身是可以修改的,但不能通过该指针修改其所指向的内容。声明方式为在指针变量名前加const
关键字。int const *ptr; // 常量整数指针
const int* ptr;
在这个例子中,
ptr
是一个常量整数指针,你不能通过ptr
来修改指针的值,但是你可以通过其他途径修改所指向的整数的值。
需要注意的是,上述两者的差异在于指针本身的常量性质。如果既不希望修改指针的值,也不希望修改指针所指向的内容,可以将const
同时放在类型和指针变量名之前:
const int *const ptr; // 常量整数指针常量
在这个例子中,ptr
是一个常量整数指针常量,既不能通过ptr
修改指针的值,也不能通过ptr
修改所指向的整数的值。
二、示例代码
让我们看一些具体的例子:
- 常量指针:
#include <iostream>
int main() {
int x = 10;
const int* ptr;
ptr = &x; // 合法,可以指向常量
// *ptr = 20; // 错误,不能通过指针修改所指向的内容
std::cout << "Value pointed by ptr: " << *ptr << std::endl;
return 0;
}
在这个例子中,ptr
是一个指向常量整数的指针,你可以使用它来访问 x
的值,但不能通过它来修改 x
的值。
- 指针常量:
#include <iostream>
int main() {
int x = 10;
int y = 20;
int* const ptr = &x; // 常量整数指针
// ptr = &y; // 错误,不能修改指针的值
*ptr = 30; // 合法,可以通过指针修改所指向的内容
std::cout << "Value of x: " << x << std::endl;
return 0;
}
在这个例子中,ptr
是一个常量整数指针,你不能修改指针 ptr
的值,但可以通过 ptr
修改其指向的内容。
- 常量整数指针常量:
#include <iostream>
int main() {
int x = 10;
const int* const ptr = &x; // 常量整数指针常量
// ptr = &y; // 错误,不能修改指针的值
// *ptr = 30; // 错误,不能通过指针修改所指向的内容
std::cout << "Value pointed by ptr: " << *ptr << std::endl;
return 0;
}
在这个例子中,ptr
是一个常量整数指针常量,既不能修改指针的值,也不能通过指针修改其指向的内容。
三、如何区分常量指针和指针常量
答:就看const关键字位于*号的左边还是右边;
如果位于左边,如const int*a,则为常量指针;
如果位于右边,如int*const b,则为指针常量;
注:上图来源于https://www.cnblogs.com/lizhenghn/p/3630405.html