指针:const与指针

const类型的指针可以指向非const类型的对象,但const类型的对象必须由const类型的指针指定:

	// C++ 语言强制要求指向 const 对象的指针也必须具有 const 特性
	const double d1 = 3.14;
	const double *pd1 = &d1;	// ok
	//double *pd2 = &d1;		// error: invalid conversion from 'const double*' to 'double*' [-fpermissive]

	int ival = 10;
	int *pi1 = &ival;		// ok
	const int *pi2 = &ival;		// ok,const指针可以指向非const对象

	// const类型的指针不能通过指针改变对象的值,只能通过其他方式修改
	//*pi2 = 11;			// error: assignment of read-only location '* pi2'
	ival = 11;
	cout << *pi2 << endl;		// 11

对于void*类型的指针也是如此:

	const int i = 10;
	const void *vp1 = &i;	// ok
	void *vp2 = &i;		// error: invalid conversion from 'const void*' to 'void*' [-fpermissive]

	const void *vp3;	// ok
	int j = 9;
	vp3 = &j;

对比:const int *p1 与int *const p2:

	int i = 10;

	const int *p1 = &i;	// 1:指向const对象的指针
	int *const p2 = &i;	// 2:const指针

	cout << *p1 << endl;	// 10
	cout << *p2 << endl;	// 10

1) 前者const只是限定了p1指针所指向的是const类型的对象,而非指针本身是const类型的,在定义的时候不需要初始化,允许对p1进行重新赋值,让p1重新指向一个const类型的对象,但不能通过p1去修改所指的对象的值,因为编译“自以为”现在所指向的对象是const类型的。但因为编译器没法分辨所指的对象是否为const类型的,所以可以通过变量赋值或者间接地利用非const的指针改变对象的值。

2) p2是const指针,即一经初始化,就会与对象的地址绑定在一起,不能该变,必须在定义的时候进行初始化。类似引用。但可以通过该指针去改变所指对象的值。

	*p2 = 11;
	cout << *p2 << endl;	// ok,11

	*p1 = 11;				// error: assignment of read-only location '* p1'
	cout << *p1 << endl;

在实际的程序中,指向 const 的指针常用作函数的形参。将形参定义为指向 const 的指针,以此确保传递给函数的实际对象在函数中不因为形参而被修改。


int *const p1 与 const int *const p2:

	int i = 1;
	const int j = 2;

	const int *p1 = &j;

	// error: invalid conversion from 'const int*' to 'int*' [-fpermissive]
	// 类型转换错误:p2的类型为const的指针指向int类型,但j是const int类型
	//int *const p2 = &j;
	int *const p2 = &i;			// ok

	const int *const p3 = &j;	// ok:p3的类型为:const指针指向const int类型对象,j是const int类型的






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值