c - 为什么函数可以更改数组的值而 main() 可以看到更改?
问题描述
我有以下内容。
当我通过值给数组read_data
赋值时,可以读取数组的值main()
而不read_data
返回任何内容。数组是否
grade_table2
指向内存中的相同地址grade_table
?
#include <stdio.h>
#define NUM_STUDENTS 3
#define NUM_COURSES 2
void read_data(float grade_table2[][NUM_COURSES])
{
int i,j;
for(i=0;i<NUM_STUDENTS;++i)
for(j=0;j<NUM_COURSES;++j)
scanf("%f",&grade_table2[i][j]);
}
int main()
{
float grade_table[NUM_STUDENTS][NUM_COURSES];
float average_per_student[NUM_STUDENTS];
float average_per_course[NUM_COURSES];
int i,j;
read_data(grade_table);
for(i=0;i<NUM_STUDENTS;++i){
for(j=0;j<NUM_COURSES;++j)
printf("%.2f ",grade_table[i][j]);
printf("\n");
}
}
解决方案
除非它是sizeof
or 一元运算符的操作数&
,或者是用于在声明中初始化字符数组的字符串文字,否则“array of”类型的表达式T
将被转换(“decay”)为“pointer to”类型的表达式T
",表达式的值将是数组第一个元素的地址。
用简单的英语来说,当你传递grade_table
到时read_data
,你实际上传递了一个指向第一个元素的指针,所以对grade_table2
in的任何更新都会read_data
反映在grade_table
in 中main
。
在函数参数声明的上下文中,T a[N]
并被T a[]
解释为T *a
. 请注意,这仅适用于函数参数。
此“衰减”规则仅适用于数组表达式。 struct
并且union
参数像任何标量类型( , 等)一样按值int
传递float
。
推荐阅读
- python - 如何将张量转换为numpy数组matmul的结果
- r - R - 使用 ~ 将 ggplot2 指定为数据的函数
- swagger - 如何保持 access_token 参数不登录以进行下一个帖子请求
- python - 在 Django 项目中包含 ffmpeg
- elasticsearch - 从 NEST 中的索引名称推断弹性搜索类型
- mysql - 为什么数据库要在 Linux 上创建操作系统用户?
- reactjs - 在 PhpStorm 中使用 JSX 的 Emmet
- mongodb - 我在 mongoDb 中有一个集合。我想获取该集合中的前 10 个文档并将其放入 mongoDB 的另一个集合中
- git - 如何删除源树上的远程分支?
- java - 从(子)目录中的文件中读取文本