1. 引言

数组是C语言中一种非常重要的数据结构,它允许程序员以连续的内存空间存储一系列相同类型的数据。在实验六中,我们将深入探讨数组的各种应用,包括动态内存分配、二维数组的操作以及数组的排序与搜索等。

2. 动态内存分配与数组

在C语言中,动态内存分配是管理数组的一种有效方式。通过使用malloccallocrealloc函数,我们可以根据需要分配和调整数组的大小。

2.1 使用malloc分配内存

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *array;
    int size = 10; // 假设我们需要一个大小为10的数组

    array = (int *)malloc(size * sizeof(int)); // 分配内存
    if (array == NULL) {
        printf("Memory allocation failed!\n");
        return 1;
    }

    // 使用数组
    for (int i = 0; i < size; i++) {
        array[i] = i * 2;
    }

    // 释放内存
    free(array);

    return 0;
}

2.2 使用calloc分配内存

calloc函数与malloc类似,但它会自动初始化分配的内存为零。

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *array;
    int size = 10;

    array = (int *)calloc(size, sizeof(int)); // 分配内存并初始化为零
    if (array == NULL) {
        printf("Memory allocation failed!\n");
        return 1;
    }

    // 使用数组
    for (int i = 0; i < size; i++) {
        array[i] = i * 2;
    }

    // 释放内存
    free(array);

    return 0;
}

2.3 使用realloc调整内存大小

realloc函数可以调整已分配内存的大小。

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *array;
    int size = 5;

    array = (int *)malloc(size * sizeof(int)); // 分配内存
    if (array == NULL) {
        printf("Memory allocation failed!\n");
        return 1;
    }

    // 使用数组
    for (int i = 0; i < size; i++) {
        array[i] = i * 2;
    }

    // 调整内存大小
    array = (int *)realloc(array, size * 2 * sizeof(int));

    // 使用调整后的数组
    for (int i = 0; i < size * 2; i++) {
        array[i] = i * 2;
    }

    // 释放内存
    free(array);

    return 0;
}

3. 二维数组的操作

二维数组是数组的数组,它在内存中是连续存储的。下面是一个二维数组的示例,我们将演示如何初始化、访问和修改它。

3.1 初始化二维数组

#include <stdio.h>

int main() {
    int array[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 ", array[i][j]);
        }
        printf("\n");
    }

    return 0;
}

3.2 修改二维数组

#include <stdio.h>

int main() {
    int array[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++) {
            array[i][j] *= 2;
        }
    }

    // 打印修改后的二维数组
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++) {
            printf("%d ", array[i][j]);
        }
        printf("\n");
    }

    return 0;
}

4. 数组的排序与搜索

排序和搜索是数组操作中常见的任务。下面是一些常用的排序算法和搜索算法的示例。

4.1 冒泡排序

#include <stdio.h>

void bubbleSort(int *array, int size) {
    for (int i = 0; i < size - 1; i++) {
        for (int j = 0; j < size - i - 1; j++) {
            if (array[j] > array[j + 1]) {
                // 交换元素
                int temp = array[j];
                array[j] = array[j + 1];
                array[j + 1] = temp;
            }
        }
    }
}

int main() {
    int array[] = {64, 34, 25, 12, 22, 11, 90};
    int size = sizeof(array) / sizeof(array[0]);

    bubbleSort(array, size);

    // 打印排序后的数组
    for (int i = 0; i < size; i++) {
        printf("%d ", array[i]);
    }
    printf("\n");

    return 0;
}

4.2 二分搜索

#include <stdio.h>

int binarySearch(int *array, int size, int value) {
    int low = 0;
    int high = size - 1;

    while (low <= high) {
        int mid = low + (high - low) / 2;

        if (array[mid] == value) {
            return mid;
        } else if (array[mid] < value) {
            low = mid + 1;
        } else {
            high = mid - 1;
        }
    }

    return -1; // 未找到
}

int main() {
    int array[] = {2, 3, 4, 10, 40};
    int size = sizeof(array) / sizeof(array[0]);
    int value = 10;

    int result = binarySearch(array, size, value);

    if (result != -1) {
        printf("Element is present at index %d", result);
    } else {
        printf("Element is not present in array");
    }

    return 0;
}

5. 结论

通过实验六的深入解析,我们了解了C语言中数组的多种应用。从动态内存分配到二维数组的操作,再到排序和搜索算法,这些技能对于C语言程序员来说至关重要。通过实际操作和实践,您可以更好地掌握数组的编程技巧。