C 语言编程教程

C 语言 - 首页

C 语言基础

C 语言 - 概述 C 语言 - 特性 C 语言 - 发展历史 C 语言 - 环境设置 C 语言 - 程序结构 C 语言 - Hello World 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 - 三元运算符 C - sizeof 运算符 C - 运算符优先级 C - 其他运算符

C 语言中的决策

C - 决策 C - if 语句 C - if...else 语句 C - 嵌套 if 语句 C - switch 语句 C - 嵌套 switch 语句

C 语言中的循环

C - 循环 C - While 循环 C - For 循环 C - Do...while 循环 C - 嵌套循环 C - 无限循环 C - Break 语句 C - Continue 语句 C - goto 语句

C 语言中的函数

C - 函数 C - Main 函数 C - 按值调用函数 C - 按引用调用函数 C - 嵌套函数 C - 可变参数函数 C - 用户定义函数 C - 回调函数 C - return 语句 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 - 指针 vs 数组 C - 字符指针和函数 C - NULL 指针 C - void 指针 C - 悬垂指针 C - 解引用指针 C - Near、Far 和 Huge 指针 C - 指针数组的初始化 C - 指针与多维数组

C 语言中的字符串

C - 字符串 C - 字符串数组 C - 特殊字符

C 语言的结构体和联合

C - 结构体 C - 结构体和函数 C - 结构体数组 C - 自引用结构 C - 查找表 C - 点 (.) 运算符 C - 枚举(或 enum) C - 结构填充和打包 C - 嵌套结构 C - 匿名结构和联合 C - 联合 C - Bit 位字段 C - Typedef

C 语言中的文件处理

C - 输入和输出 C - 文件 I/O(文件处理)

C 语言中的预处理器

C - 预处理器 C - #pragma 编译指示 C - 预处理器操作符 C - 宏 C - 头文件

C 语言中的内存管理

C - 内存管理 C - 内存地址 C - 存储类

C 其他主题

C - 错误处理 C - 可变参数 C - 命令执行 C - 数学函数 C - static 静态关键字 C - 随机数生成 C - 命令行参数

C 语言编程资源

C语言问题与解答答案 C语言快速指南 C语言速查表 C语言实用资源 C语言讨论


C 语言中的多维数组

用方括号声明一个大小值来表示数组,这种数组称为一维数组。在一维数组中,每个元素由其索引或下标标识。在 C 语言中,可以使用多个索引来模拟二维、三维或多维数组。

C 语言中的多维数组

多维数组可以称为嵌套数组。在这种情况下,外部数组中的每个元素本身就是一个数组。这种嵌套可以达到任意层级。如果外部数组中的每个元素都是另一个一维数组,则它们构成一个二维数组。反过来,内部数组是另一组一维数组的数组,它是一个三维数组,依此类推。

多维数组的声明

根据嵌套层级,多维数组的声明如下 -

type name[size1][size2]...[sizeN];

例如,以下声明创建一个三维整数数组 -

int threedim[3][3][3];

多维数组可以有任意数量的维度。在本教程中,我们将学习两种常用的多维数组类型:

  1. 二维数组
  2. 三维数组

C 语言中的二维数组

二维数组是一维数组中的一个数组。二维数组的每个元素本身就是一个数组。它类似于表格或矩阵。元素可以被视为按行和列进行逻辑排列。因此,任何元素的位置都由其行号和列号来表示。行和列的索引均从 0 开始。

two_Dimensional_arrays

二维数组的声明和初始化

以下语句声明并初始化一个二维数组 -

int arr[3][5] = {1,2,3,4,5, 10,20,30,40,50, 5,10,15,20,25};

arr 数组有三行五列。在 C 语言中,二维数组是行主序数组。第一个方括号始终表示行的维度大小,第二个方括号表示列数。显然,该数组有 3 x 5 = 15 个元素。该数组初始化为 15 个逗号分隔的值,这些值放在大括号内。

元素按行读取到数组中,这意味着前 5 个元素存储在第一行,依此类推。因此,数组声明中的第一个维度是可选的。

int arr[ ][5] = {1,2,3,4,5, 10,20,30,40,50, 5,10,15,20,25};

为了提高可读性,每行的元素可以选择放在花括号中,如下所示 -

int arr[ ][5] = {
    {1,2,3,4,5},
    {10,20,30,40,50},
    {5,10,15,20,25}
};

这些数字按逻辑顺序以表格形式排列,如下所示 -

1 2 3 4 5
10 20 30 40 50
5 10 15 20 25

行索引为 1、列索引为 2 的单元格包含 30 个元素。

打印二维数组元素的示例

以下程序显示二维数组中每个元素的行索引和列索引 -

#include <stdio.h>
int main () {

   /* 一个 5 行 2 列的数组 */
   int a[5][2] = { {0,0}, {1,2}, {2,4}, {3,6},{4,8}};
   int i, j;
 
   /* 输出每个数组元素的值 */
   for ( i = 0; i < 5; i++ ) {
      for ( j = 0; j < 2; j++ ) {
         printf("a[%d][%d] = %d
", i,j, a[i][j] );
      }
   }
   
   return 0;
}

输出

a[0][0] = 0
a[0][1] = 0
a[1][0] = 1
a[1][1] = 2
a[2][0] = 2
a[2][1] = 4
a[3][0] = 3
a[3][1] = 6
a[4][0] = 4
a[4][1] = 8

对于二维或多维数组,编译器会分配一个内存块,其大小等于数组维度乘以数据类型的大小。在本例中,大小为 3 x 5 x 4 = 60 字节,其中 4 为 int 数据类型的大小。

即使所有元素都存储在连续的内存位置,我们也可以使用嵌套循环以行列格式打印元素。

将二维数组按行列矩阵打印的示例

以下程序按行列打印二维数组。

#include <stdio.h>

int  main() {
   int arr[3][5] = {1,2,3,4,5, 10,20,30,40,50, 5,10,15,20,25};
   int i, j;

   for (i=0; i<3; i++){
      for (j=0; j<5; j++){
         printf("%4d", arr[i][j]);
      }
      printf("
");
   }
   return 0;
}

输出

   1   2   3   4   5
  10  20  30  40  50
   5  10  15  20  25

C 语言中的三维数组

三维数组是由二维数组构成的数组,其中每个元素都是一个二维数组。三维数组需要三个下标来定义深度、行和列。

假设参加考试的学生坐在五个考场里,每个考场有 20 排桌子,每排有 5 张桌子。这种排列可以用一个三维数组表示,例如 -

Students[hall][row][column]

要定位每个学生,需要三个索引:考场号、该学生所在考场桌子的行号和列号。

三维数组示例

以下程序将数字存储在一个 3 x 3 x 3 的数组中 -

#include<stdio.h>

int main(){
   int i, j, k;
   int arr[3][3][3]= {
      {
         {11, 12, 13},
         {14, 15, 16},
         {17, 18, 19}
      },
      {
         {21, 22, 23},
         {24, 25, 26},
         {27, 28, 29}
      },
      {
         {31, 32, 33},
         {34, 35, 36},
         {37, 38, 39}
      },
   };

   printf("Printing 3D Array Elements
");

   for(i=0;i<3;i++) {
      for(j=0;j<3;j++){
         for(k=0;k<3;k++){
            printf("%4d",arr[i][j][k]);
         }
         printf("
");
      }
      printf("
");
   }
   return 0;
}

输出

Printing 3D Array Elements
  11  12  13
  14  15  16
  17  18  19

  21  22  23
  24  25  26
  27  28  29

  31  32  33
  34  35  36
  37  38  39

多维数组元素的逐行求和

您可以通过使用索引访问元素来按行或按列计算所有元素的和。对于三维数组,您需要使用深度、行和列索引。对于二维数组,您需要使用行和列索引。这里我们使用二维数组。

示例:按行计算数值和

以下程序显示了二维数组每一行整数元素的和。

#include <stdio.h>

int  main() {
   int arr[3][5] = {{1,2,3,4,5}, {10,20,30,40,50}, {5,10,15,20,25}};
   int i, j;
   int sum;

   for (i=0; i<3; i++){
      sum=0;
      for (j=0; j<5; j++){
         sum+=arr[i][j];
      }
      printf("Sum of row %d: %d
", i, sum);
   }
   return 0;
}

输出

Sum of row 0: 15
Sum of row 1: 150
Sum of row 2: 75

矩阵乘法

矩阵代数是数学的一个分支,其中矩阵是由按行和列排列的数字组成的二维数组。只有当第一个矩阵的列数等于第二个矩阵的行数时,两个矩阵才能相乘。两个兼容矩阵的乘积等于第一个矩阵的行与第二个矩阵的列之间的点积。

如果两个矩阵的大小分别为 a[m][n] 和 b[p][q],则它们相乘的结果是一个大小为 c[m][q] 的矩阵(只有当 n 等于 p 时才可以进行乘法)。

两个矩阵的乘积是矩阵 A 中某一行与矩阵 B 中某一列对应元素的乘积之和。

二维数组(矩阵)乘法示例

以下程序执行两个矩阵的乘法。

#include<stdio.h>
int main(){
   int mat1[3][3] = { {2, 4, 1} , {2, 3, 9} , {3, 1, 8} };
   int mat2[3][3] = { {1, 2, 3} , {3, 6, 1} , {2, 4, 7} };
   int mat3[3][3], sum=0, i, j, k;

   for(i=0; i<3; i++){
      for(j=0; j<3; j++){
         sum=0;
         for(k=0; k<3; k++)
            sum = sum + mat1[i][k] * mat2[k][j];
         mat3[i][j] = sum;
      }
   }
   printf("
Matrix 1 ...
");
   for(i=0; i<3; i++){
      for(j=0; j<3; j++)
         printf("%d	", mat1[i][j]);
      printf("
");
   }

   printf("
Matrix 2 ...
");
   for(i=0; i<3; i++){
      for(j=0; j<3; j++)
         printf("%d	", mat2[i][j]);
      printf("
");
   }

   printf("
Multiplication of the two given Matrices: 
");
   for(i=0; i<3; i++){
      for(j=0; j<3; j++)
      printf("%d	", mat3[i][j]);
      printf("
");
   }

   return 0;
}

输出

Matrix 1 ...
2       4       1
2       3       9
3       1       8

Matrix 2 ...
1       2       3
3       6       1
2       4       7

Multiplication of the two given Matrices:
16      32      17
29      58      72
22      44      66