C语言教程(十二):C 语言数组详解
一、引言数组的基本概念
数组是一组具有相同数据类型的元素的集合,这些元素在内存中连续存储。通过一个统一的数组名和下标来访问数组中的每个元素。使用数组可以方便地处理大量相同类型的数据,避免为每个数据单独定义变量。
二、一维数组
2.1 数组的定义
定义一维数组的语法格式为:数据类型 数组名[数组大小];
数据类型:指定数组中元素的数据类型,如 `int`、`float`、`char` 等。
数组名:是用户自定义的标识符,用于标识这个数组。
数组大小:表示数组中元素的个数,必须是一个常量表达式。
例子:定义一个包含 5 个整数的数组:int numbers[5];
2.2 数组的初始化
完全初始化:在定义数组时,为数组的每个元素都提供初始值。int numbers[5] = {1, 2, 3, 4, 5};
部分初始化:只提供部分元素的初始值,未提供初始值的元素会被自动初始化为 0。int numbers[5] = {1, 2}; // 等价于 {1, 2, 0, 0, 0}
省略数组大小:如果在初始化时提供了所有元素的初始值,可以省略数组大小,编译器会根据初始值的个数自动确定数组大小。int numbers[] = {1, 2, 3, 4, 5}; // 数组大小为 5
2.3 数组元素的访问
数组元素通过下标来访问,下标从 0 开始。例如,访问 `numbers` 数组的第一个元素:
#include <stdio.h>int main() {int numbers[5] = {1, 2, 3, 4, 5};printf("数组的第一个元素: %d\n", numbers[0]);return 0;}
2.4 数组的遍历
可以使用循环来遍历数组中的所有元素。例如,使用 `for` 循环输出 `numbers` 数组的所有元素:
#include <stdio.h>int main() {int numbers[5] = {1, 2, 3, 4, 5};for (int i = 0; i < 5; i++) {printf("%d ", numbers[i]);}printf("\n");return 0;}
三、多维数组
3.1 二维数组的定义
二维数组可以看作是一个表格,有行和列。定义二维数组的语法格式为:
数据类型 数组名[行数][列数];
例子:定义一个 3 行 4 列的二维整数数组:int matrix[3][4];
3.2 二维数组的初始化
按行初始化:
int matrix[3][4] = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}};
连续初始化:
int matrix[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
同样可以进行部分初始化,未初始化的元素会被自动初始化为 0。
3.3 二维数组元素的访问
通过行下标和列下标来访问二维数组的元素,行下标和列下标都从 0 开始。例如,访问 `matrix` 数组第 2 行第 3 列的元素:
#include <stdio.h>int main() {int matrix[3][4] = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}};printf("第 2 行第 3 列的元素: %d\n", matrix[1][2]);return 0;
}
3.4 二维数组的遍历
可以使用嵌套循环来遍历二维数组的所有元素。例如,使用嵌套 `for` 循环输出 `matrix` 数组的所有元素:
#include <stdio.h>int main() {int matrix[3][4] = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}};for (int i = 0; i < 3; i++) {for (int j = 0; j < 4; j++) {printf("%d ", matrix[i][j]);}printf("\n");}return 0;
}
四、字符数组与字符串
4.1 字符数组的定义与初始化
字符数组用于存储字符序列,定义和初始化方式与普通数组类似。例如:char str[6] = {'H', 'e', 'l', 'l', 'o', '\0'};这里的 `'\0'` 是字符串结束符,用于标识字符串的结束。
4.2 字符串的初始化简化形式
可以使用字符串字面量来初始化字符数组:char str[] = "Hello";编译器会自动在字符串末尾添加 `'\0'`。
4.3 字符串的输入输出
输出:使用 `printf` 函数,格式控制符为 `%s`。
#include <stdio.h>int main() {char str[] = "Hello";printf("%s\n", str);return 0;
}
输入:使用 `scanf` 函数,格式控制符为 `%s`。但要注意 `scanf` 遇到空格会停止读取。
#include <stdio.h>int main() {char str[100];scanf("%s", str);printf("你输入的字符串是: %s\n", str);return 0;
}
也可以使用 `fgets` 函数来读取包含空格的字符串:
#include <stdio.h>int main() {char str[100];fgets(str, sizeof(str), stdin);printf("你输入的字符串是: %s\n", str);return 0;
}
五、数组与指针
5.1 数组名与指针的关系
数组名在大多数情况下会被隐式转换为指向数组第一个元素的指针。例如:
#include <stdio.h>int main() {int numbers[5] = {1, 2, 3, 4, 5};int *ptr = numbers; // numbers 被转换为指向第一个元素的指针printf("数组的第一个元素: %d\n", *ptr);return 0;
}
5.2 通过指针访问数组元素
可以使用指针的算术运算来访问数组元素。例如:
#include <stdio.h>int main() {int numbers[5] = {1, 2, 3, 4, 5};int *ptr = numbers;for (int i = 0; i < 5; i++) {printf("%d ", *(ptr + i));}printf("\n");return 0;
}
六、注意事项
数组越界:访问数组元素时,下标必须在合法范围内(0 到数组大小 - 1),否则会导致数组越界,可能引发未定义行为。
数组大小固定:C 语言中的数组大小在定义时必须确定,不能动态改变。如果需要动态数组,可以使用动态内存分配函数(如 `malloc`、`calloc`、`realloc`)。