一、一维数组
1.一维数组的创建
int main() { int arr[8];//数组类型 数组名[元素个数]; char ch[3]; return 0; }
注:元素个数一定是一个常量表达式,形如arr[n]的数组创建只有在C99语法下才支持,有些编译器能够编译这样的代码,但不建议使用。
2.一维数组初始化
int main() { int arr1[3] = { 1, 2, 3 };//完全初始化 int arr2[3] = { 1, 2 };//不完全初始化 /* 以下两行代码等价 int arr3[3] = { 1, 2, 3 }; int arr3[] = { 1, 2, 3 }; */ return 0; }
注意区分以下代码:
int main() { char ch1[5] = { 'b', 'i', 't' }; char ch2[] = { 'b', 'i', 't' }; char ch3[5] = "bit";// b i t \0 0 char ch4[] = "bit";// b i t \0 return 0; }
因为\0
是结束标志,而ch2
并没有\0
,所以它会接着往下打印,直到找到\0
为止。
3.一维数组的内存存储
int main() { int arr[5]; char ch[5]; int i = 0; for (i = 0; i < 5; i++) { printf("arr[%d] = %p ", i, &arr[i]);//%p - 按地址格式打印 - 十六进制打印 printf("ch[%d] = %p\n", i, &ch[i]); } return 0; }
二、二维数组
1.二维数组的创建
int main() { //创建 //数组类型 数组名[行元素个数][列元素个数]; int arr[3][4]; char ch[3][4]; return 0; }
2.二维数组初始化
int main() { //初始化 - 创建的同时赋值 int arr1[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 }; int arr2[3][4] = { 1,2,3,4,5,6,7 };//不完全初始化 - 后面补0 int arr3[3][4] = { {1, 2}, {3, 4}, {5, 6} }; int arr4[][4] = { {1, 2}, {3, 4}, {5, 6} };//行可以省略,但是列不能省略 return 0; }
注:为了代码的易读性
,建议每行用一个{}
括起来,可以理解把二维数组理解为一个一维数组里放了几组一维数组。
3.二维数组的内存存储
int main() { int arr[3][4] = { {1,2},{3,4},{5,6} }; int i = 0; int j = 0; for (i = 0; i < 3; i++) { for (j = 0; j < 4; j++) { printf("arr[%d][%d] = %p\n", i, j, &arr[i][j]); } } return 0; }
由上图可以看出,每个arr元素的地址之间大小差还是4个字节,第一行的最后一个元素与第二行的第一个元素之间的大小差也是4。所以二维数组在内存中也是连续存放的,也是随着地址的增长,地址由低到高变化。