C Primer Plus学习 二十二 指针操作对形式参量使用const

本文介绍如何使用const关键字保护数组和指针,防止函数无意中修改数据。通过示例代码展示了const在函数参数中的应用,以及如何正确使用const来增强代码的安全性和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在K&RC中,避免此类销误惟一的方法就是箐惕不出错。ANSI C中有另一种方法。如果设计意图是函数不改变数组的内容,那么可以在函数原型和定义的形式参量声明中使用关键字const。例如sum ()的原型和定义应该如下:
int sum (const int ar[],int n)i /* 原型 */
int sum (const int ar[],int n) /* 定义 */
{
int ii
int total = Os
for (i = 0i i < m i++) total += ar[i];
return totali

}

这告知編译雜:函数应当把ar所指向的数组作为包含常量数据的败组对待。这样,如果您意外地使用了诸如ar[i]++之类的表达式,編译器将会发现这个错误并生成一条错误消息,通知您函数试图修改常量。
需要理解的是这样使用const并不要求原始数组是固定不变的:这只是说明函数在处理败组时,应把 数组当作是固定不变的。使用const可以对数组提供保护,就像按值传遒可以对基本类型提供保护一样, 可阻止函败修改调用函数中的敫据。总之,如果函数想修改数组,那么在声明数组参量时就不要使用const: 如果函数不需要修改数组,那么在声明数组参量时最好使用const。
请参看程序淸单10.14中的程序,其中一个函数显示数组,另一个函数对数姐的每个元索乘上一个给定 的数值。因为第一个函数不需要修改数组,所以使用const,因为第二个函数需要修改数组,所以不使用const。

/* arf.c --处理数组函数  P276*/
#include <stdio.h>
#define SIZE  5
void sho_array(const double ar[],int n);//const使数组变成常量,不可修改
void mult_array(double ar[],int n,double mult);

int main(void)
{
double dip[SIZE]={21,32.3,22,12,32.1};


printf("the original dip array:\n");
sho_array(dip,SIZE);
mult_array(dip,SIZE,2.5);
printf("the dip array after calling mult_array():\n");


sho_array(dip,SIZE);


return 0;
}
/*显示数组内容*/
void sho_array(const double ar[],int n)
{
int i;
for (i=0;i<n;i++)
{
printf("%8.3f",ar[i]);
}
putchar('\n');
}
/*用同一乘数去乘每个数组元素*/
void mult_array(double ar[],int n,double mult)
{
int i;
for (i=0;i<n;i++)
{
ar[i]+=mult;
}
}
前面我们讲过可使用const来创建符号常量:
const double Pi = 3.14159;
以上也可以使用#define指令实现。但使用const还可以创建数组常貴、指针常置以及指向常量的指针。 程序淸单10.4说明了使用关键字const保护数组的方法:
#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, 340,5); 

const double * pd = rates: // pd指向数组开绐处

第二行代码把pc声明为指向const double的指针。这样,就不可以使用pc来修改它所指向的数值。
* pd 二 29.89: // 不允许
pd[2] = 222.22; // 不允许
rates[ 0] - 99.99; //允许,因为rates不是常量
无论是采用数组符号还是指针符号,都不能使用pd修改所指向数据的值。但请注意因为rates并没有 声明为常量,所以仍可以使用rates来修改其数值。另外要注意,还可以让pc指向其他地址:
pd++: /*让pd指向 rat:es[1]-这是允许的 */
通常把指向常量的指针用作函数参量,以表明函数不会用这个指针来修改数据。例如,程序清单10.14 中函数show_array ()的原型可以如下定义:
void show_array (const double *ar. mt n):
关于指针陚值和const有一些规则需要注意。首先,将常量或非常量数据的地址陚给指向常量的指针 是合法的:

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.08t 0.075- 0.0725- 0.07}: 

double * pnc = rates: // 合法
pnc = locked: // 非法
pnc ^ &rates[3] : // 合法
这样的规则是合理的。否则,您就可以使用指针来修改被认为是常量的数据。
这些规则的实践结果是:像show_array ()这样的函数可以接受普通数组和常量数组的名称作为实际 参数,因为两种参数都可以陚给指向常量的指针:
show_array (rates, 5); // 合法
show_array (locked, 4): // 合法
但是,像mullarray ()这样的函数不能接受常量数组的名称作为参数:
mult_array (rates, 5,1.2): // 合法
mulc—array (locked,4,1.2): // 不允许
因此,在函数参量定义中使用const,不仅可以保护数据,而且使函数可以使用声明为const的数组。 const还有很多用法。例如:您可以使用关键字const来声明并初始化指针,以保证指针不会指向别处, 关键在于const的位置:

double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5};
double * const pc = rates: // pc 指向数组的开始处
pc = &rates[2]; // 不允许
*pc = 92.99; // 可以,更改 rates[0]的值
这样的指针仍然可用于修改数据,但它只能指向最初陚给它的地址。
最后,可以使用两个const来创建指针,这个指针既不可以更改所指向的地址,也不可以修改所指向 的数据:
double rates[5] = f88.99, 200.12, 59.4,c), 183.11, 340.5}:

 const double * const pc = rates:

 pc = &rates[2]; // 不允许

 *pc = 92.99; // 不允许





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值