在编写处理int这样的基本类型的函数时,可以向函数传递int数值,也可以传递指向int的指针
通常直接传递int数值,只有需要在函数中修改该值时,才传递指针
对于处理数组的函数,只能传递指针,这样能使程序效率更高
如果通过值向函数传递数组,函数中必须分配足够存放一份原数组的拷贝的存储空间,然后把原数组的所有数据复制到这个新数组中
如果简单地把数组的地址传递给函数,让函数直接读写原数组,程序的效率会更高
传递指针与传递数值相比,会引入新问题:
通常C传递数据的值,其原因是为了保证原始数据的完整性;函数使用原始数据的一份拷贝,不会出现意外修改原始数据的情况出现
由于处理数组的函数直接对原始数据进行操作,使其能够修改原数组
在很多应用场景下,这种特性正式所需要的;然而也存在一些应用场景,并不希望原数组被修改
一、对形式参量使用const
ANSI C中,如果设计意图是不希望函数改变数组的内容,则在函数原型和定义的形式参量声明中使用关键字const
关键字const告知编译器:函数应当把指针所指向的数组作为包含常量数据的数组对待;如果意外地对数组元素进行了修改,编译器将会报错
这样使用const并不要求原始数组是固定不变的,只是说明函数在处理数组时,应当把数组当做是固定不变的
示例代码:
#include <stdio.h>
#define SIZE 10
void show_arr(const int arr[], int n);
void mult_arr(int arr[], int m, int f);
int main(void)
{
int arr[SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
printf("原始数组:\n");
show_arr(arr, SIZE);
mult_arr(arr, SIZE, 10);
printf("新数组:\n");
show_arr(arr, SIZE);
return 0;
}
void show_arr(const int arr[], int n)
{
int i;
for(i = 0; i < n; i++)
{
printf("%4d", arr[i]);
}
printf("\n");
}
void mult_arr(int arr[], int n, int f)
{
int i;
for(i = 0; i < n; i++)
{
arr[i] *= f;
}
}
运行结果:
二、const的使用
使用const创建符号常量
const double PI = 3.14; // 也可以用#define指令实现
#define PI 3.14
使用const创建数组常量、指针常量及指向常量的指针
const int array[5] = {1, 2, 3, 4, 5}; // 数组常量
指向常量的指针:
int array[5] = {1, 2, 3, 4, 5};
const int * p = array; // p指向数组开始处
// 指向常量的指针不能用于修改数值
无论是采用数组符号还是指针符号,都不能使用指向常量的指针修改所指向数据的值
通常把指向常量的指针用作函数参量,以表明函数不会用该指针修改数据,如
void show_arr(const int * arr, int n);
将常量或非常量的数据的地址赋给指向常量的指针时合法的;只有非常量数据的地址才可以赋给普通的指针
在函数参量定义中使用const,不仅可以保护数据,而且使函数可以使用声明为const的数组
const用于声明并初始化指针,可以保证指针不会指向别处
int array[5] = {1, 2, 3, 4, 5};
int * const p = array; // p指向数组开始处
// 可以用于修改数据,但只能指向最初赋给其的地址
可用用两个const创建指针,该指针既不可以更改所指向的地址,也不可以修改所指向地址的数据:
int array[5] = {1, 2, 3, 4, 5};
const int * const p = array;