C语言之数组初体验
数组是 C 语言中的一个重要数据结构,它允许你在内存中存储多个相同类型的元素。数组能够帮助我们高效地组织和处理数据,特别是在需要操作大量数据时。接下来,我们将从 C 语言数组的基础开始,一步步学习如何使用数组。
1. 数组的定义与初始化
1.1 定义数组
数组是一组相同数据类型元素的集合,可以通过以下方式定义数组:
type array_name[array_size];
type
:数组元素的数据类型(如int
、float
等)。array_name
:数组名称。array_size
:数组的大小,即数组中元素的个数。
1.2 数组的初始化
数组可以在定义时进行初始化。初始化的方式有几种:
// 方式 1:通过花括号直接赋值
int arr1[] = {1, 2, 3, 4, 5}; // 自动推导数组大小
int arr2[5] = {1, 2, 3}; // 前 3 个元素初始化,后 2 个元素默认为 0
// 方式 2:逐一指定每个元素的值
int arr3[5] = {0}; // 所有元素初始化为 0
// 方式 3:不初始化(会有不确定值)
int arr4[5]; // 未初始化的数组元素含有不确定值
1.3 数组大小与内存
数组的大小决定了它在内存中所占的空间。数组的内存分配是连续的,并且数组的大小一旦定义,就不能改变。
int arr[5]; // arr 是一个包含 5 个整数元素的数组,数组的总大小为 5 * sizeof(int)
2. 访问数组元素
2.1 通过索引访问
C 语言中的数组是通过下标(索引)来访问每个元素的。数组索引从 0 开始,最大索引为 array_size - 1
。
int arr[] = {1, 2, 3, 4, 5};
printf("%d\n", arr[0]); // 输出第一个元素 1
printf("%d\n", arr[4]); // 输出最后一个元素 5
2.2 修改数组元素
你可以通过数组的索引来修改数组中的元素。
arr[2] = 10; // 将 arr 中索引为 2 的元素修改为 10
2.3 数组遍历
遍历数组是一个常见的操作,通常使用 for
循环来实现。
for (int i = 0; i < 5; i++) {
printf("%d ", arr[i]); // 输出数组中的每个元素
}
3. 二维数组
除了常见的一维数组,C 语言还支持二维数组(矩阵)。二维数组可以看作是数组的数组。
3.1 定义二维数组
二维数组的定义方式如下:
type array_name[row_size][col_size];
row_size
:行数。col_size
:列数。
int matrix[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
3.2 访问二维数组元素
你可以使用两个索引来访问二维数组中的元素。
printf("%d\n", matrix[0][1]); // 输出第一行第二列的元素 2
3.3 二维数组遍历
二维数组通常通过两层嵌套的 for
循环来遍历:
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
4. 数组的传递
C 语言中的数组是通过指针传递的,这意味着当我们将数组传递给函数时,传递的是数组的地址,而不是数组的副本。
4.1 传递数组到函数
我们可以将数组作为函数参数传递。需要注意的是,数组名是数组首元素的地址。
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
printArray(arr, 5); // 传递数组和数组的大小
return 0;
}
4.2 传递二维数组到函数
对于二维数组,必须指定数组的列数。
void printMatrix(int matrix[][3], int rows) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
}
int main() {
int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};
printMatrix(matrix, 2); // 传递二维数组和行数
return 0;
}
5. 数组与指针
在 C 语言中,数组名实际上是指向数组首元素的指针。这意味着你可以使用指针来操作数组元素。
5.1 数组与指针的关系
int arr[] = {1, 2, 3, 4, 5};
int* ptr = arr; // 数组名 `arr` 实际上是数组的首地址
printf("%d\n", *(ptr + 2)); // 输出 3,相当于 arr[2]
5.2 使用指针遍历数组
for (int* ptr = arr; ptr < arr + 5; ptr++) {
printf("%d ", *ptr); // 通过指针访问数组元素
}
6. 数组的常见应用
6.1 反转数组
反转数组是一个常见的练习,通常使用双指针法:
void reverseArray(int arr[], int size) {
int start = 0;
int end = size - 1;
while (start < end) {
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
start++;
end--;
}
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
reverseArray(arr, 5);
printArray(arr, 5); // 输出 5 4 3 2 1
return 0;
}
6.2 查找最大值和最小值
int findMax(int arr[], int size) {
int max = arr[0];
for (int i = 1; i < size; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
总结
数组是 C 语言中最基本也是最常用的数据结构之一。它能够帮助你高效地存储和处理大量的同类数据。通过了解数组的定义、初始化、访问、遍历、传递以及指针的使用,你将能够掌握数组在 C 语言中的强大功能,并为后续更复杂的数据结构和算法打下坚实的基础。
发表回复