七彩喷射
87.32M · 2026-03-30
指针、引用和常量的关系因为不同位置、能够相互嵌套(套娃)而异常复杂。文章简要介绍它们的区别,并总结区分技巧。
示例:
int *p;
int val; //一个已经存在的“对象”
int &ref = val;
int &ref1; //×
不存在该定义。因为引用不是对象,所以不能定义指向引用的指针。 示例:
int val;
int &ref=val;
int &*p=ref; //×
因为指针是对象,所以能定义指向指针的引用。 示例:
int *p;
int *&ref = p;
分析技巧:
在示例中,离变量名ref最近的符号是&,表述为“引用类型”。其余符号是int *,表述为“指向整型指针类型的”。
在示例中,离变量名ref最近的符号是&,表述为“变量ref是引用类型”。其余符号是int *,表述为“变量ref作用于整型指针类型”。
综上,“int *&ref = p;”是“指向整型指针类型的引用类型”(阅读定义),本质上是“指针的别名”,右值是指针(理解定义)。
一个变量的值不能被改变,该变量是常量。
示例:
const int val = 0; //使用“const”限定符修饰“变量”
因为指针是对象,所以能定义指针类型的常量。 示例:
int val = 0;
int *const p = &val;
分析技巧:
在示例中,离变量名p”最近的符号是“const”,表述为“常量类型”。其余符号是“int *”,表述为“指向整型指针类型的”。
在示例中,离变量名“p最近的符号是const,表述为“变量p是常量类型”(虽然将常量表述为一种数据类型不太准确)。其余符号是“int *”,表述为“变量p作用于整型指针类型”。
综上,“int *const p = &val;”是“指向整型指针的常量类型”,即“指针类型的常量”(阅读定义)。
(理解定义)
不存在该定义。因为引用不是对象,所以不能定义引用类型的常量。 示例:
int val = 0;
int &const ref = val; //×
示例:
const int val = 0;
const int *p = &val;
分析技巧:
在示例中,离变量名p最近的符号是*,表述为“指针类型”。其余符号是const int,表述为“指向常量整型(整型常量)类型的”。
在示例中,离变量名p最近的符号是*,表述为“变量p是指针类型”。其余符号是const int,表述为“变量p作用于常量整型(整型常量)”。
综上,“const int *p = &val;”是“指向整型常量的指针类型”,即“指向常量的指针”(阅读定义)。
(理解定义)
示例:
const int val = 0;
const int &ref = val;
分析技巧:
在示例中,离变量名ref最近的符号是&,表述为“引用类型”。其余符号是const int,表述为“指向常量整型(整型常量)类型的”。
在示例中,离变量名p最近的符号是&,表述为“变量ref是引用类型”。其余符号是const int,表述为“变量ref作用于常量整型(整型常量)”。
综上,“const int &ref = val;”是“指向整型常量的引用类型”,即“指向常量的引用”(阅读定义)。
(理解定义)
示例:
int val = 0;
int *const p1; //顶层常量,不能改变p1的值
const int *p2; //底层常量,不能通过p2改变所指对象val的值
示例:
int val = 0;
int *p1 = &val;
const int *p2 = &val;
const int *p3 = &val;
p1 = p2; //× 不具有相同的底层常量资格,常量不能够转换成非常量
p2 = p3; //√ 具有相同的底层常量资格
p2 = &val; //√ 非常量能够转换成常量
const int val2 = 0;
val = val2; //√ 基本类型的常量能够转换成非常量
《C++ Primer》中文版(第5版)作者:Stanley B. Lippman,Barbara E. Moo,JoséeLaJoie