在编写处理诸如int这样基本类型的函数时,可向函数传递int数值,也可传递int型的指针,通常我们直接传递数值;只用在需要在函数中改值时,我们才传递指针。
对于处理数组的函数,只能传递指针,这样可使程序的效率更高。
如果通过值向函数传递数组,则函数中必须分配足够存放一份原数组的拷贝的存储空间,然后把原数组的所用数据复制到这个新数组中。如果简单的把数组的地址传递给函数,然后让函数直接读写原数组,程序的效率会更高.
然而这种技术也会带来一些问题。通常C传递数据的值,其原因是要保证原始数据的完整性。函数使用原始数据的拷贝,这样就不会意外的修改原始数据。但是,由于处理数组的函数直接操作原始数据,所以他能修改原始数据。通常我们在使用数组时做参数时并不希望修改数组的值,如编写一个显示数组所有元素值的函数show_array(double ar[]),然而若在函数中不小心修改了数组的值,可能会违背写这个函数的目的。
ANSI C中提供了一个解决此问题的方法。如果设计意图是函数不改变数组的内容。那么可以在函数原型和定义的形式参数声明中使用关键字const。
下面的例子中有两个函数。
#include<stdio.h> #define SIZE 5 void 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。