对形式参数使用const
? ? ?在编写处理诸如int这样基本类型的函数时,可向函数传递int数值,也可传递int型的指针,通常我们直接传递数值;只用在需要在函数中改值时,我们才传递指针。
? ? ?对于处理数组的函数,只能传递指针,这样可使程序的效率更高。
? ? ?如果通过值向函数传递数组,则函数中必须分配足够存放一份原数组的拷贝的存储空间,然后把原数组的所用数据复制到这个新数组中。如果简单的把数组的地址传递给函数,然后让函数直接读写原数组,程序的效率会更高.
? ? ?然而这种技术也会带来一些问题。通常C传递数据的值,其原因是要保证原始数据的完整性。函数使用原始数据的拷贝,这样就不会意外的修改原始数据。但是,由于处理数组的函数直接操作原始数据,所以他能修改原始数据。通常我们在使用数组时做参数时并不希望修改数组的值,如编写一个显示数组所有元素值的函数show_array(double ar[]),然而若在函数中不小心修改了数组的值,可能会违背写这个函数的目的。?
? ? ? ANSI C中提供了一个解决此问题的方法。如果设计意图是函数不改变数组的内容。那么可以在函数原型和定义的形式参数声明中使用关键字const。
下面的例子中有两个函数。
?
#include<stdio.h>#define SIZE 5void show_array(const double ar[],int n);//显示所有元素,使用了const关键字void mult_array(double ar[],int n,double mult); //修改数组中的元素int main(int argc,char *argv[]){double dip[SIZE] = {20.0,17.66,8.2,4.5,2.3};printf("the original idp array:\n");show_array(dip,SIZE);mult_array(dip,SIZE,2.5);printf("the dip array after calling mult_array():\n");show_array(dip,SIZE);return 0;}//显示数组内容void show_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;}?
?说明:
void show_array(const double ar[],int n);//原型
?
?
?
//定义void show_array(const double ar[],int n){int i;for(i = 0;i < n; i++)printf("%8.3f",ar[i]);putchar('\n');}?
?
? 这告知编译器:函数应当把ar所指向的数组作为包含常量数组的数组对待。这样,如何在函数中不小心改变了数组元素的值,编译器会报错,通知函数视图修改常量。
?
?
?
总之,如果函数想修改数组的值,那么在函数声明和定义时不使用const,如何不想修改数组的值,则最好在声明数组参数是使用const。
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?