本文共 2011 字,大约阅读时间需要 6 分钟。
1.常量本身必须初始化,因此对于本身是常量的指针,必须初始化,比如int* const p=&a;
2.对于指针本身不是常量,但是指向的对象是常量的指针,可以不初始化,比如const int *p、int const *p;
const是一个的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性
指向常量的指针:
const int *pa;
int const *pa; 两者等价。因为指向常量的指针有时候会指向常量,所以它具有这个性质:“不能靠解引用改变它指向的对象的值”,以此保护它所指向的常量的常量性: *pa =d; // 不可行(d是已经声明过的整型)但指针本身的值是可变的:
pa=& d; // 可行(d是已经声明过的整型)而且指向常量的指针有时候也会指向变量,如下:
int t,u; const int *pa; pa =&t; //可行,指向变量t pa =&u; //也可行,指向变量u我们可以把它理解成:“为了指向常量而发明的指针”,这样比较贴切。
常量指针:
int *const pa =&n; // n是之前已经声明过的整型变量,注意必须是变量,理由见下
“常量指针”即指针本身的值是常量,但“能靠解引用改变它指向的对象的值”,如下:
pa=&d; // 不可行(d是已经声明过的整型) *pa =d; // 可行(d是已经声明过的整型)因为常量指针也是一种const常量,所以它同样必须在第一次声明时就初始化,不过它的初始值缩小为只能是变量(的地址),因为只有变量才能确保以后能靠解引用而改变它指向的对象的值。这使得常量指针不象一般的const常量,用变量或常量初始化都可以。
也就是说,常量指针反而总是指向变量的。举例:
typedef char * pStr; char string[4] = "abc"; const char *p1 = string; const pStr p2 = string; p1++; p2++; |
答案与分析: 问题出在p2++上。 1)、const使用的基本形式: const char m; 限定m不可变。 2)、替换1式中的m, const char *pm; 限定*pm不可变,当然pm是可变的,因此问题中p1++是对的。 3)、替换1式char, const newType m; 限定m不可变,问题中的charptr就是一种新类型,因此问题中p2不可变,p2++是错误的。
char *p = "i'm hungry!"; p[0]= 'I'; |
答案与分析: 上面的代码可能会造成内存的非法写操作。分析如下, “i'm hungry”实质上是字符串常量,而常量往往被编译器放在只读的内存区,不可写。p初始指向这个只读的内存区,而p[0] = 'I'则企图去写这个地方,编译器当然不会答应。 总结:
1)、const在前面
const int nValue; //nValue是const const char *pContent; //*pContent是const, pContent可变 const (char *) pContent;//pContent是const,*pContent可变 char* const pContent; //pContent是const,*pContent可变 const char* const pContent; //pContent和*pContent都是const |
int const nValue; // nValue是const char const * pContent;// *pContent是const, pContent可变 (char *) const pContent;//pContent是const,*pContent可变 char* const pContent;// pContent是const,*pContent可变 char const* const pContent;// pContent和*pContent都是const |
转载地址:http://sagsi.baihongyu.com/