// 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