一、一维数组作为函数参数

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;
}

 

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐