C++指向常量的指针和常指针
C++指向常量的指针和常指针
指向常量的指针
通常情况下,可以通过指针去修改指针指向的内容.但是在某些情况下,只希望通过指针去访问指针指向的内容,不想修改.比如只想通过树根结点的指针去遍历输出树中所有结点的内容,不修改.这时候就可以使用指向常量的指针,防止意外修改.
看下面的代码
const int* u;
const int* u;可以读作:u是一个指针,该指针指向不能通过该指针修改的内容.重点在不能通过该指针修改的内容,也就是说u指向的内容不能通过u来修改,但是可以通过别的方法修改.看下面的代码和注释.
#include <iostream>
using namespace std;
int main() {
int a = 3;
const int* u;
u = &a; //初始化u
cout << "*u=" << *u << endl;
/* 试图通过u修改u指向的内容,直接报错.
*u = 3;
cout << "*u=" << *u << endl;
*/
/*通过另外一个变量的指针修改u指向的内容是正确的.*/
int b = 4;
u = &b;
cout << "*u=" << *u << endl;
/*通过另外一个指针修改u指向的内容也是正确的.*/
int *c = &b;
*c = 100;
cout << "*u=" << *u << endl;
}
指向常量的指针还有一种等价的定义方式, int const* u; int const* u和const int* u的意义完全相同.
常指针
看下面的代码.
#include <iostream>
using namespace std;
int main() {
int d = 1;
int* const w = &d;
return 0;
}
int* const w = &d读作:w是一个指针,这个指针是一个不能修改的(int型)指针.重点在不能修改的指针,也就是说w不可以被修改,但w指向的内容是可以修改的.看下面的代码和注释.
#include <iostream>
using namespace std;
int main() {
int d = 1;
int* const w = &d;
/* 试图修改w,直接报错.
int e =2;
w = &e;
*/
/*可以修改w指向的内容*/
*w = 6;
cout << "*w=" << *w << endl;
*w = 7;
cout << "*w=" << *w << endl;
return 0;
}
参考资料
Bruce Eckel. Thinking in C++, Volume 1, 2nd Edition.pp360-362. 2000.