C语言之数组初体验

数组是 C 语言中的一个重要数据结构,它允许你在内存中存储多个相同类型的元素。数组能够帮助我们高效地组织和处理数据,特别是在需要操作大量数据时。接下来,我们将从 C 语言数组的基础开始,一步步学习如何使用数组。


1. 数组的定义与初始化

1.1 定义数组

数组是一组相同数据类型元素的集合,可以通过以下方式定义数组:

type array_name[array_size];

  • type:数组元素的数据类型(如 intfloat 等)。
  • 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 语言中的强大功能,并为后续更复杂的数据结构和算法打下坚实的基础。