声明后还能被修改的叫变量,如果为了保护变量不能被修改就声明为常量,使用const修饰符。
在C++中系统会为指针变量分配一个4字节(32位)的内存块用来存储指向数据的地址,所以指针类型就牵扯到两个概念,指针本身(4字节的内存块)和指向数据(4字节的内存块存储的地址)。
如果指针和常量结合会有什么问题呢?
声明指针是常量是保护指针本身不能改变 呢,还是保护指向数据不能改变呢,还是两者都会保护呢?
定义:指针本身是常量
声明:int * const p = &a;//(const 修饰的是p)
特性:指针指向不能变,但是指向对象可变(保护指针本身不保护指向数据)
#include <iostream> using namespace std; int main() { int a = 1, b = 2; int * const p = &a; *p = 3;//可以编译,可以改变指向数据 p = &b;//无法编译,不能重新指向新对象(指针本身不能变) return 0; }
定义:指向常量的指针
声明:const int *p = &a;或者int const *p = &a; //(const 修饰的是*p)
特性:指针指向可变,但是指向对象不可变(保护指向数据不保护指针本身)
#include <iostream> using namespace std; int main() { int a = 1, b = 2; const int *p = &a; *p = 3;//无法编译,不能改变指向数据 p = &b;//可以编译,可以重新指向新对象(指针本身可以变) b = 3;//但是通过原变量仍然可以改变p指向的数据 return 0; }
定义:指针本身是常量,指向对象也不能变
声明:const int * const p = &a; //(const 修饰的是*p和p)
特性:保护指向数据也保护指针本身
#include <iostream> using namespace std; int main() { int a = 1, b = 2; const int * const p = &a; //两者都保护 *p = 3;//无法编译,不能改变指向数据 p = &b;//无法编译,不能重新指向新对象(指针本身不能变) return 0; }
#include <iostream> using namespace std; int main() { int const a = 1; int const *p1 = &a;//正确,a是常量不可变,赋给指针p1后a同样不可变 int * const p2 = &a;//不正确,a是常量不可变,赋给指针p2后a无法保证不可变 int const * const p3 = &a;//正确,a是常量不可变,赋给指针p3后a同样不可变 return 0; }
原文地址:http://blog.csdn.net/easion_zms/article/details/46474175