MST

星途 面试题库

面试题:C语言指针在函数参数传递的深度剖析与优化

在C语言中,有一个函数原型为void processData(int *** data, int * rows, int * cols),假设data指向一个三维数组(其实是通过指针模拟的)。编写代码初始化这个三维数组,然后调用processData函数,在函数内部对数组的所有元素进行特定的数学运算(例如平方)。同时,解释在这个过程中指针的多级间接寻址是如何工作的,以及怎样优化指针传递以提高程序的性能和可读性。要求给出完整的代码实现及详细解释。
17.7万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

代码实现

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

// 函数原型
void processData(int *** data, int * rows, int * cols);

int main() {
    int rows = 3;
    int cols = 4;
    // 分配内存给指向二维数组的指针
    int ** twoDArray = (int **)malloc(rows * sizeof(int *));
    for (int i = 0; i < rows; i++) {
        // 为每一行分配内存
        twoDArray[i] = (int *)malloc(cols * sizeof(int));
    }

    // 初始化三维数组(这里用二维数组模拟,因为实际三维数组指针模拟更复杂,这里简化处理逻辑)
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            twoDArray[i][j] = i + j;
        }
    }

    // 调用processData函数
    processData((int ***)&twoDArray, &rows, &cols);

    // 打印处理后的数据
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", twoDArray[i][j]);
        }
        printf("\n");
    }

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

    return 0;
}

void processData(int *** data, int * rows, int * cols) {
    int ** twoDArray = *data;
    for (int i = 0; i < *rows; i++) {
        for (int j = 0; j < *cols; j++) {
            // 对数组元素进行平方运算
            twoDArray[i][j] = twoDArray[i][j] * twoDArray[i][j];
        }
    }
}

指针多级间接寻址解释

  1. int *** data:这是一个三级指针。在main函数中,twoDArray是一个二级指针(指向一个指针数组,每个指针又指向一个整数数组)。当传递(int ***)&twoDArray时,实际上传递的是twoDArray的地址,这样processData函数中的data就指向了twoDArray的地址。通过*data,可以获取到twoDArray这个二级指针,进而访问二维数组。
  2. int * rowsint * cols:这两个一级指针用于传递数组的行数和列数。在processData函数中,通过*rows*cols可以获取实际的行数和列数。

优化指针传递以提高性能和可读性

  1. 性能优化
    • 使用指针传递而不是值传递整个数组,可以避免大量的数据复制,提高程序性能。在这个例子中,传递的是指向二维数组的指针,而不是整个二维数组,减少了内存拷贝开销。
    • 对于多维数组,连续内存分配(如使用malloc分配一块连续的内存来存储二维数组)可以提高缓存命中率,因为数据在内存中是连续存储的,访问时更高效。例如,在更复杂的三维数组模拟中,可以分配一块连续的内存来存储所有元素,然后通过指针运算来访问不同维度的元素。
  2. 可读性优化
    • 使用有意义的变量名,如rowscolsdata,使代码意图更清晰。
    • 将指针操作封装在函数中,如processData函数,使得主程序逻辑更简洁,易于理解和维护。
    • 增加注释,像上述代码中的注释,对关键的指针操作和函数逻辑进行解释,提高代码的可读性。