指针与const (C++11)

#1.cosnt指针

	int age = 39;
	const int * pt = &age;

不可以使用pt改变age的值,即*pt是const,不可修改。

	*pt += 1;      // 非法操作
	cin >> *pt;    // 非法操作

但是,pt的声明并不意味着它指向的变量(age)为const,而仅仅是说不可以使用pt来修改它指向的变量(age)。

	*pt = 20;      // 非法操作
	age = 20;      // ok

#2.指向const对象的指针
##2.1指向const对象的const指针

	const float g_earth = 9.80;
	const float * pe = &g_earth;   // ok

g_earth 和 pe都为const,都不可以用来修改其所对应的值(9.80)。
##2.2指向const对象的非const指针
C++不允许把const地址赋值给非const指针。

	const float g_moon = 1.63;
	float * pm = &g_moon;   // 非法操作

当然,你也可以使用类型转换突破此限制。

#3.指向指针的指针

	const int **pp2;
	int *p1;
	const int n = 13;
	pp2 = &p1;      // 非法操作。先假设合法。
	*pp2 = &n;      // ok,两者都是const,但 p1 = &n 非法。
	*p1 = 10;       // 此行的语法是合法的,但不能成功修改n。

因此,把非const地址或指针赋值给const指针的操作只在一次间接地址操作的情况下适用。换句话说,可以把const或者非const的数据赋值给const指针,只要此数据本身不是指针类型。

#4.const参数

	const int months[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
	...
	int sum(int arr[], int n);  // 应该是 const int arr[]
	int j = sum(months, 12);    // 非法

上面的函数调用试图把const指针(months)赋值给非const指针(arr),将产生编译错误。

小建议:
只要能够使用const,就使用。建议给指针声明添加const有两个原因:
1.可以防止无意的修改数据;
2.使用const允许函数处理const和非const的实参。如果在函数原型中省略const,则函数只可以接受非const的数据;
3.const引用做函数参数,可以让函数在需要的临时变量的时候生成中间变量;
只要可以,建议把形参声明为const指针。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值