数组是一种基本的数据结构,用于存储同一类型的数据项集合。在C语言中,数组的所有元素在内存中是连续存储的。编译器根据代码中的声明信息来分配适当的内存空间。
一维数组
定义一维数组时,需指定其数据类型和大小。例如:
int days[365]; // 定义一个包含365个整数的数组
char code[12]; // 定义一个包含12个字符的数组
数组声明后,如果不进行初始化,数组中的值将是未定义的。为了确保数组元素的值是有意义的,通常需要对其进行初始化。例如:
int nums[12] = {12, 24, 36, 48, 64, 76, 88, 100, 112, 124, 136, 148};
for (int i = 0; i <12; ++i) {
printf("Element %d is %d\n", i + 1, nums[i]);
}
如果初始化值的数量少于数组的大小,剩余的元素将自动初始化为0。若初始化值过多,则编译器会报错。
可以通过sizeof
运算符来获取数组的长度,例如:int len = sizeof(nums) / sizeof(nums[0]);
多维数组
多维数组是指具有多个维度的数组。例如,一个二维数组可以表示为:int matrix[3][4];
。多维数组的元素存储遵循行主序原则,即最内层的下标变化最快。
多维数组的初始化可以采用两种形式:一种是直接列出所有元素的值,另一种是按行或列分组列出。例如:
int tda[3][4] = {11, 12, 13, 14, 21, 22, 23, 24, 31, 32, 33, 34};
int tdb[3][4] = {{11, 12, 13, 14}, {21, 22, 23, 24}, {31, 32, 33, 34}};
对于不完全初始化的情况,可以省略最后一个维度的部分元素,但中间维度的元素不能省略。
多维数组的访问同样使用下标,例如:int value = tda[1][2];
。
数组与指针
虽然数组和指针在某些操作上表现相似,但它们之间存在本质的区别。数组名本质上是一个指向数组首元素的常量指针,而普通指针则是一个可变的变量。例如:
int arr[5];
int *ptr;
数组名arr
不能被修改,而指针ptr
可以改变指向。此外,数组名在表达式中通常会被隐式转换为指向其首元素的指针。
指针数组
指针数组是一个数组,其每个元素都是一个指针。例如:int *ptrArray[10];
。这种类型的数组常用于存储字符串或其他数据结构的地址。例如:
char *keywords[] = {"do", "for", "if", "register", "return", "switch", "while", NULL};
在这个例子中,NULL
作为数组的结束标志,便于在遍历数组时判断终止条件。