本文主要展示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; // 不允许
网友评论