- 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 - 主函数
- 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 - 函数指针
- C - 指向数组的指针
- C - 指向结构体的指针
- C - 指针链
- C - 指针与数组
- C - 字符指针和函数
- C - 空指针
- C - void指针
- C - 悬空指针
- C - 解引用指针
- C - 近、远和巨型指针
- C - 指针数组的初始化
- C - 指针与多维数组
- C语言中的字符串
- C - 字符串
- C - 字符串数组
- C - 特殊字符
- C语言中的结构体和联合体
- C - 结构体
- C - 结构体和函数
- C - 结构体数组
- C - 自引用结构体
- C - 查找表
- C - 点(.)运算符
- C - 枚举(或enum)
- C - 结构体填充和打包
- C - 嵌套结构体
- C - 匿名结构体和联合体
- C - 联合体
- C - 位域
- C - Typedef
- C语言中的文件处理
- C - 输入与输出
- C - 文件I/O(文件处理)
- C预处理器
- C - 预处理器
- 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];
多维数组可以有任意数量的维度。在本教程中,我们将学习两种常用的多维数组类型
- 二维数组
- 三维数组
C语言中的二维数组
二维数组是一维数组的数组。二维数组的每个元素本身都是一个数组。它就像一个表格或矩阵。元素可以被认为在逻辑上排列成行和列。因此,任何元素的位置都由其行号和列号来表征。行和列索引都从0开始。
二维数组的声明和初始化
以下语句声明并初始化一个二维数组:
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 () { /* an array with 5 rows and 2 columns*/ int a[5][2] = { {0,0}, {1,2}, {2,4}, {3,6},{4,8}}; int i, j; /* output each array element's value */ for ( i = 0; i < 5; i++ ) { for ( j = 0; j < 2; j++ ) { printf("a[%d][%d] = %d\n", 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("\n"); } return 0; }
输出
1 2 3 4 5 10 20 30 40 50 5 10 15 20 25
C语言中的三维数组
三维数组是二维数组的数组,其中每个元素都是一个二维数组。3D数组需要三个下标来定义深度、行和列。
想象一下参加考试的学生坐在五个大厅里,每个大厅有二十排课桌,每排有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\n"); 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("\n"); } printf("\n"); } 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\n", 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],则其乘积的大小为(只有当n等于p时乘法才可能)c[m][q]。
两个矩阵的乘积是矩阵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("\nMatrix 1 ...\n"); for(i=0; i<3; i++){ for(j=0; j<3; j++) printf("%d\t", mat1[i][j]); printf("\n"); } printf("\nMatrix 2 ...\n"); for(i=0; i<3; i++){ for(j=0; j<3; j++) printf("%d\t", mat2[i][j]); printf("\n"); } printf("\nMultiplication of the two given Matrices: \n"); for(i=0; i<3; i++){ for(j=0; j<3; j++) printf("%d\t", mat3[i][j]); printf("\n"); } 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