目录
一维数组
定义
数组就是在内存中开辟一段连续的空间,来存放一组相同类型元素的集合,并且可以根据元素在数组中所在的位置把它们一个一个地选出来。
声明一个数组,需要指明数组元素的类型和数量。如:在arr数组中放10个int类型的元素,就可以写成:int arr[10];
数组的长度可以用任何(整数)常量表达式指定,我们的程序可能需要调整数组的长度,比较好的办法是用宏来定义数组的长度:
#define N 10
int arr[N];
当然在C99标准中引入了变长数组的概念,使得数组长度可以是一个变量,但是目前只有gcc编译器支持变长数组。
数组的初始化
int arr[10];
//未进行初始化,里面放的是随机值。
int arr[10]={1,2,3,4,5,6,7,8,9,10};
//完全初始化,每个数组元素都有对应的值
int arr[10]={0};
//不完全初始化,只赋值了一个0,但是数组的长度为10,所以后面未被初始化的元素都会被系统默认初始化为0.
在定义数组时,长度可以省略,此时编译器会根据声明的内容来确定数组的长度。如:
int arr[ ]={1,2,3,4,5};此时的数组arr的长度是5,因为只初始化了五个数组元素
数组下标
数组元素始终是从0 开始,因此 长度为n的数组元素的下标是0 ~ n-1.
对于读取或者打印数组是,必须要把一个数组分开进行操作
for (i = 0; i < N; i++)
{
scanf("%d", &a[i]);
}
for (i = 0; i < N; i++)
{
printf("%d ", &a[i]);
}
数组的下标可以是任何整数表达式,如:a[i*3 + j] = 0;
在C语言中,不要求检查下标的范围。当下表超出范围时,系统可能不会报错。
#include <stdio.h>
int main()
{
int i = 0;
int arr[10] = { 0 };
for (i = 0; i <= 12; i++)
{
arr[i] = 0;
printf("hello world\n");
}
return 0;
}
在VS编译器下,这个代码的结果是死循环的。因为当i = 12时,程序会把 0 存储在arr[12]中,但是arr[12]不存在,因此会在arr[9]后面的第3个位置存放数值0。如果在内存中变量 i 正好存放在arr[9]后面的第3个位置,那么就是变量i被重置为0,这就导致了死循环。
二维数组
数组可以是任意维数,比较常见是的二维数组,又称为矩阵。如:
int arr[m][n] = {0};
arr数组有m行n列,和一维数组一样,数组元素的下标都是从0开始。在内存中二维数组不会一层一层地去存储,而是按照行主序存储数组的。
二维数组的初始化
二维数组的初始化和一维数组差不多,但是在一维数组中[ ]里面的数字可以省略,而在二维数组中
行可以省略,列是不可以省略的。如:int arr[ ][5] = { 0 };