const指针与指向const的指针(续)
4种形式的指针
在C++中,数据分为常量与变量:
int a; // 变量
const int b; // 常量
指针也有常量与变量之分,同时,根据指针所指向数据的存储方式(可变或不可变)又分为指向变量的指针和指向常量的指针。
/* 指针变量 */
int* p1; // 指向变量的指针变量
const int *p2; // 指向常量的指针变量
/* 指针常量 */
int* const p3; // 指向变量的指针常量
const int* const p4; // 指向常量的指针常量
- 用以上4种形式的指针分别指向
a
和b
,共有8种组合,我们依次来看看是否合法。
指向普通变量
普通指针
void main() {
int a = 677;
int* p1 = &a;
cout << "a = " << a << endl;
cout << "p1 = " << p1 << endl;
cout << "*p1 = " << *p1 << endl;
}
运行结果:
指向常量的指针变量
void main() {
int a = 677;
const int* p2 = &a;
cout << "a = " << a << endl;
cout << "p2 = " << p2 << endl;
cout << "*p2 = " << *p2 << endl;
}
运行结果:
指向变量的指针常量
void main() {
int a = 677;
int* p3 = &a;
cout << "a = " << a << endl;
cout << "p3 = " << p3 << endl;
cout << "*p3 = " << *p3 << endl;
}
运行结果:
指向常量的指针常量
void main() {
int a = 677;
int* p4 = &a;
cout << "a = " << a << endl;
cout << "p4 = " << p4 << endl;
cout << "*p4 = " << *p4 << endl;
}
运行结果:
指向常量
普通指针
void main() {
const int b = 999;
int* p1 = &b; // 编译报错
cout << "b = " << b << endl;
cout << "p1 = " << p1 << endl;
cout << "*p1 = " << *p1 << endl;
}
编译报错:
在这里,b是一个常量,b的地址并不能直接赋给一个普通指针,需要用到强制类型转换符 const_cast<int*>()
,如下代码:
void main() {
const int b = 999;
int* p1 = const_cast<int*>( &b ); // 类型转换
cout << "b = " << b << endl;
cout << "p1 = " << p1 << endl;
cout << "*p1 = " << *p1 << endl;
}
运行结果:
这里的 const_cast<int*>
将 &b
去掉 const 属性后再初始化 p1。
指向常量的指针变量
void main() {
const int b = 999;
const int* p2 = &b;
cout << "b = " << b << endl;
cout << "p2 = " << p2 << endl;
cout << "*p2 = " << *p2 << endl;
}
运行结果:
指向变量的指针常量
void main() {
const int b = 999;
int* const p3 = &b; // 编译报错
cout << "b = " << b << endl;
cout << "p3 = " << p3 << endl;
cout << "*p3 = " << *p3 << endl;
}
编译报错:
p3 是一个指针常量,但是其所指的内容并不具有const属性,因此不能指向常量b。如要满足需求,可以使用 const_cast<int*>()
去掉 &b
的const属性,再用其初始化 p3,如下代码:
void main() {
const int b = 999;
int* const p3 = const_cast<int*>( &b ); // 类型转换
cout << "b = " << b << endl;
cout << "p3 = " << p3 << endl;
cout << "*p3 = " << *p3 << endl;
}
输出结果:
指向常量的指针常量
void main() {
const int b = 999;
const int* const p4 = &b;
cout << "b = " << b << endl;
cout << "p4 = " << p4 << endl;
cout << "*p4 = " << *p4 << endl;
}
运行结果:
总结
除以下两种情况外,4种形式的指针均可以指向变量或是常量:
- 普通指针变量不能指向常量;
- 指向变量的指针常量不能指向常量;