易懂的数组作为函数参数(C语言)
目录
- 易懂的数组作为函数参数(C语言)
- 1、数组做函数参数
- 2、通过形参数组修改数组元素
- 3、数组排序
1、数组做函数参数
(1)、若将一个数组作为实际参数传递给函数,只需不带方括号的数组名即可
若数组a的定义为:int a[10];
若要将数组a作为实参传递给被调用函数SumArr(),
则调用语句可写成:SumArr(a,10);
数组名代表数组首元素的地址,因此数组名做参数就可以将数组的起始地址传递给形参。另外需要将数组元素的个数也传递给被调用的函数。
函数SumArr()的函数原型如下:
int SumArr( int b[],int n )
//表示函数SumArr()期望用形参b来接收一个整型的数组,用形参n来接收数组元素的个数
程序1.1:调用函数SumArr()计算累加和
#include<stdio.h>
int SumArr(int arry[],int n);int main()
{int a[5] = {1,4,5,7,9};//求数组a中前5个数的和printf("%d\n",SumArr(a,5));return 0;
}int SumArr(int arry[],int n)
{int sum = 0;for(int i = 0;i < n;i++)sum +=arry[i];return sum;
}
(2)、形参数组与实参数组为同一数组
- 因为数组名是代表该数组的首地址,用数组名作实参时,是把实参数组的首地址赋给形参。
- 实际上形参数组和实参数组为同一数组,共同拥有一段内存空间。
(3)、参数声明
(1)、在声明形参数组时,数组元素的个数不需要写在方括号中,如:
int SumArr(int array[],int n)
{...}//即便方括号中出现数字,编译器也将忽略该数字。在编译器看来,形参array不是一个真正的数组,只是一个可以存放地址的指针变量
(2)、向函数传递数组的时候,同时通过参数传递数组的元素的个数,有利于提高函数的通用性。
SumArr(a,5);//计算数组a的前5个元素之和
SumArr(a,3);//计算数组a的前3个元素之和
2、通过形参数组修改数组元素
一般变量作参数:传递的是数值,形参的值的改变不影响实参
数组做参数:传递的是数组的首地址,形参数组和实参数组实质上是同一块内存空间,形参数组发生改变,实参数组也随之发生改变。
程序2.1:通过调用函数ModifyArr(),将main()函数中数组a的每个元素变为原来的10倍。
a、通过函数修改数组元素
#include<stdio.h>
void ModifyArr(int arry[],int n);//每个元素变成10倍的函数原型int main()
{int i;int a[5] = {1,2,3,4,5};printf("原先的数组各元素分别是:\n");//未改变前输出for(i = 0;i < 5;i++)printf("%d\n",a[i]);ModifyArr(a,5);//调用函数改变元素值printf("变为原来的10的元素分别是:\n");//改变后输出for(i = 0;i < 5;i++)printf("%d\n",a[i]);return 0;
}void ModifyArr(int arry[],int n)
{for(int i = 0;i < n;i++)arry[i] *= 10;
}
b、把输出数组元素功能也包装成函数
#include<stdio.h>
void ModifyArr(int arry[],int n);//每个元素变成10倍的函数原型
void Print(int arry[],int n);//输出函数的原型int main()
{int i;int a[5] = {1,2,3,4,5};printf("原先的数组各元素分别是:\n");Print(a,5);//调用输出函数ModifyArr(a,5);//调用改变元素函数printf("变为原来的10的元素分别是:\n");Print(a,5);//调用输出元素return 0;
}void ModifyArr(int arry[],int n)
{for(int i = 0;i < n;i++)arry[i] *= 10;
}void Print(int arry[],int n)
{int i;for(i = 0;i < n;i++)printf("%d\n",arry[i]);
}
3、数组排序
给一个n个元素的数组进行升序,然后再依次输出:分别使用InputArr(),SortArr(),DispArr()实现数组的输入、排序、输出
#include<stdio.h>
#define N 20void InputArr(int arry[],int n);//输入元素的函数原型
void SortArr(int arry[],int n);//排序函数原型
void DispArr(int arry[],int n);//输出函数的原型int main(void)
{int n;int a[N];printf("Please enter the integers number:\n");scanf("%d",&n);InputArr(a,n);//输入n个元素存入数组中SortArr(a,n);//给n个元素进行升序DispArr(a,n);//输出n个元素return 0;
}void InputArr(int arry[],int n)
{int i;printf("Please enter the numbers:\n ");for(i = 0;i < n;i++)scanf("%d",&arry[i]);
}void SortArr(int arry[],int n)
{int i;int j;int temp;for(i = 0;i < n-1;i++){for(j = i+1;j < n;j++){if(arry[i] > arry[j]){temp = arry[i];arry[i] = arry[j];arry[j] = temp;}}}
}void DispArr(int arry[],int n)
{int i;printf("Please display the integers:\n");for(i = 0;i < n;i++)printf("%d\n",arry[i]);
}