### 数组 数组可以代表内存中一组连续的同类型存储区。 数字也需要先声明然后才使用。 声明数组时需要提供类型名称,数组名称和一个整数代表数组里的存储区个数。 数组一旦创建成功,它里面包含的存储区个数就不可改变。 /* 数组声明演示 */ #include <stdio.h> int main(){ int arr[5]; return 0; } 数组通常不作为整体使用,一次只能使用其中的某个存储区。 数组里每个存储区都有一个编号,这个编号叫做存储区的下标。 第一个存储区的下标是0,向后一次递增。 有效下标范围从0开始到存储区个数减一为止,超过范围的下标不能使用。 数组名称结合下标就可以表示数组里的存储区。 /* 数组声明演示 */ #include <stdio.h> int main(){ int arr[5]; arr[2] = 10; return 0; } 可以编写for循环依次处理数组里的每个存储区。 在这个for循环里让循环变量依次代表数组中每个存储区的下标。 #include <stdio.h> int main(){ int arr[5]; int num = 0; for (num = 0;num <= 4;num++){ arr[num] = num; } for (num = 4;num >= 0;num--){ printf("%d ", arr[num]); } printf("\n"); return 0; } 数组也应该初始化。 数组初始化的时候,需要提供多个初始化数据,每个初始化数据用来初始化一个存储区。 所有初始化数据写在一对大括号里面,相邻数据之间用逗号分隔。 #include <stdio.h> int main(){ int arr[5] = {0, 1, 2, 3, 4}; return 0; } 如果初始化数组比存储区个数多的话,就会把多余的数据丢掉。 如果初始化数据比存储区个数少,就把后面多余的存储区初始化成0。 如果初始化数据个数和存储区个数一样就可以省略数组声明里的存储区个数。 #include <stdio.h> int main(){ int arr[] = {0, 1, 2, 3, 4}; return 0; } ### 变长数组 C99规范里允许声明数组时使用变量表示数组里的存储区个数,这种数组叫变长数组。 如果程序多次运行则每次运行时数组里包含的存储区个数都可能不同。 在一次运行过程中数组里包含的存储区个数不会改变。 /* 变长数组演示 */ #include <stdio.h> int main(){ int size = 0; printf("请输入一个整数:"); scanf("%d", &size); int arr[size]; // 变长数组 printf("sizeof(arr) = %ld\n", sizeof(arr)); return 0; } 可以使用sizeof关键字计算变长数组的总字节个数。 变长数组不可初始化。 ### 多维数组 多维数组除了可以表示多个存储区以外,还可以表示这些存储区的分组情况。 最常见的多维数组叫二维数组,它只能表示存储区的一次分组情况。 声明二维数组的时候,需要提供俩整数,第一个整数表示分组个数,第二个整数表示每组里存储区个数。 /* 二位数组演示 */ #include <stdio.h> int main(){ int arr[3][2]; // 二维数组声明 return 0; } 二维数组通常不会作为整体使用,一次只会使用其中的某个存储区。 二维数组名称和两个下标就可以就可以用来表示其中的某个存储区,第一个下标表示分组标号(组下标),第二个下标表示分组内存储区的编号(组内下标)。 组下标范围从0开始到分组个数减一为止。 组内下标范围从0开始到组内存储区个数减一为止。 将0-5加入到二维数组里面: /* 二位数组演示 */ #include <stdio.h> int main(){ int arr[3][2]; // 二维数组声明 int row = 0, col = 0, tmp = 0; for (row = 0;row <= 2;row++){ for (col = 0;col <= 1;col++){ arr[row][col] = tmp; tmp++; } } printf("%d\n", arr[2][1]); return 0; } 可以采用多重循环依次处理二维数组里的每个存储区。 可以把二维数组当一维数组进行初始化。 也可以把初始化数据进行分组,每组初始化数据用来初始化一组存储区。 使用初始化一维数组的方式初始化二维数组 int arr[3][2] = {0, 1, 2, 3, 4, 5}; 使用分组初始化的方式初始化二维数组 int arr[3][2] = {{0, 1}, {2, 3}, {4, 5}}; 如果可以根据初始化数据的个数计算出分组个数,就可以省略二维数组声明中的分组个数。 int arr[][2] = {{0, 1}, {2, 3}, {4, 5}}; 二维数组名称也可以代表数组里第一个存储区的地址。 二维数组名称不能代表存储区,所以不可以被赋值 /* 二维数组演示 */ #include <stdio.h> int main(){ int arr[3][2] = {0}; printf("arr = %p\n", arr); printf("&arr[0][0] = %p\n", &arr[0][0]); return 0; } 可以对二维数组名称采用sizeof进行计算,结果是二维所包含的总字节个数。 #include <stdio.h> int main(){ int arr[3][2] = {0}; printf("sizeof(arr) = %ld\n", sizeof(arr)); return 0; } 二维数组名称可以和一个下标配合使用,这个下标当作组下标看待,这个写法可以表示下标代表组中的第一个存储区。