1. 指针与const
1.1 常量指针
- 常量指针:指该指针不可改变,就是该指针保存的内存地址不可被重新赋值。
定义形式:数据类型 *const 变量名;
如:int *const p = new int; //定义了一个常量指针p #include <iostream> using namespace std; class A { public: int get()const { return i; } void set(int x) { i = x; } private: int i; }; int main() { A *p = new A; cout<<"指针p指向的内存地址:"<<p<<endl; p++; cout<<"指针p偏移1个单位后,指向的内存地址:"<<p<<endl; A *const p1 = new A; cout<<"指针p1指向的内存地址:"<<p1<<endl; //p1++;//编译报错error C3892: “p1”: 不能给常量赋值 cout<<"由于p1被定义为常量指针,不能给常量赋值:"<<p1<<endl; system("pause"); return 0; } =>指针p指向的内存地址:00E34750 指针p偏移1个单位后,指向的内存地址:00E34754 指针p1指向的内存地址:00E347E0 由于p1被定义为常量指针,不能给常量赋值:00E347E0
注:p++; p- -; p=p1; 等对常量重新赋值的操作都是错误的,由于p是常量指针,不能修改指针保存的地址,因此企图修改常量指针保存的地址值将会报错。
1.2 指向常量的指针
- 指向常量的指针:指该指针指向的内存地址中的值不可改变。
定义形式:const 数据类型 *变量名;
如:const int *p = new int; //定义了一个指向常量的指针p #include <iostream> using namespace std; class A { public: int get()const { return i; } void set(int x) { i = x; } private: int i; }; int main() { A *p = new A; p->set(22); cout<<"p指针指向的内存地址中的值改变后:p->get() = "<<p->get()<<endl; const A *p1 = new A; //p1->set(22);//编译报错,error C2662: “A::set”: 不能将“this”指针从“const A”转换为“A &” cout<<"p1是指向常量的指针,该指针指向的内存地址中的值不可改变"<<endl; system("pause"); return 0; } =>p指针指向的内存地址中的值改变后:p->get() = 22 p1是指向常量的指针,该指针指向的内存地址中的值不可改变
注:*p = 1;等重新对指针指向的内存空间中的数据重新赋值都是错误的,由于p是指向常量的指针,该指针指向的内存地址中的值不可改变,因此企图修改指向常量的指针中保存地址处的值时将会报错。
1.3 指向常量的常指针
- 指向常量的常指针:指该指针不可改变,就是该指针保存的内存地址不可被重新赋值。同时,指该指针指向的内存地址中的值不可改变。
定义形式:const 数据类型 *const 变量名;
如:const int* const p = new int; //定义了一个指向常量的常指针p #include <iostream> using namespace std; class A { public: int get()const { return i; } void set(int x) { i = x; } private: int i; }; int main() { A *p = new A; cout<<"指针p指向的内存地址:"<<p<<endl; p++; cout<<"指针p偏移1个单位后,指向的内存地址:"<<p<<endl; p->set(22); cout<<"p指针指向的内存地址中的值改变后:p->get() = "<<p->get()<<endl; const A *const p1 = new A; cout<<"指针p1指向的内存地址:"<<p1<<endl; //p1++;//编译报错error C3892: “p1”: 不能给常量赋值 cout<<"由于p1被定义为常量指针,不能给常量赋值:"<<p1<<endl; //p1->set(22);//编译报错,error C2662: “A::set”: 不能将“this”指针从“const A”转换为“A &” cout<<"p1是指向常量的指针,该指针指向的内存地址中的值不可改变"<<endl; system("pause"); return 0; } =>指针p指向的内存地址:007D4750 指针p偏移1个单位后,指向的内存地址:007D4754 p指针指向的内存地址中的值改变后:p->get() = 22 指针p1指向的内存地址:007D47E0 由于p1被定义为常量指针,不能给常量赋值:007D47E0 p1是指向常量的指针,该指针指向的内存地址中的值不可改变
注:
(1)p++; p- -; p=p1; 等对常量重新赋值的操作都是错误的,由于p是常量指针,不能修改指针保存的地址,因此企图修改常量指针保存的地址值将会报错。
(2)*p = 1;等重新对指针指向的内存空间中的数据重新赋值都是错误的,由于p是指向常量的指针,该指针指向的内存地址中的值不可改变,因此企图修改指向常量的指针中保存地址处的值时将会报错。
参考文献 :
[1]《C++全方位学习》范磊——第八章
[2]《C++程序设计教程(第二版)》钱能——第三章
[3] 百度搜索关键字:C++指针、常量指针、指向常量的指针、指向常量的常指针