跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C 语言多维数组
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{Note|本教程适用于C语言初学者及需要巩固多维数组概念的程序员。}} = C语言多维数组 = 多维数组是C语言中存储表格状数据(如矩阵、三维空间坐标等)的核心数据结构。它本质上是"数组的数组",通过多个下标访问元素。本章将详细讲解二维、三维数组的声明、初始化、内存布局及实际应用。 == 基本概念 == '''多维数组'''是线性数组在更高维度的扩展: * 一维数组:单行数据(向量) * 二维数组:行和列的表格(矩阵) * 三维数组:多个表格的堆叠(如RGB图像数据) 数学上,二维数组可表示为:<math>A_{m \times n} = \begin{bmatrix} a_{0,0} & \cdots & a_{0,n-1} \\ \vdots & \ddots & \vdots \\ a_{m-1,0} & \cdots & a_{m-1,n-1} \end{bmatrix}</math> == 声明与初始化 == === 二维数组 === <syntaxhighlight lang="c"> // 声明3行2列的整型数组 int matrix[3][2]; // 声明时初始化(行数可省略) int matrix[][2] = {{1, 2}, {3, 4}, {5, 6}}; </syntaxhighlight> === 三维数组 === <syntaxhighlight lang="c"> // 声明2个3x4的表格 int cube[2][3][4]; // 分层初始化 int cube[][3][4] = { {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}}, // 第一层 {{13,14,15,16}, {17,18,19,20}, {21,22,23,24}} // 第二层 }; </syntaxhighlight> == 内存布局 == C语言采用'''行优先存储'''(Row-major order): <mermaid> graph LR A[matrix[0][0]] --> B[matrix[0][1]] B --> C[matrix[1][0]] C --> D[matrix[1][1]] D --> E[matrix[2][0]] E --> F[matrix[2][1]] </mermaid> 计算公式(二维数组): <math>\text{Address}(a[i][j]) = \text{Base} + (i \times \text{COLUMNS} + j) \times \text{sizeof(type)}</math> == 访问元素 == <syntaxhighlight lang="c"> #include <stdio.h> int main() { float temperature[3][4] = { {22.5, 23.1, 24.0, 23.7}, {21.8, 22.3, 23.5, 22.9}, {20.7, 21.2, 22.1, 21.5} }; // 访问第2行第3列(0-based) printf("周三中午温度: %.1f°C\n", temperature[2][3]); // 遍历所有元素 for(int i = 0; i < 3; i++) { for(int j = 0; j < 4; j++) { printf("%.1f\t", temperature[i][j]); } printf("\n"); } return 0; } </syntaxhighlight> '''输出:''' <pre> 周三中午温度: 21.5°C 22.5 23.1 24.0 23.7 21.8 22.3 23.5 22.9 20.7 21.2 22.1 21.5 </pre> == 实际应用案例 == === 案例1:矩阵乘法 === <syntaxhighlight lang="c"> #include <stdio.h> #define ROWS_A 2 #define COLS_A 3 #define COLS_B 2 void matrix_multiply(int a[][COLS_A], int b[][COLS_B], int result[][COLS_B]) { for(int i = 0; i < ROWS_A; i++) { for(int j = 0; j < COLS_B; j++) { result[i][j] = 0; for(int k = 0; k < COLS_A; k++) { result[i][j] += a[i][k] * b[k][j]; } } } } int main() { int a[ROWS_A][COLS_A] = {{1, 2, 3}, {4, 5, 6}}; int b[COLS_A][COLS_B] = {{7, 8}, {9, 10}, {11, 12}}; int result[ROWS_A][COLS_B]; matrix_multiply(a, b, result); // 输出结果矩阵 for(int i = 0; i < ROWS_A; i++) { for(int j = 0; j < COLS_B; j++) { printf("%d\t", result[i][j]); } printf("\n"); } return 0; } </syntaxhighlight> '''输出:''' <pre> 58 64 139 154 </pre> === 案例2:三维坐标系统 === <syntaxhighlight lang="c"> #include <math.h> typedef struct { float points[100][3]; // 存储100个三维点 int count; } PointCloud; float calculate_distance(PointCloud pc, int index1, int index2) { float dx = pc.points[index1][0] - pc.points[index2][0]; float dy = pc.points[index1][1] - pc.points[index2][1]; float dz = pc.points[index1][2] - pc.points[index2][2]; return sqrt(dx*dx + dy*dy + dz*dz); } </syntaxhighlight> == 高级主题 == === 动态多维数组 === 使用指针数组模拟: <syntaxhighlight lang="c"> #include <stdlib.h> int** create_2d_array(int rows, int cols) { int **arr = (int**)malloc(rows * sizeof(int*)); for(int i = 0; i < rows; i++) { arr[i] = (int*)malloc(cols * sizeof(int)); } return arr; } void free_2d_array(int** arr, int rows) { for(int i = 0; i < rows; i++) { free(arr[i]); } free(arr); } </syntaxhighlight> === 数组与指针的关系 === 二维数组名是指向第一个子数组的指针: <syntaxhighlight lang="c"> int matrix[3][4]; int (*ptr)[4] = matrix; // 指向包含4个int的数组的指针 </syntaxhighlight> == 常见问题 == {{Warning|1=数组越界访问是常见错误,C语言不会自动检查边界!}} * '''Q: 为什么不能省略所有维度?''' * A: 编译器需要知道除第一维外的所有维度来计算内存布局 * '''Q: 如何传递多维数组给函数?''' * A: 必须指定除第一维外的所有维度,如:<code>void func(int arr[][4])</code> == 最佳实践 == # 对大型数组使用<code>static</code>存储类避免栈溢出 # 使用<code>#define</code>或<code>const</code>定义维度常量 # 初始化时使用嵌套花括号提高可读性 # 考虑使用结构体封装复杂的多维数组 {{Exercise|尝试编写程序实现: 1. 转置给定的3×3矩阵 2. 计算三维空间中10个点之间的平均距离}} [[Category:编程语言]] [[Category:C]] [[Category:C 语言数组]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
模板:Exercise
(
编辑
)
模板:Mbox
(
编辑
)
模板:Note
(
编辑
)
模板:Warning
(
编辑
)
模块:Arguments
(
编辑
)
模块:Message box
(
编辑
)
模块:Message box/ambox.css
(
编辑
)
模块:Message box/configuration
(
编辑
)
模块:Yesno
(
编辑
)