指针与const的奇妙关系


1. 指向常量的指针

1.1 声明

声明:const 类型 * 指针名 = 地址

1.2 含义

顾名思义就是指针指向对象的类型是一个常量类型,即const 类型 ,不能通过指针的方式修改其所指对象的值。类型是指基本数据类型,不含指针类型。

  1. 指向“常量”的“常量”是针对指针本身而言,实际上的对象可能是一个常量或者变量。(即使实际上的对象是变量也不能通过指向常量的指针改变它的值,但是它本身是可以改变的)
  2. 指向常量的指针是一个指针变量,即可以改变指针的值。
    例如以下代码是合法的:
    const float PI = 3.14159;
    float pi = 6.66;
    const float* p = Π
    cout << *p << endl;
    p = &pi;
    cout << *p << endl;

但是如果试图使用指针改变其所指对象的值,编译器即会报错:

    const float PI = 3.14159;
    float pi = 6.66;
    const float* p = &PI;
    cout << *p << endl;
    p = &pi;
    cout << *p << endl;
    *p = 1.1;//非法的

在这里插入图片描述

1.3 拓展

1.3.1 常量地址赋值

常量的地址不能赋给指向变量的指针(为了防止常量值被修改),如果一定要这么操作,通常需要使用const_cast运算符作类型转换,如此常量的地址就可以赋给指向变量的指针。但是使用指针不一定能够修改这个常量的值
如执行以下代码编译器会报错:

	const float PI = 3.14159;
	float* p;
	p = &PI;

在这里插入图片描述
将常量地址作类型转换赋给指针(指向变量的):

int main()
{
	const float PI = 3.14159;
	float* p;
	p = const_cast<float *>(&PI);
	cout << "*p:" << *p << endl;
	cout << "PI=" << PI << endl;
	*p = 5.14;
	cout << "*p:" << *p << endl;
	cout << "PI=" << PI << endl;
}

在这里插入图片描述
可见,PI的值并没有被修改。

1.3.2 指向指针的指针

  • 声明:类型 ** 变量名;例如:int ** pp;
  • 指向指针的指针的值是另一个指针的地址
  • 指向指针的指针的值必须和它声明的类型相对应,如以下代码修改自C++ Primer Plus(第六版)第222页:
int main()
{
	const int** pp2;
	int* p1;
	const int n = 13;
	//pp2 = const_cast<const int**>(&p1);
	pp2=&p1;
	*pp2 = &n;
	*p1 = 10;
	cout << "n:" << n << endl;
	cout << "p1:" << p1 << endl;
	cout << "pp2:" << pp2 << endl;
}

在这里插入图片描述
报错的原因是pp2关联的类型是const int*,而p1的类型却是int*,类型不匹配。

1.3.3 小结

如果数据类型本身不是指针,则可以将const数据或非const数据的地址赋给指向const的指针,但只能将非const数据的地址赋给非const指针

2. 指针常量

2.1 声明

声明:类型 * const 名字。例如:int* const p = &p1;

2.2 含义

可以联系基本数据类型的常量来理解。如float PI = 3.14159,PI就是一个常量,只能访问而不能修改,并且声明时同时初始化。指针常量作为常量当然也具备一般常量的特性:只能访问而不能修改,声明时初始化。例如以下程序:

int main()
{
	int i, j;
	int* const p = &i;
	p = &j;
}

编译之后即报错:
在这里插入图片描述
p是一个指针常量,初始化之后不能改变它的值。但是可以改变其指向的对象的值,例如:

int main()
{
	int i=1;
	int* const p = &i;
	cout << "i=" << i << endl;
	*p = 10;
	cout << "i=" << i << endl;
}

执行结果:
在这里插入图片描述

3. 指向常量的指针常量

3.1 声明

声明:const 类型* const 名字 = 初始化地址。例如:const int* const p1 = &p;

3.2 含义

特性就是综合以上1、2的性质:既不能改变指针的值,也不能改变指向对象的值。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值