一、数组的概念
数组是一种线性数据结构,它是由相同类型的数据元素组成的集合。在C语言中,数组是一种基本的数据结构,用于存储一组具有相同数据类型的数据元素。数组中的每个元素可以通过索引(下标)来访问,索引从0开始。
二、一维数组的定义
一维数组是最简单的数组形式,它只有一行数据。定义一维数组的基本语法如下:
数据类型 数组名[数组长度];
-
数据类型:可以是任意基本数据类型,如
int
、float
、char
等。 -
数组名:用户自定义的数组名称,遵循C语言标识符的命名规则。
-
数组长度:表示数组中可以存储的元素个数,必须是一个正整数。
int arr[5]; // 定义一个包含5个整数的数组 float scores[10]; // 定义一个包含10个浮点数的数组 char letters[26]; // 定义一个包含26个字符的数组
三、数组的初始化
数组可以在定义时进行初始化,也可以在定义后单独赋值。初始化的方法有以下几种:
1. 完全初始化
在定义数组时直接给每个元素赋初值,数组长度可以省略,编译器会根据初值的个数自动确定数组长度。
int arr[] = {1, 2, 3, 4, 5}; // 定义并初始化一个整型数组 float scores[] = {90.5, 85.0, 78.3}; // 定义并初始化一个浮点型数组 char letters[] = {'a', 'b', 'c', 'd'}; // 定义并初始化一个字符数组
如果数组长度和初值个数不一致,编译器会根据初值个数调整数组长度。
2. 部分初始化
只给数组的前几个元素赋初值,其余元素会被自动初始化为0(对于数值型数组)或空字符(对于字符数组)。
int arr[5] = {1, 2}; // 前两个元素初始化为1和2,其余元素为0 char letters[5] = {'a', 'b'}; // 前两个元素初始化为'a'和'b',其余元素为'\0'
3. 字符数组的特殊初始化
字符数组可以用来存储字符串,字符串以空字符
\0
结尾。在初始化字符数组时,可以直接用字符串字面量。char str[] = "Hello"; // 定义并初始化一个字符数组,存储字符串"Hello"
在这种情况下,数组长度会自动加上一个空字符
\0
的位置,例如上面的数组长度为6。四、数组元素的访问
数组元素可以通过数组名和索引(下标)来访问。索引从0开始,最大索引值为数组长度减1。访问数组元素的语法为:
数组名[索引]
例如:
int arr[5] = {1, 2, 3, 4, 5}; printf("%d\n", arr[0]); // 输出数组的第一个元素,结果为1 arr[2] = 10; // 将数组的第三个元素修改为10
需要注意的是,如果访问数组的越界元素(索引超出范围),可能会导致程序运行错误或不可预测的行为。
五、数组的遍历
遍历数组是指依次访问数组中的每个元素。通常使用循环语句来实现数组的遍历。以下是一个使用
for
循环遍历数组的示例:int arr[5] = {1, 2, 3, 4, 5}; for (int i = 0; i < 5; i++) { printf("%d ", arr[i]); } printf("\n");
输出结果为:
1 2 3 4 5
六、数组作为函数参数
数组可以作为函数的参数传递。在传递数组时,通常传递的是数组的首地址(即数组名)。函数可以通过指针来访问和修改数组中的元素。
1. 传递数组到函数
当数组作为函数参数时,函数原型和函数调用中只需要指定数组名,不需要指定数组长度。
void printArray(int arr[], int size) { for (int i = 0; i < size; i++) { printf("%d ", arr[i]); } printf("\n"); } int main() { int arr[5] = {1, 2, 3, 4, 5}; printArray(arr, 5); return 0; }
2. 修改数组元素
在函数中可以通过指针修改数组元素,这些修改会反映到原始数组中。
void incrementArray(int arr[], int size) { for (int i = 0; i < size; i++) { arr[i]++; } } int main() { int arr[5] = {1, 2, 3, 4, 5}; incrementArray(arr, 5); for (int i = 0; i < 5; i++) { printf("%d ", arr[i]); } printf("\n"); return 0; }
输出结果为:
2 3 4 5 6
七、数组的内存分配
在C语言中,数组的内存分配是在栈上完成的,数组的大小必须在编译时确定。数组的内存是连续的,数组名代表数组的首地址。
八、数组的应用示例
数组在C语言中应用广泛,以下是一些常见的应用场景:
1. 存储和处理一组数据
例如,存储学生的成绩、温度记录等。
float temperatures[7] = {23.5, 24.0, 25.5, 26.0, 27.5, 28.0, 29.5}; float sum = 0; for (int i = 0; i < 7; i++) { sum += temperatures[i]; } float average = sum / 7; printf("Average temperature: %.2f\n", average);
2. 实现简单的数据结构
例如,用数组实现栈、队列等数据结构。
3. 字符串处理
字符数组常用于存储和处理字符串。
char str[20] = "Hello, World!"; printf("String: %s\n", str);
九、注意
-
数组长度必须为正整数:数组长度不能为负数或零。
-
数组索引从0开始:访问数组元素时,索引范围为
0
到数组长度 - 1
。 -
数组内存连续:数组的内存是连续分配的,数组名代表数组的首地址。
-
数组初始化:未初始化的数组元素可能包含垃圾值,建议在定义时初始化。
-
数组作为函数参数:传递数组时传递的是数组的首地址,函数可以通过指针修改数组元素。