首页 > 解决方案 > 为什么函数可以更改数组的值而 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");
    }
} 

标签: c

解决方案


除非它是sizeofor 一元运算符的操作数&,或者是用于在声明中初始化字符数组的字符串文字,否则“array of”类型的表达式T将被转换(“decay”)为“pointer to”类型的表达式T",表达式的值将是数组第一个元素的地址。

用简单的英语来说,当你传递grade_table到时read_data,你实际上传递了一个指向第一个元素的指针,所以对grade_table2in的任何更新都会read_data反映在grade_tablein 中main

在函数参数声明的上下文中,T a[N]并被T a[]解释为T *a. 请注意,这仅适用于函数参数。

此“衰减”规则适用于数组表达式。 struct并且union参数像任何标量类型( , 等)一样按值int传递float


推荐阅读