【问题标题】:Indexing in c, differences between declaration and assigning [duplicate]c中的索引,声明和分配之间的区别[重复]
【发布时间】:2022-01-16 11:52:55
【问题描述】:

既然 C 从零开始计数,为什么在这种需要 2 行和 5 列的二维数组的情况下,它不是grades[1][4],而是写为grades[2][5]

查看示例:

#include <stdio.h>

        int main() {
        int grades[2][5]; <-------???? why not [1][4]???
        float average;
        int i;
        int j;

        grades[0][0] = 80;
        grades[0][1] = 70;
        grades[0][2] = 65;
        grades[0][3] = 89;
        grades[0][4] = 90;

        grades[1][0] = 85;
        grades[1][1] = 80;
        grades[1][2] = 80;
        grades[1][3] = 82;
        grades[1][4] = 87; <--- why not until [2][5] too????

        for (i = 0; i < 2; i++) {
            average = 0;
            
            for (j = 0; j < 5; j++) {
                average += grades[i][j];
            }

            average /= 5.0;
            printf("The average marks obtained in subject %d is: %.2f\n", i, average);
        }

        return 0;
    }

【问题讨论】:

  • 声明表示维度的大小;索引表示相对于维度基础的位置。它们不是一回事。
  • @WhozCraig:这说明了规则是什么,但并没有真正回答原因。指定在 C 语言中,声明将指定最后一个元素索引而不是元素的数量,没有数学或技术障碍。此外,由于 K&R 将声明作为事物使用时的“图片”(例如,int *p 表示 *p 将用作 int),那么 int a[2] 将通过说 @ 更适合此模型987654328@将用作int,因此数组中必须有一个索引为2的元素,而不是说a[something]将用作int,但2是一个大小。

标签: arrays c multidimensional-array indexing declaration


【解决方案1】:

这样的声明

int grades[1][4];

只会让代码的读者感到困惑。

此声明

int grades[2][5];

明确地告诉代码的读者有多少行和列。

在这种情况下,有效的索引范围是 [ 0, 2 )[ 0, 5 )

在许多编程语言中,指定范围的方式是,第一个值指定范围的开头,第二个值指定范围内可接受值之后的值,如 [N1, N2 ) 在这种情况下,如果 N1 等于N2 则表示范围为空。

【讨论】:

    猜你喜欢
    • 2016-04-20
    • 2014-11-21
    • 2011-05-23
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 2018-12-21
    • 1970-01-01
    相关资源
    最近更新 更多