const的高级用法

本文主要展示constant数组、constant指针和指向constants的指针的用法。

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, 340.5};
const double * pd = rates;    // pd points to beginning of the array   

/*
上面代码的第二行将pd指针指向的对象为const类型,这意味着你不能**使用pd指针**来改变pd所指向的对象的值:
*/
*pd = 29.89;      // 不允许
pd[2] = 222.22;   // 不允许
rates[0] = 99.99; // 允许,因为rates数组不是const类型


//在上面的例子中,不管使用指针标记法(*pointer)还是数组标记(pointer[i]),
//你都不能使用指针pd改变所指向内容的值。但是,rates没有被声明//为const,
//所以你仍然可以使用rates来改变数值。当然,你可以让pd指向其它位置:

pd++;       /*使pd指向rates[1],允许*/   

/*指向常量的指针用作函数的形参时,表明函数不打算用指针改变数据。例如,
函数*/void show_array(const double ar[], int n);/*可以声明为这样的形式*/:void show_array(const double *ar, int n);   
/*
可以将非常量数据或者常量数据的地址赋给指向常量的指针:
*/
double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5};
const double locked[4] = {0.08, 0.075, 0.0725, 0.07};
const double * pc = rates;    // 合法
pc = locked;                  // 合法
pc = &rates[3];               //合法  

/*然而只有非常量的数据的地址可以赋给普通的指针:*/
double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5};
const double locked[4] = {0.08, 0.075, 0.0725, 0.07};
double * pnc = rates;          // 合法
pnc = locked;                  // 不合法
pnc = &rates[3];               // 合法  

/*函数show_array()可以接收普通的数组或者常数组作为实参,因为二者的地址都可以赋给指向常量的指针:*/
show_array(rates, 5);    // 合法
show_array(locked, 4);   // 合法   

/*
因此,使用在函数声明时使用const不仅可以保护数据,还允许函数接收常数组。像下面的函数
mult_array()不能接收常数组的地址:
*/
mult_array(rates, 5, 1.2);    // 合法
mult_array(locked, 4, 1.2);   // 不合法  

show_array()原型为void show_array(const double ar[], int n);
或者void show_array(const double*, int );
mult_array()函数原型为void mult_array(double ar[], int n, double mult);
函数原型可以参考数组形参文章

下面是关于const的更多用法,比如,声明和初始化指针时使指针只能指向一个地方,而声明方式有点戏剧性,只是和const的位置和上面例子中的不一样:
double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5};
double * const pc = rates; // pc指向数组的首地址
pc = &rates[2]; // 不合法,pc不能指向其它地方
*pc = 92.99; // 合法,pc的值不能变但是指向的对象的值能变
这样的指针依然可以改变指向的对象的值,但是它只能指向最初被赋予的位置。
如果你希望指针值和指针指向的值不变,你可以使用两个const

double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5};
const double * const pc = rates;`
pc = &rates[2];               // 不允许
*pc = 92.99;                  // 不允许  

你可能感兴趣的:(const的高级用法)