【C语言】二维数组

简介: 前面的博客介绍了一维数组只有一个下标,称为一维数组,其数组元素也称为单下标变量。我们在实际问题当中很多量是由二维或者是多维的,因此 C 语言允许构造了多维数组。多维数组的元素有多个下标,以标识它的数组中的位置,所以也称为多下标变量。本片文章介绍的是二维

二维数组的定义和引用

前面的博客介绍了一维数组只有一个下标,称为一维数组,其数组元素也称为单下标变量。我们在实际问题当中很多量是由二维或者是多维的,因此 C 语言允许构造了多维数组。多维数组的元素有多个下标,以标识它的数组中的位置,所以也称为多下标变量。本片文章介绍的是二维数组。

1、二维数组的定义

二维数组的声明与一维数组相同,一般形式如下:

类型说明符 数组名 [常量表达式 1] [常量表达式 2];

其中 "常量表达式1" 被称之为行下标,"常量表达式2" 被称之为是列下标。二维数组下标的取值范围,如下所示:

行下标的取值范围是:0~n-1。

列下标的取值范围是:0~m-1。

二维数组最大元素下标识:array[n-1][m-1]。

例如:定义一个2行3列的整型数组

int array[3][3]

上述代码声明了一个 3 行 3 列的二维数组,其 数组名 是 array,其下标变量的类型为整形。

如下图所示:该数组的下标变量一共有 3x3 个。

image.png

在 C语言中,二维数组是按行排列的,即按行顺序存放,先存放 array[0] 行,再存放 arrar[1] 行,接着存放 array[2] 行。每行有 3 个元素,也是其依次存放的。

注意:在C语言中,二维数组是按行排列的。

2、二维数组元素的引用

二维数组元素的引用一般形式如下:

数组名[下标][下标];

说明:二维数组的下标可以是 整形常量 或 整形表达式。

例如: a[3][4];表示 a 数组三行四列的元素。

下标变量和数组说明在形式中有些相似,但这两者具有完全不同的含义。数组说明的方括号中给出的是某一维的长度,即可取下标的最大值;而数组元素中的下标是该元素在数组中的位置标识。前者只能是常量,后者可以是常量,变量或表达式。

注意:不管是 行下标 还是 列下标,其中的索引值都是从 0 开始的。

注意:和一维数组是一样的,我们都需要注意下标越界的问题。

练习1:一个学习小组有 5 个人,每个人有三门课的考试成绩。求全组分科的平均成绩和 各科总平均成绩。

如下代码所示:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
  int i, j;     //二维数组下标
  int sum = 0;  //当前科目的总成绩
  int average;  //总平均分
  int v[3];     //各科平均分
  int a[3][5];  //用来保存每个同学各科成绩的二维数组,三门学科,五个同学。
  printf("请输入各科学生的成绩:\n");
  for (i = 0; i < 3; i++)
  {
    printf("\n一门学科数入5次成绩\n");
    if (i == 0)
      printf("数学学科:");
    if (i == 1)
      printf("语文学科:");
    if (i == 2)
      printf("英语学科:");
    for (j = 0; j < 5; j++)
    {
      scanf("%d", &a[i][j]);  //输入每个同学的各科成绩
      sum += a[i][j];     //计算当前科目的总成绩(sum)
    }
    v[i] = sum / 5;  // 当前科目的平均分,用总的成绩除以5
    sum = 0;       // 把当前科目总成绩清0
  }
  average = (v[0] + v[1] + v[2]) / 3;
  printf("\n数学: %d\n语文: %d\n英语: %d\n", v[0], v[1], v[2]);
  printf("平均分: %d\n", average);
  return 0;
}

当上面的代码被编译和执行时,可能它会产生下列结果:

image.png


二维数组的初始化

二维数组初始化也是在类型说明时给各下标变量赋以初值。二维数组可按行分段赋值, 也可按行连续赋值。下面是一个带有 3 行 4 列的数组:

  • 按行分段赋值可写为。
int a[3][4] = {  
 {0, 1, 2, 3} ,   /*  初始化索引号为 0 的行 */
 {4, 5, 6, 7} ,   /*  初始化索引号为 1 的行 */
 {8, 9, 10, 11}   /*  初始化索引号为 2 的行 */
};
  • 按行连续赋值可写为,注意:这个与上面初始化是等同的。
int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};

访问二维数组的元素

int val = a[2][3];

练习2:获取每行每列数组元素的值

如下代码所示:

#include<stdio.h>
int main(void)
{
  int i, j;
  int arr[3][3] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
  for (i = 0; i < 3; i++)
  {
    for (j = 0; j < 3; j++)
    {
      printf("| arr[%d][%d] = %d |", i, j, arr[i][j]);
    }
    printf("\n");
  }
  return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:


对二维数组初始化还需注意几点

1.可以只对部分元素赋值,未赋值的元素自动取"0"值。例如:

int arr[3][3] = {{1,2},{2,3},{3,4}};

是对每一行的第一列元素赋值,未赋值的元素的值为 0。赋值后各元素的值为:

1. 1  2  0
2. 2  3  0
3. 3  4  0

2.如果对全部元素赋值,那么第一维的长度可以不给出。例如:

int arr[3][3] = {{1,2,3},{2,3,4},{3,4,5}};

还可以写成为是:

int arr[][3] = {{1,2,3},{2,3,4},{3,4,5}};

注意:行 是可以进行省略的,但是 列 不能进行省略。

3. 二维数组可以看作是由一维数组嵌套而成的;如果一个数组的每个元素又是一个数组,那么它就是二维数组。当然,前提是各个元素的类型必须相同。根据这样的分析,一个二维数组也可以分解为多个一维数组,C语言允许这种分解。

例如,二维数组a[3][4]可分解为三个一维数组,它们的数组名分别为 a[0]、a[1]、a[2]。

这三个一维数组可以直接拿来使用。这三个一维数组都有 4 个元素,比如,一维数组 a[0] 的元素为 a[0][0]、a[0][1]、a[0][2]、a[0][3]。

目录
相关文章
|
6月前
|
C语言
C语言期末习题之求二维数组中的最大值
C语言期末习题之求二维数组中的最大值
58 0
|
6月前
|
C语言
【C语言】利用数组处理批量数据(一维数组和二维数组)
【C语言】利用数组处理批量数据(一维数组和二维数组)
|
6月前
|
存储 数据处理 C语言
C语言二维数组
C语言二维数组
57 0
|
6月前
|
C语言
C语言---二维数组&&指针
C语言---二维数组&&指针
28 0
|
6月前
|
C语言
C语言-----用二维数组解决菱形的打印问题
C语言-----用二维数组解决菱形的打印问题
59 0
|
6月前
|
存储 C语言
遍历二维数组C语言,小白必看的绝绝子技巧!
遍历二维数组C语言,小白必看的绝绝子技巧!
C4.
|
6月前
|
存储 C语言
C语言怎样定义和引用二维数组
C语言怎样定义和引用二维数组
C4.
71 0
|
1月前
|
存储 编译器 C语言
【C语言】数组(一维、二维数组的简单介绍)
【C语言】数组(一维、二维数组的简单介绍)
|
6月前
|
C语言
C语言期末习题之二维数组转置
C语言期末习题之二维数组转置
47 0
|
2月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。