MST
星途 面试题库

面试题:C语言指针在复杂多维数组场景下的应用

在一个不规则的多维数组场景中,例如 `int *irregular[3]; irregular[0] = (int *)malloc(2 * sizeof(int)); irregular[1] = (int *)malloc(3 * sizeof(int)); irregular[2] = (int *)malloc(4 * sizeof(int));`,初始化这些动态分配的数组元素后,使用指针以最优化的方式对整个不规则多维数组进行排序(可选用合适的排序算法),并说明指针操作在这个过程中的关键步骤和注意事项。
26.0万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
  1. 排序算法选择:可以选择快速排序(Quick Sort),它在平均情况下具有较好的时间复杂度$O(nlogn)$,适合大规模数据排序。

  2. 指针操作关键步骤

    • 数组元素访问:由于irregular是一个指针数组,要访问具体的元素,需要先通过irregular[i]获取到指向第i个子数组的指针,然后再通过irregular[i][j]访问第i个子数组的第j个元素。例如,访问第一个子数组的第一个元素:*(irregular[0])
    • 传递指针:在实现快速排序时,需要传递指向整个不规则多维数组的指针,即irregular。对于快速排序的分区函数,需要确定如何基于指针正确地访问和交换数组元素。
  3. 注意事项

    • 内存管理:在排序完成后,要记得释放通过malloc分配的内存。即依次调用free(irregular[0]); free(irregular[1]); free(irregular[2]);
    • 边界检查:在访问数组元素时,要确保不越界。例如,对于irregular[0],最多只能访问到irregular[0][1],因为它只分配了2个int的空间。
    • 指针类型一致性:在函数参数传递和操作过程中,要确保指针类型的一致性。例如,如果函数期望接收int*类型的指针,传递irregular时要注意其实际类型为int*[3],需要进行合适的转换或操作。

以下是使用快速排序实现的示例代码:

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

// 交换两个整数
void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

// 分区函数
int partition(int **arr, int low, int high, int *sizes) {
    int pivot = arr[high][0];
    int i = low - 1;

    for (int j = low; j < high; j++) {
        if (arr[j][0] <= pivot) {
            i++;
            swap(&arr[i][0], &arr[j][0]);
        }
    }
    swap(&arr[i + 1][0], &arr[high][0]);
    return i + 1;
}

// 快速排序函数
void quickSort(int **arr, int low, int high, int *sizes) {
    if (low < high) {
        int pi = partition(arr, low, high, sizes);

        quickSort(arr, low, pi - 1, sizes);
        quickSort(arr, pi + 1, high, sizes);
    }
}

int main() {
    int *irregular[3];
    irregular[0] = (int *)malloc(2 * sizeof(int));
    irregular[1] = (int *)malloc(3 * sizeof(int));
    irregular[2] = (int *)malloc(4 * sizeof(int));

    // 初始化数组元素
    irregular[0][0] = 5;
    irregular[0][1] = 3;
    irregular[1][0] = 4;
    irregular[1][1] = 6;
    irregular[1][2] = 2;
    irregular[2][0] = 7;
    irregular[2][1] = 1;
    irregular[2][2] = 9;
    irregular[2][3] = 8;

    int sizes[3] = {2, 3, 4};

    quickSort(irregular, 0, 2, sizes);

    // 输出排序后的数组
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < sizes[i]; j++) {
            printf("%d ", irregular[i][j]);
        }
        printf("\n");
    }

    // 释放内存
    for (int i = 0; i < 3; i++) {
        free(irregular[i]);
    }

    return 0;
}

此代码通过快速排序对不规则多维数组进行排序,并在排序后释放内存。注意,这里只是对每个子数组的第一个元素进行排序,若要对所有元素排序,需要更复杂的处理方式来展平数组等操作。