一起学习C语言:数组(二)

  上一篇 <一起学习C语言:数组(一)> 中,我们了解了一维数组语法和一维字符数组的应用场景。本篇文章中,我们分析二维数组语法,并通过二维数组示例来了解二维数组的初始化赋值、存储方式。


章节预览:


4. 二维数组的声明
5. 二维数组的初始化赋值
6. 二维整数类型数组使用
目录预览

章节内容:


4. 二维数组的声明

  二维数组属于一个具有固定大小,元素类型相同的一维数组顺序集合。二维数组通过指定元素类型、变量名、一维数组个数 (5) 、一维数组元素个数 (6),完成使用前的声明。

    二维数组的声明形式

        元素类型 变量名[一维数组个数][ 一维数组元素个数];

    二维数组的声明举例

        int a[5][2];
        char a[5][2];
        float a[][2] = {0.1, 0.2};


  (5):一维数组个数,即二维数组的元素个数,表示二维数组的成员数量。二维数组成员也是从下标0 (7) 开始,即[0],表示二维数组的第一个(一维数组)成员。

  (6):一维数组元素个数,即二维数组每个成员的元素个数,表示二维数组中的一维数组成员数量,数组成员从下标0开始,即[0][0],表示二维数组的第一个成员的第一个成员。一维数组元素个数是大于0的常量整数,比如1、1 + 1,也可以是大于0的宏常量整数。

  (7):二维数组中包含一维下标和二维下标。比如a[5],它属于一维下标,它的下标范围在0-4,可以访问二维数组中第一个至第五个成员;a[n][2],它属于二维下标,它的下标范围在0-1,可以访问二维数组中第n个成员的第一个至第二个成员。


5. 二维数组的初始化赋值

  二维数组声明时的初始化,可以按整行赋值、分段赋值,也可以混合赋值。此外,二维数组声明时可以不指定一维下标个数(一维数组个数),但必须初始化赋值。

    二维数组整行初始化赋值

        float a[5][2] = {1.1}; //转换到第一个成员中的第一个成员(a[0][0])赋值为1.1,其余的成员a[0][1]、a[1][0]、a[1][1]…a[4][1] 自动赋值为0.0

        float a[5][2] = {0.0}; //转换到第一个成员中的第一个成员(a[0][0])赋值为0.0,其余的成员a[0][1]、a[1][0]、a[1][1]…a[4][1] 自动赋值为0.0,这种方式可以看做数组中的所有成员中的成员值清零

        float a[5][2] = {1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0}; //转换到所有成员中的成员赋值

        float a[][2] = {1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9}; //转换到成员a[0][1]、a[1][0]、a[1][1]…a[4][0]按顺序赋值,a[4][1]自动赋值为0.0,一维下标个数为5


    二维数组分段初始化赋值

        float a[5][2] = {{1.1}}; //只为第一个成员中的第一个成员(a[0][0])赋值为1.1,其余的成员a[0][1]、a[1][0]、a[1][1]…a[4][1] 自动赋值为0.0

        float a[5][2] = {{0.0}}; //只为第一个成员中的第一个成员(a[0][0])赋值为0.0,其余的成员a[0][1]、a[1][0]、a[1][1]…a[4][1] 自动赋值为0.0,这种方式可以看做数组中的所有成员中的成员值清零

        float a[5][2] = {{1.1, 1.2}, {1.3}, {1.5}, {1.7}, {1.9, 2.0}}; //指定成员中的成员进行赋值,其余成员自动赋值为0.0,这段初始化赋值语句等同于{{1.1, 1.2}, {1.3, 0.0}, {1.5, 0.0}, {1.7, 0.0}, {1.9, 2.0}}

        float a[][2] = {{1.1, 1.2}, {1.3}, {1.5}, {1.7}, {1.9, 2.0}}; //指定成员中的成员进行赋值,其余成员自动赋值为0.0,这段初始化赋值语句等同于{{1.1, 1.2}, {1.3, 0.0}, {1.5, 0.0}, {1.7, 0.0}, {1.9, 2.0}},一维下标个数为5


    二维数组混合初始化赋值(不推荐)

        float a[5][3] = {1.1, {1.2}, 1.3, {1.4, 1.5, 1.6}, {1.7}, 1.8, {1.9}, 2.0, {2.1, 2.2, 2.3}}; //这段初始化赋值语句等同于{1.1, 1.2, 1.3, {1.4, 1.5, 1.6}, {1.7, 0.0, 0.0}, 1.8, 1.9, 2.0, {2.1, 2.2, 2.3}}

        float a[][3] = {1.1, {1.2}, 1.3, {1.4, 1.5, 1.6}, {1.7}, 1.8, {1.9}, 2.0, {2.1, 2.2, 2.3}}; //与float a[5][3]初始化赋值效果相同,一维下标个数为5

        使用混合初始化赋值需要考虑数据对齐等因素,比如二维下标个数为3,当对应的一维数组的第一个成员采用整行形式赋值后,第二个成员采用分段形式赋值也与整行形式赋值效果相同,并且第二个成员或之后的成员分段形式赋值中,只能进行单个成员赋值。


6. 二维整数类型数组使用

  二维数组一般当作数学中的行列矩阵使用,一维成员一般按行表示,二维成员一般按列表示。比如学生1的所有科目成绩表示一行内容,所有学生的语文成绩表示一列内容。

  【例6.4】 通过二维数组记录五名学生的语文、数学考试成绩,并分别输出学生们的两次考试总成绩、语文考试平均成绩、数学考试平均成绩。

学生 语文考试成绩 数学考试成绩
学生1 88 95
学生2 90 86
学生3 75 79
学生4 66 80
学生5 95 99

      int grade[5][2] = {{88, 95}, {90, 86}, {75, 79}, {66 ,80}, {95, 99}};
      int chinese = 0, math = 0;
      int one_dimensional = sizeof(grade) / sizeof(*grade);
      int two_dimensional = sizeof(*grade) / sizeof(int);
      int i = 0, j = 0; //i表示一维下标,j表示二维下标

      printf(“二维数组->地址:%p.\n\n”, grade);
      for (; i < one_dimensional; i++) {
          for (j = 0; j < two_dimensional; j++) {
              printf(“一维成员%d ->地址:%p, 二维成员%d ->值:%d 地址:%p.\n”, i + 1, grade[i], j + 1, grade[i][j], &(grade[i][j]));
              (j == 0) ? chinese += grade[i][j] : math += grade[i][j]; //二维下标值0表示语文成绩,二维下标值1表示数学成绩
              if (j == two_dimensional - 1)
              printf(“学生%d:总成绩是%d分.\n\n”, i + 1, grade[i][j - 1] + grade[i][j]);
          }
      }

      printf(“学生们的语文平均成绩是%d分.\n”, chinese / one_dimensional);
      printf(“学生们的数学平均成绩是%d分.\n”, math / one_dimensional);

    示例结果

        二维数组->地址:004FFE4C.

        一维成员1 ->地址:004FFE4C, 二维成员1 ->值:88 地址:004FFE4C.
        一维成员1 ->地址:004FFE4C, 二维成员2 ->值:95 地址:004FFE50.
        学生1:总成绩是183分.

        一维成员2 ->地址:004FFE54, 二维成员1 ->值:90 地址:004FFE54.
        一维成员2 ->地址:004FFE54, 二维成员2 ->值:86 地址:004FFE58.
        学生2:总成绩是176分.

        一维成员3 ->地址:004FFE5C, 二维成员1 ->值:75 地址:004FFE5C.
        一维成员3 ->地址:004FFE5C, 二维成员2 ->值:79 地址:004FFE60.
        学生3:总成绩是154分.

        一维成员4 ->地址:004FFE64, 二维成员1 ->值:66 地址:004FFE64.
        一维成员4 ->地址:004FFE64, 二维成员2 ->值:80 地址:004FFE68.
        学生4:总成绩是146分.

        一维成员5 ->地址:004FFE6C, 二维成员1 ->值:95 地址:004FFE6C.
        一维成员5 ->地址:004FFE6C, 二维成员2 ->值:99 地址:004FFE70.
        学生5:总成绩是194分.

        学生们的语文平均成绩是82分.
        学生们的数学平均成绩是87分.


    程序分析

在这里插入图片描述

6-3 数组grade[5][2] = {{88, 95}, {90, 86}, {75, 79}, {66 ,80}, {95, 99}};

        参考图6-3,二维数组的一维成员储存的是一维数组地址,二维数组的二维成员储存的是一维数组中的成员值。另外,从示例结果中,可以分析出二维数组的首地址与数组首个一维成员地址相同,一维成员地址与一维成员中的首个二维成员地址相同。


目录预览


<一起学习C语言:C语言发展历程以及定制学习计划>
<一起学习C语言:初步进入编程世界(一)>
<一起学习C语言:初步进入编程世界(二)>
<一起学习C语言:初步进入编程世界(三)>
<一起学习C语言:C语言数据类型(一)>
<一起学习C语言:C语言数据类型(二)>
<一起学习C语言:C语言数据类型(三)>
<一起学习C语言:C语言基本语法(一)>
<一起学习C语言:C语言基本语法(二)>
<一起学习C语言:C语言基本语法(三)>
<一起学习C语言:C语言基本语法(四)>
<一起学习C语言:C语言基本语法(五)>
<一起学习C语言:C语言循环结构(一)>
<一起学习C语言:C语言循环结构(二)>
<一起学习C语言:C语言循环结构(三)>
<一起学习C语言:数组(一)>

发布了111 篇原创文章 · 获赞 720 · 访问量 24万+

猜你喜欢

转载自blog.csdn.net/a29562268/article/details/105604330