数组
数组是数据结构的一种。它属于线性结构。
数组的定义
在C语言中声明一个数组很简单:
int arr[4] = {1,2,2,3}; 这是一个一维数组。
上面语句中 arr 是数组名,[4] 指的是这个数组一共有几个元素,等号右边就是这个数组的元素集合。
初始化一个数组:
初始化变量就相当于给这个变量赋个初始值。比如:
int a = 2;
int ary[5] = {0};
当我们为一个数组的每一位元素赋的值一样时,我们可以简写。就像上面两个赋值语句中的第二个 int ary[5] = {0}; 这个语句相当于:
int ary[5] = {0,0,0,0,0};
如何声明多维数组?
声明多维数组需要多加一个下标:
int ary[3][4] = {1};
声明了一个 3×4 的多维数组,并将数组每一位初始化为 1。这个多维数组也可以这么赋值:
int ary[3][4] = { // 定义一个三行四列的数组
{1,1,1,1},
{1,1,1,1},
{1,1,1,1}
}; // 或者如下(直接赋 12 个 1):
int arr[3][4] = {1,1,1,1,1,1,1,1,1,1,1,1};
当声明并直接赋值一个数组变量时,下标数字我们可以省略:
int arr[3] = {1,2,3}; 也可以写成:int arr[] = {1,2,3}; 多维数组的列数我们不能省略:
// 对数组中第一行第一列元素赋值为 1
int arr[2][3] = {1};
// 第一行全赋值为 1,第二行第一个赋值为 2
int arr[2][3] = {1,1,1,2};
// 对数组中第一行的第一列赋值为 1
int arr[][3] = {1,1,1};
// 对数组中第一行第一列赋值为 1
int arr[][3] = {1};
// 系统会报错:
int arr[][] = {1};
// 系统会报错:
int arr[3][] = {1};
再定义一个数组时尽量把数组下标数字写上,不写应注意书写规则。在声明一个数组后最好进行初始化,以免不必要的错误。
如何遍历数组元素?
如何访问数组的一个元素?
通过下标的形式进行访问:
int arr[4] = {2,4,6,8};
int n = arr[2]; // 6
printf("%d\n",arr[0]); // 2
注意数组第一个元素下标是 0。
多维数组访问元素:
int ary[][3] = {
{1,2,3},
{4,5,6},
{7,8,9},
{10,11,12}
};
int n = ary[2][2]; // 9
我们声明数组时和访问元素时下标是不同的。声明时几行几列对应的数字就是几,而访问时是从数字 0 开始的,即:第一行第一列用下标就是 ary[0][0] 。
通过循环遍历数组元素:
int arr[5] = {1,3,5,7,9};
for(int i = 0;i < 5;i ++){
printf("%d\n",arr[i]);
// 会输出数组每一项
}
多维数组遍历用双层循环:
int ary[3][4] = {2}; // 第一行第一列为 2
for(int i = 0;i < 3;i ++){
for(int j = 0;j < 4;j ++){
printf("%d\t",ary[i][j]);
}
printf("\n");
}
数组的长度计算
可以通过用 sizeof 运算符算出某个数组的长度(也即一个数组中的元素个数)。如下:
int arr[4];
printf("%d\n",sizeof(arr)); // 16
int len = sizeof(arr)/sizeof(int);
printf("%d\n",len); // 4
从以上代码就可以看到:sizeof(arr) 返回的是正个数组的字节长度(每一个数组元素都是整型,整型占四个字节),而再除以类型字节数就得到了数组长度。
当我们声明一个变量这样声明时 —— int arr[] = {...};,或许会求数组长度(即没有指明下标)。
杨辉三角
说完了数组基础,可以打印一个杨辉三角数组。