可以定义一个能接受数组作为函数参数的函数,然后调用这个函数时,可以将一个实际的数组传递给它。
数组作为函数参数时,其定义方式有下列三种:
/*函数名param后跟一个空的[],说明param可以接受一个数组*/
void myFunction(int param[]) {
/*函数体 代码*/
}
/*函数名param后跟一个非空的[size],说明param可以接受一个大小为size的数组*/
void myFunction(int param[]) {
/*函数体 代码*/
}
/*函数名param前有一个*,说明param可以接受一个数组*/
void myFunction(int *param) {
/*函数体 代码*/
}
上述3个函数中,实际上上面2个函数都会被编译器转化为第3个函数,也就是说“数组作为函数的形参”实际上是一个指针类型的形参,即将来可以接受一个数组名表示的数组的起始地址!而并不是将一个数组的所有元素传给一个函数,仅仅传递的是一个小小的指针变量。
比如,我们可定义下面的函数,第一个参数表示可以接受一个传入的数组
double getAverage(int arr[], int size) {
int i;
double avg;
double sum = 0;
for (i = 0; i < size; ++i) {
sum += arr[i];
}
avg = sum / size;
return avg;
}
然后我们可以调用这个数组:
#include <stdio.h>
/* 函数声明,表示存在这种格式的函数getAverage, 其第一个参数可以是一个int型数组,第二个参数是这个数组的大小 */
double getAverage(int arr[], int size);
int main () {
/* 5个元素的int整型数组 */
int balance[5] = {1000, 2, 3, 17, 50};
double avg;
/* 将数组名(实际是数组对应内存块的起始地址)传给getAverage函数 */
avg = getAverage( balance, 5 ) ;
/* 输出getAverage的返回值 */
printf( "Average value is: %f ", avg );
return 0;
}
也可以传递多维数组(如二维数组)给函数,在定义接受这种多维数组的函数参数时,和接受一维数组的函数参数一样,其第一维的大小也可以不指定。同样,如果我们省略第一维对应的方括号[],则要在参数名前加一个‘’。 并用圆括号括起来 “(参数名)”。
#include <stdio.h>
#include <stdlib.h>
const int ROW = 2;
const int COLUMN = 3;
/*这2个函数的定义在main函数的调用语句后面,所以要先声明(说明)函数的规范*/
void fill_array(int (*pm)[COLUMN],int row);
void display(int m[][COLUMN],int row);
int main()
{
int i,j;
int m[ROW][COLUMN];
/* 修改数组元素的值 */
fill_array(m,ROW);
/* 显示数组的元素 */
display(m,ROW);
return 0;
}
void fill_array(int (*pm)[COLUMN],int row)
{
int i,j;
printf("Please fill the array's content:\n");
/* 修改数组元素的值 */
for(i = 0; i < row; i++)
{
for(j = 0; j < COLUMN; j++)
{
printf("\nm[%d][%d]:",i,j);
scanf("%d",&pm[i][j]);
}
}
}
void display(int m[][COLUMN],int row)
{
int i,j;
/* 显示数组的元素 */
printf("Array's content:\n");
for(i = 0; i < row; i++)
{
for(j = 0; j < COLUMN; j++)
{
printf("%d\t",m[i][j]);
}
printf("\n");
}
}
执行程序后的输出:
Please fill the array's content:
m[0][0]:1
m[0][1]:2
m[0][2]:3
m[1][0]:4
m[1][1]:5
m[1][2]:6
Array's content:
1 2 3
4 5 6