新手的理解,如果文中有错误,烦请指出,谢谢。
1. int * const
常量指针(const pointer),语句声明(定义)一个指针,使用时必须初始化,一旦初始化完成后,指针的值不能改变,即指针自己的内存不能改变(和变量进行绑定)。
int i1 = 1;
int* const p1 = &i1;
注意,我把 * 紧贴 int 之后,因为语句声明的是一个指向 int 类型变量的指针,后面的 const 表明此语句声明的指针为一个常量,即不能改变 p1 内存中的内容。类比 int const,可以暂时把 int* 当作 int ,都是类型名,后面接了const,表明语句声明的“变量”为一个常量,即内存中的内容不可更改。所以要求 int* const p1 必须初始化,否则以后不可更改,容易使程序出现错误。
C++ primer 中推荐的理解方法是从右往左阅读,类似语句的右结合性:p1 为const,其值不能改变;int*表明p1为指向int类型的指针,所以p1所指向的对象不可更改。所以这时候改变p1的值会导致错误:
int i2 = 2;
p1 = &i2; //error,p2 的值不可以更改
但是p1所指向的是int类型,是变量,即 p1 可以通过解引用的方式改变 i1 内存单元的内容:
*p1 = 2; //success
std::cout << "i1 = " << i1 << std::endl;//打印结果为: i = 2
p1 和 i1 就是男人和女人结婚领证的关系,p1 和 i1 “领证“后,p1就不能和其他女变量连接了。 但是,p1 可以让 i1 怀孕,改变 i1 的内容。
2. int const *
指向常量的指针(pointer to const),语句声明(定义)一个指针,此指针指向一个int 型常量,即所指向的对象为常量,自然不能更改指向对象的内容了。
int i2 = 2;
int const *p2 = &i2;
在这里我倾向于把 * 紧贴 p2,同样从右向左进行理解:*p2表明 p2 为指针变量,左侧 int const 表明 p2
所指向的为 int型常量,所以 p2 为指向常量的指针。上面的语句等价于:
const int *p2 = &i2;
此时如果想通过对 p2 解引用来改变 i2 的值,则编译会出现错误:
*p2 = 3; // error
但是,p2 本身并非常量,可以改变p2 指向的对象:
p2 = &i1;// success
同时,因为 int const *声明的变量不是常量,所以可以不赋初值
int const *p3;
对 int const * 的对象可以理解为没结婚的男女朋友,ip2 可以交不同的女朋友(改变自己指向的对象),但是不能把人家肚子搞大(改变其值)。
3. 简单的理解
int* const p1 = &i1;// 从右往左看,p1 为const ,其类型为 int*。
int const *p2 ; // 从右往左看,p2 为指针,指向的类型为 int 常量。
4. 其他
举的例子中指针指向的类型均不是常量,学艺不精,期间关系还得进一步去理解去学习。
5. 最后
如果你和我一样也是新手,分享一下我的学习方法:从语句的英文含义去理解其原理,因为翻译成汉语之后对新手来说这些名词以排列组合般的排列在一起,很难理解。同时也可以把不明白的那一点用老师”备课“的方式去学习,想像如何讲述才能使得别人更清晰明了,具体方法就像我现在所做的:写blog,这个过程是学习的过程,也是巩固的过程。