day12
📅 2026/7/8 6:47:52
👁️ 阅读次数
📝 编程学习
二维数组的概念
二维数组是相同数据类型元素按行和列排列的矩形集合,可以把二维数组写成行和列的排列形式来理解二维数组的逻辑结构。
站在一维数组的基础上理解二维数组,可以理解为:二维数组是把一维数组作为数组的元素。
二维数组的创建和初始化
语法如下:
type arr_name[常量值1][常量值2];
创建示例:
int arr[2][3];
表示定义了一个2行3列的数组。
完全初始化
#include<stdio.h> int main() { int arr[4][2] = { 1,2,3,4,5,6,7,8}; return 0; }程序会根据2行3列的方式依次进行初始化.
指定行和列进行初始化
#include<stdio.h> int main() { int arr1[2][3] = { {1,2,3},{4,5,6} }; int arr2[2][3] = { {1,2},{4} }; return 0; }不完全初始化
#include<stdio.h> int main() { int arr1[2][3] = { {1,2,3},{4,5,6} }; int arr2[2][3] = { {1,2},{4} }; return 0; }在定义数组时可以省略行,不能省略列。
二维数组的访问
二维数组的访问是通过[]的方式进行访问,如上图所示如要确定arr1中数据3的位置,我们可以通过行和列确定。行为0,列为2. 在C语言中确定方式为:数组名[行][列]的方式。、
- arr[0][2]: 对应数据为:3
- arr[1][0]: 对应数据为:4
- arr[1][2]: 对应数据为:6
通过数组下标访问元素
访问单独数据
#include<stdio.h> int main() { int arr[2][3] = { 1,2,3,4,5,6 }; printf("%d\n",arr[0][2]); printf("%d\n",arr[1][0]); printf("%d\n",arr[1][2]); return 0; }访问数组当中的所有数据
#include<stdio.h> int main() { int arr[2][3] = { 1,2,3,4,5,6 }; int row = 2; int col = 3; for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { printf("%d ", arr[i][j]); } printf("\n"); } return 0; }给数组输入元素
#include<stdio.h> int main() { int arr[2][3]; int row = 2; int col = 3; for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { scanf("%d", &arr[i][j]); } } for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { printf("%d ", arr[i][j]); } printf("\n"); } return 0;在这个过程中
for (int i = 0; i < row; i++)这是一个常见的访问/输出一个数组内的数据的方式,在day10中也用了这类似的for循环·。
二维数组在内存当中的存储
二维数组的内存特性
数组本身就是一块连续的存储空间,所以无论是一维数组还是二维数组,我们通过打印地址可以发现内存确实是连续的空间。
#include<stdio.h> int main() { int arr[2][3] = {0}; int row = 2; int col = 3; for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]); } } return 0; }C99中的变长数组
在C99标准之前,C语言在创建数组的时候,数组大小的指定只能使用常量、常量表达式,或者如果我们初始化数据的话,可以省略数组大小。
int arr1[10]; int arr2[3+5]; int arr3[] = {1,2,3};这样的语法限制,让我们创建数组就不够灵活,有时候数组大了浪费空间,有时候数组又小了不够用的。
C99中给一个变长数组(variable-length array,简称 VLA)的新特性,允许我们可以使用变量指定数组大小。请看下面的代码:
int n = a + b; int arr[n];上面示例中,数组arr就是变长数组,因为它的长度取决于变量n的值,编译器没法事先确定,只有运行时才能知道n是多少。
变长数组的根本特征,就是数组长度只有运行时才能确定,所以变长数组不能初始化。
变长数组的好处是:
- 程序员不必在开发时,随意为数组指定一个估计的长度,程序可以在运行时为数组分配精确的长度。
- 有一个比较迷惑的点,变长数组的意思是数组的大小是可以使用变量来指定的,在程序运行的时候,根据变量的大小来指定数组的元素个数,而不是说数组的大小是可变的。数组的大小一旦确定就不能再变化了。
编程学习
技术分享
实战经验