变量只能存储一个单一的值。这一章节,我们将会讨论一种具有可存取多个变量能力的变量。
它的类型称为数组。
一维数组
声明数组
data_type array_name[number_of_elements];
例如:
int arr[1000], 这是声明了一个具有1000个int元素的数组。可以想象如果C不支持集合变量,如果要声明的话,我们只能声明1000个不同的整型变量。
如果声明一个数组的长度,最佳实践是使用一个宏来代替。这样的话,如果你想修改它,直接修改宏即可,如:
#define SIZE 100
float arr[SIZE];
不像宏一下,如果我们使用一个const常量去指定长度的时候,例如下面的例子,它是非法的:
const int size = 150;
float arr[size]; /* illegal */
我们声明一个数组,编译器会分配内存空间去存储元素的值。这些值被存储在相互连续的内存空间。通常,内存空间被分配的区域称为栈,当这个声明的数组结束时,它占用的内存被自动释放。例如,有10个整型元素的数组int arr[10],编译器将会分配40bytes用来存储这10个元素。
着这里,一定有要注意数组的边界问题,int arr[10],那么这个数组有10个元素,第一个元素下标是arr[0],最后一个元素的下标是arr[9].如果我们写了 arr[10] = 100,编译器就会报错。
数组初始化
int arr[4] = {10, 20, 30, 40};
int a[10] = {10, 20};
意思是:
a[0] = 10
a[1] = 20
a[2] to a[9] 被设置为 0 .
int arr[] = {10, 20, 30, 40};
如果不写数组长度时,那么此数组就会根据赋值的个数来判断size,此时的数组等价写法:
int arr[4] = {10, 20, 30, 40}
二维数组
data_type array_name[number_of_rows][number_of_columns]
二维数组的初始化:
int arr[3][3] = {10, 20};
arr[0][0] = 10
arr[0][1] = 20
arr[0][2] = 0
int arr[][3] = {10, 20, 30, 40, 50, 60};
上面会被编译器自动转换成为,2行3列
int arr[][3] = {10, 20, 30, 40, 50, 60,70};
此时会被转换成3行3列
其实C语言只是支持一维数组,二维数组只是在形态上与一维数组不同,事实上二维数组也是和一维数组一样都是使用连续的内存空间。二维组的地址类似于基地址+偏移地址