【C Prime Plus】学习笔记,Chapter 10,用const 修饰形参 保护数据,以防修改

// Page 674
// 保护数组,防止传给形参时被修改

// 如果要改变实参数组的元素值,就如下定义
void add_to(double ar[],int n,double val)
{
	int i;
	for(i=0;i<n;i++)
		ar[i]+=val;
}

// 如果不希望实参数组被改变,就用 const 修饰 形参定义
// 这个const 在形参中出现,并不要求调用时传入的实参也是const

int sum(const int ar[],int n)
{
	int i;
	int total=0;
	for(i=0;i<n;i++)
		total +=ar[i];
	return total;

}

// 常量指针 和 指针常量 的问题,这2个名称容易混淆了,外文翻译过来的东西,又不是保留字,
// 个人爱怎么解读是自己的事,老考这个实在太恶心了.还是去用和去记英文安逸(const double *pd  和 double* const pd)
// 常量指针: 因为指针保存的是地址,常量嘛就是不变的意思,所以,可以解读为,地址不变的指针.咋的了,不行么? 
// 指针常量: 可以解读为 指向常量的指针,被指向的东西是常量....
// 这个问题实在是恶心.

// 所谓的正解是
// 常量指针: 指向常量的指针  const double *pd;  内容不可变,地址可变
// 指针常量: 指针是个常量    double* const pd;  地址不可变,内容可变 
                     (指针常量 可以这样写么? doulbe const *pd;  测试了表明也可以,但是实际是常量指针, 等同于const double *pd;
					  也就是  const double *pd; 与 doulbe const *pd; 等同,奇怪.)


// 申明2个函数如下
 void show_array(const double ar[],int n);         //不会改变数组的值
 void mult_array(double ar[],int n,doubnle mult);  // 会改变数组的值
  //......


 More about const:

1) use const to create symbolic constants
	const double pi=3.14; // 可以用 #define pi 3.14

2) use const to create constant arrays,constant pointers,and pointers to constant.
#define MONTHS 12
const int days[MONTHS]={31,28,31,30,31,30,31,31,30,31,30,31};
days[9]=44; // 编译错误,不可以改变常量的值

...
double rates[5]={88.99,100.12,59.45,183.11,1340.5};

//  下面,这就是所谓的常量指针,就是指向常量的指针.  内容不可变,地址可变.
const double *pd = rates; // pointer to constant,数组名rates 是个地址常量.
*pd = 29.88; // not allowed
pd[2] = 222.22; // not  allowed
rates[0]=99.99 // allowed becasue rates is not const
pd++; // make pd point to rates[1]--allowed , 操作指针本身又可以


pointer-to-constant :常量指针通常用做函数的形参,表示使用该pointer不会改变实参的值
void show_array(const double *ar,int n);

若干使用小结:

1.  pointer-to-constant : 这种指针只能用于修改地址,而不可以修改内容
 允许 把常量数据或者非常量数据的地址赋予 pointer-to-constant(常量指针)
double rates[5]={88.99,100.12,59.45,183.11,1340.5};
const double locked[4]={0.08,0.07,0.06,0.05};
const double *pd=rate;  // const 限定的变量在定义的时候必须初始化,这条语句不可以分开写.

pd=locked;		//valid
pd=&rates[2];	//valid
show_array(rates,5); //valid
show_array(locked,4)  //valid

2. constant pointer :  这种指针只能用于修改内容,不能修改地址
double rates[5]={88.99,100.12,59.45,183.11,1340.5};
double * const pd=rates; 	// valid, 因为 rates 是个地址常量

pd=&rates[1];  //  not allowed
*pd= 99.00     //  valid  ,虽然地址不可变,但是内容是可以变的


3. 使用2次 const 创建的指针,既不能修改地址(初始化后)也不能修改内容

double rates[5]={88.99,100.12,59.45,183.11,1340.5};
const double * const pd =rates;	// valid, 因为 rates 是个地址常量
pd=&rates[1];  //  not allowed
*pd= 99.00     // not allowed


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值