跳转到内容

C 语言数组操作

来自代码酷

C语言数组操作[编辑 | 编辑源代码]

介绍[编辑 | 编辑源代码]

数组是C语言中一种重要的数据结构,用于存储相同类型的多个元素。数组操作包括创建、初始化、访问、修改、遍历以及多维数组的处理。掌握数组操作是学习C语言的关键步骤之一,因为数组广泛应用于数据处理、算法实现和内存管理等领域。

数组的特点:

  • 元素类型相同
  • 内存连续分配
  • 通过索引(下标)访问
  • 大小固定(静态数组)

数组声明与初始化[编辑 | 编辑源代码]

一维数组[编辑 | 编辑源代码]

一维数组的声明语法:

数据类型 数组名[数组大小];

示例:

int numbers[5]; // 声明一个包含5个整数的数组

初始化方式:

// 方式1:声明时初始化
int numbers[5] = {1, 2, 3, 4, 5};

// 方式2:部分初始化(剩余元素自动初始化为0)
int numbers[5] = {1, 2};

// 方式3:自动确定大小
int numbers[] = {1, 2, 3, 4, 5}; // 编译器自动计算大小为5

多维数组[编辑 | 编辑源代码]

C语言支持多维数组,最常见的是二维数组(矩阵)。

声明语法:

数据类型 数组名[行数][列数];

示例:

int matrix[3][3] = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

基本数组操作[编辑 | 编辑源代码]

访问数组元素[编辑 | 编辑源代码]

数组元素通过索引访问,索引从0开始。

示例:

int numbers[5] = {10, 20, 30, 40, 50};
printf("%d", numbers[2]); // 输出:30

修改数组元素[编辑 | 编辑源代码]

numbers[1] = 25; // 将第二个元素改为25

遍历数组[编辑 | 编辑源代码]

使用循环结构遍历数组:

for(int i = 0; i < 5; i++) {
    printf("%d ", numbers[i]);
}
// 输出:10 25 30 40 50

数组与指针的关系[编辑 | 编辑源代码]

在C语言中,数组名本质上是指向数组第一个元素的指针。

示例:

int numbers[3] = {1, 2, 3};
int *ptr = numbers; // ptr指向数组首元素

printf("%d", *ptr); // 输出:1
printf("%d", *(ptr + 1)); // 输出:2

常见数组操作函数[编辑 | 编辑源代码]

虽然C语言没有内置的数组操作函数,但可以自己实现:

数组复制[编辑 | 编辑源代码]

void arrayCopy(int src[], int dest[], int size) {
    for(int i = 0; i < size; i++) {
        dest[i] = src[i];
    }
}

数组求和[编辑 | 编辑源代码]

int arraySum(int arr[], int size) {
    int sum = 0;
    for(int i = 0; i < size; i++) {
        sum += arr[i];
    }
    return sum;
}

数组的内存表示[编辑 | 编辑源代码]

数组在内存中是连续存储的。例如,一个包含3个整数的数组:

graph LR A[numbers[0]] --> B[numbers[1]] --> C[numbers[2]]

内存地址计算: address of arr[i]=base address+(i×sizeof(data type))

实际应用案例[编辑 | 编辑源代码]

案例1:成绩统计[编辑 | 编辑源代码]

计算学生平均成绩:

#include <stdio.h>

int main() {
    float grades[5] = {85.5, 90.0, 78.5, 92.5, 88.0};
    float sum = 0.0;
    
    for(int i = 0; i < 5; i++) {
        sum += grades[i];
    }
    
    printf("平均成绩: %.2f\n", sum / 5);
    return 0;
}

输出:

平均成绩: 86.90

案例2:矩阵转置[编辑 | 编辑源代码]

实现3x3矩阵的转置:

#include <stdio.h>

void transpose(int matrix[3][3]) {
    int temp;
    for(int i = 0; i < 3; i++) {
        for(int j = i + 1; j < 3; j++) {
            temp = matrix[i][j];
            matrix[i][j] = matrix[j][i];
            matrix[j][i] = temp;
        }
    }
}

int main() {
    int matrix[3][3] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };
    
    transpose(matrix);
    
    // 打印转置后的矩阵
    for(int i = 0; i < 3; i++) {
        for(int j = 0; j < 3; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
    return 0;
}

输出:

1 4 7 
2 5 8 
3 6 9 

常见错误与注意事项[编辑 | 编辑源代码]

1. 数组越界:访问超出数组范围的索引会导致未定义行为

   int arr[3] = {1, 2, 3};
   printf("%d", arr[3]); // 错误!有效索引是0-2

2. 数组大小必须为常量(在标准C中)

   int size = 5;
   int arr[size]; // 在C99之前是错误,C99支持变长数组

3. 数组名不是指针(虽然可以转换为指针)

   int arr[5];
   printf("%zu", sizeof(arr)); // 输出整个数组的大小,不是指针大小

高级主题[编辑 | 编辑源代码]

动态数组[编辑 | 编辑源代码]

使用指针和内存分配函数创建动态大小的数组:

#include <stdlib.h>

int main() {
    int size = 10;
    int *dynamicArray = (int*)malloc(size * sizeof(int));
    
    if(dynamicArray != NULL) {
        for(int i = 0; i < size; i++) {
            dynamicArray[i] = i * 2;
        }
        
        // 使用数组...
        
        free(dynamicArray); // 释放内存
    }
    return 0;
}

数组作为函数参数[编辑 | 编辑源代码]

数组作为函数参数时,实际上传递的是指向数组第一个元素的指针:

void printArray(int arr[], int size) {
    for(int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
}

// 调用
int numbers[5] = {1, 2, 3, 4, 5};
printArray(numbers, 5);

总结[编辑 | 编辑源代码]

C语言数组是基础而强大的数据结构,理解数组操作对于掌握C语言编程至关重要。从简单的元素访问到复杂的多维数组处理,数组在各种编程场景中都有广泛应用。记住数组的固定大小特性和指针关系,可以避免许多常见错误。随着编程经验的积累,你会发现在更复杂的数据结构和算法中,数组操作仍然是基础中的基础。