xdoj-指针221 统计成绩(二维数组作为函数变量)

二维数组作为函数变量

1.函数在声明时需采用void function(int (*)[n])的格式
2.如果想把二维数组整体引用到函数函数中,应该这样定义:
void function(int (*p)[n]);
void function(int str[ ][n]);
void function(int **str);(大概?没试过)
题目描述:
标题
成绩处理

描述
输入5个学生,4门课成绩,二维数组stu[5][4]表示,行标表示学生,列标表示课程成绩,分别编写函数aver()、fals()和well()完成:
(1)求第一门课的平均分;(2)统计有2门以上课程不及格的同学人数;(3)平均成绩在90分以上或者全部课程成绩在85分以上的同学视为优秀,统计人数,使用指针完成地址传递,主函数完成数组输入和输出。

时间限制
1

内存限制
10000

类别
1

输入说明
输入二维浮点型数组stu[5][4]

输出说明
输出第一门课程平均分(保留1位小数)、2门以上不及格人数和成绩优秀人数,数据之间空一格。

输入样例
85 73 59 92
93 95 89 88
86 88 88 87
59 51 52 68
78 32 59 91

输出样例
80.2 2 2

提示
注意行列信息。使用指针完成地址传递,主函数完成数组输入和输出。

#include<stdio.h>
int main()
{
   
   
	float stu[5][4];
	float aver(float (*)[4]);
	int fals(float (*)[4]);
	int well(float (*)[4]);
	int<
### 定义方法 在C语言中,当需要将二维数组作为参数传递给函数时,通常有几种常见的方式。一种是直接指定数组的第二维度大小并将其视为指针;另一种则是使用指针数组的形式。 对于第一种情况,可以通过如下声明实现: ```c void func(int (*arr)[N], int rows); ``` 这里`int (*arr)[N]`表示一个指向含有N个整数的一维数组的指针,其中N代表列的数量。这种方式下,编译器能够知道每一行有多少个元素,从而正确解析多维索引。 第二种情况下,则可以采用双重指针(即指向指针指针)的方式来处理动态分配内存的情况下的二维数组: ```c void func(int **arr, int rows, int cols); ``` 这种情形适用于那些每行列数可能不同的稀疏矩阵或其他不规则结构化数据集[^1]. ### 传参注意事项 需要注意的是,在向函数传递二维数组时,除了要提供足够的尺寸信息以便于访问外,还应该注意区分静态和动态分配的区别。如果是静态定义好的固定大小的二维数组,那么可以直接按照上述提到的第一种方式进行传递,并且不需要额外考虑释放资源等问题。然而,若是涉及到堆上动态创建的对象,则需确保遵循良好的实践原则——谁申请的空间就应该由谁负责清理。 另外一个重要点在于理解如何正确定义形参与实参之间的关系。为了能够在被调用方修改原始数据,应当传递实际存储位置而非副本。这也就意味着应尽可能地利用指针机制完成这一过程,而不是简单复制整个数组的内容[^3]. 最后一点值得注意的地方是在某些特定场景下可能会遇到类型匹配方面的问题。比如试图将一个多维数组整体赋值给另一个相同类型的变量时,默认行为会触发深拷贝语义,这意味着两个独立实体之间没有任何关联变化上的同步效果[^4]. ### 示例代码 下面给出一段简单的例子展示怎样正确地把二维数组当作参数来进行传递及其相应的调用方式: ```c #include <stdio.h> // 函数原型:接受一个m*n大小的整形二维数组以及它的行数rows void printMatrix(int matrix[][3], int rows); int main() { // 初始化一个3x3的二维数组 int myArray[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; // 调用printMatrix打印该矩阵 printMatrix(myArray, 3); return 0; } // 实现printMatrix函数体 void printMatrix(int matrix[][3], int rows){ for (int i = 0; i < rows ; ++i) { for (int j = 0; j < 3; ++j) { printf("%d ",matrix[i][j]); } putchar('\n'); } } ``` 此程序展示了如何定义、初始化一个三维数组并将它作为一个参数传递给其他函数以供进一步操作的方法.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值