主函数中的数组大小是动态的,printArr函数的数组大小是固定的
重点:形参中不存在数组的概念,即便中括号约定了数组的大小也无效。
传递的是地址是数组的首地址
在操作系统中用8个字节来表示一个地址
数组名代表数组的首地址,第一个元素的地址也是数组的首地址
数组实参很有意思的问题启发
思考切入点:1.形参的生命周期2.形参和实参是两个不同变量3.最重要的一点:数值传递操作的是不同内存空间
数组作为形参,操作的是相同的内存空间!!!
0x1234[0]=data[0]
数组实战之计算不同班级学生的平均值
有两个班的同学,分别是10个人和5个人,分别求这两个班的平均分
#include<stdio.h>
void InitArry(int Arry[],int len)
{
int i;
printf("请输入%d个学生的成绩\n",len);
for(i=0;i<len;i++)
{
scanf("%d",&Arry[i]);
}
}
void printArr(int Arry[],int len)
{
int i;
printf("%d个学生的成绩分别是:\n",len);
for(i=0;i<len;i++)
{
printf("%d ",Arry[i]);
}
printf("\n");
}
float getAverage(int Arry[],int len)
{
int i;
float sum=0;
int ave;
for(i=0;i<len;i++)
{
sum=sum+Arry[i];
}
ave=sum/len;
return ave;
}
int main()
{
int classOne[5];
int classTwo[10];
float aveofclassone;
float aveofclasstwo;
int lenofclassone=sizeof(classOne)/sizeof(classOne[0]);
int lenofclasstwo=sizeof(classTwo)/sizeof(classTwo[0]);
InitArry(classOne,lenofclassone);
InitArry(classTwo,lenofclasstwo);
printArr(classOne,lenofclassone);
printArr(classTwo,lenofclasstwo);
aveofclassone=getAverage(classOne,lenofclassone);
aveofclasstwo=getAverage(classTwo,lenofclasstwo);
printf("一班的平均分是%f\n 二班的平均分是%f\n",aveofclassone,aveofclasstwo);
}
二维数组与函数
-
练习:有3x4矩阵,初始化它并输出,然后求最大值并输出
-
#include<stdio.h> void scanfArryDouble(int arr[][4],int hang,int lie) { int i,j; puts("请按3x4的形式输入数字矩阵"); for(i=0;i<hang;i++) { for(j=0;j<lie;j++) { scanf("%d",&arr[i][j]); } } } int maxarr(int arr[][4],int hang,int lie) { int i,j; for(i=0;i<hang;i++) { for(j=0;j<lie;j++) { if(arr[i][j]>arr[0][0]) { arr[0][0]=arr[i][j]; } } } return arr[0][0]; } int main() { int arr[3][4]; int max; scanfArryDouble(arr,3,4); max=maxarr(arr,3,4); printf("最大值是%d\n",max); return 0; }
局部变量和全局变量(外部变量)
-
#include<stdio.h> int p=100; int q=90; void fun1() { printf("fun1:%d %d\n",p,q); } void fun2() { printf("fun2:%d %d\n",p,q); } int main() { fun1(); fun2(); printf("main:%d %d\n",p,q); }
全局变量是定义在所有函数之前的外部变量,不然不起效。
全局变量实战
-
班上10 个学生,封装一个函数,调用该函数后获得班上的平均分,最高分,最低分
#include<stdio.h> int max; int min; int getResult(int arr[],int len) { int i; int sum=0; max=min=arr[0]; for(i=0;i<len;i++) { if(max<arr[i]) { max=arr[i]; } if(min>arr[i+1]) { min=arr[i]; } sum=sum+arr[i]; } return (float)sum/len; } int main() { int scores[]={23,45,25,65,43,78,100,98}; float aver; aver=getResult(scores,sizeof(scores)/sizeof(scores[0])); //函数调用的目的:调用者通过调用函数获得某些结果 printf("最大值是%d 最小值是%d 平均值是%f\n",max,min,aver); }
作业
-
1. 要求输入10个数,找出最大数以及最大数的下标
-
2. 封装冒泡排序的函数
-
3. 封装选择排序的函数