一、一维数组作为函数参数
1.数组名当做函数实际参数,也是值传递,不过是传递的地址而已。
#include <stdio.h>
void printArr(int arry[],int len)//形参中不存在数组的概念,即便中括号约定了数组的大小,也无效
//传递的是一个地址,是数组的首地址
{
int i;
printf("printArr:arry的大小是:%d\n",sizeof(arry));//在OS用8个字节来表示一个地址
for(i=0;i<len;i++){
printf("%d ",arry[i]);
}
putchar('\n');
}
int main()
{
int len;
int arry[5] = {1,2,3,4,5};
len = sizeof(arry)/sizeof(arry[0]);
printf("main:arry的大小是:%d\n",sizeof(arry));
printArr(arry,len);//数组名代表整个数组的首地址
printArr(&arry[0],len);//首元素地址也代表整个数组首地址
return 0;
}
2.变量的值传递&内存空间(地址)传递
#include <stdio.h>
void changeData(int data)//数值传递,操作的是不同的内存空间
{
data = data + 100;
printf("address:%p,dataInFunc = %d\n",&data,data);
}
int main()
{
int data = 10;
changeData(data);
printf("address:%p,data = %d\n",&data,data);
return 0;
}
#include <stdio.h>
void changeData(int data[])//操作的是相同的内存空间,数组名作为实参,到底传了什么?(地址)
{
data[0] = data[0] + 100;
printf("dataInFunc = %d\n",data[0]);
}
int main()
{
int data[2] = {10,20};
changeData(data);
printf("data = %d\n",data[0]);
return 0;
}
3.编程案例:有两个班的同学,分别是10个人和5个人,分别求这两个班的平均分
#include <stdio.h>
//初始化数组
void initArry(int arry[],int len)
{
int i;
for(i=0;i<len;i++){
printf("请输入第%d个学生的成绩:",i+1);
scanf("%d",&arry[i]);
}
puts("done");
}
//打印数组
void printArry(int arry[],int len)
{
int i;
printf("总人数%d个\n",len);
for(i=0;i<len;i++){
printf("%d ",arry[i]);
}
puts("\ndone");
}
//计算平均分
float getAverage(int arry[],int len)
{
int i;
float aver = 0.0;
int sum = 0;//总分变量一定要初始化为0,否则默认值是一个大数会影响结果
for(i=0;i<len;i++){
sum = sum + arry[i];
}
aver = (float)sum/len;
return aver;
}
int main()
{
int classOne[5];
int classTwo[10];
int lenOfClassOne = sizeof(classOne)/sizeof(classOne[0]);
int lenOfClassTwo = sizeof(classTwo)/sizeof(classTwo[0]);
float averOfClassOne;
float averOfClassTwo;
initArry(classOne,lenOfClassOne);
initArry(classTwo,lenOfClassTwo);
printArry(classOne,lenOfClassOne);
printArry(classTwo,lenOfClassTwo);
averOfClassOne = getAverage(classOne,lenOfClassOne);
averOfClassTwo = getAverage(classTwo,lenOfClassTwo);
printf("一班的平均成绩是%.2f\n",averOfClassOne);
printf("二班的平均成绩是%.2f\n",averOfClassTwo);
return 0;
}
二、 二维数组作为函数参数
1.形参怎么写?
合法写法:int arr[2][3]、int arr[ ][3];
不合法写法:int arr[ ][ ]
2.关心两点:(1)数组数据类型;(2)二维中的一维数组有多少个
3.编程示例
#include <stdio.h>
void printDoubleArry(int arry[][3])
{
int i;
int j;
for(i=0;i<2;i++){
for(j=0;j<3;j++){
printf("%d ",arry[i][j]);
}
putchar('\n');
}
}
int main()
{
int arry[2][3] = {{1,2,3},{11,22,33}};//特殊的一维数组,每个元素又是一个数组,大小确定
printDoubleArry(arry);
return 0;
}
4.编程案例:有3x4矩阵,初始化它并输出,然后求最大值并输出
#include <stdio.h>
//初始化数组
void initDoubleArry(int arr[][4],int hang,int lie)
{
int i;
int j;
for(i=0;i<hang;i++){
for(j=0;j<lie;j++){
printf("请输入第%d行,第%d列的数据:\n",i+1,j+1);
scanf("%d",&arr[i][j]);
}
}
puts("done");
}
//打印数组
void printDoubleArry(int arr[][4],int hang,int lie)
{
int i;
int j;
for(i=0;i<hang;i++){
for(j=0;j<lie;j++){
printf("%d ",arr[i][j]);
}
putchar('\n');
}
}
//获取数组中元素最大值
int getMaxDataFromDoubleArry(int arr[][4],int hang,int lie)
{
int i;
int j;
int max;
max = arr[0][0];
for(i=0;i<hang;i++){
for(j=0;j<lie;j++){
if(max < arr[i][j]){
max = arr[i][j];
}
}
}
return max;
}
int main()
{
int arr[3][4] ;//特殊的一维数组,每个元素又是一个数组,大小确定
int max;
initDoubleArry(arr,3,4);
printDoubleArry(arr,3,4);
max = getMaxDataFromDoubleArry(arr,3,4);
printf("二维数组中最大的值是%d\n",max);
return 0;
}