MST

星途 面试题库

面试题:C语言数组指针与指针数组在函数参数传递中的运用

编写两个函数,一个函数接受一个数组指针作为参数,另一个函数接受一个指针数组作为参数。在主函数中定义一个二维数组,并分别调用这两个函数对二维数组进行处理(比如求所有元素之和),并解释数组指针和指针数组作为函数参数时的不同之处及适用场景。
35.9万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>

// 接受数组指针作为参数的函数
int sumWithArrayPointer(int (*arr)[3], int rows) {
    int sum = 0;
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < 3; j++) {
            sum += arr[i][j];
        }
    }
    return sum;
}

// 接受指针数组作为参数的函数
int sumWithPointerArray(int **arr, int rows, int cols) {
    int sum = 0;
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            sum += arr[i][j];
        }
    }
    return sum;
}

int main() {
    int twoDArray[2][3] = {
        {1, 2, 3},
        {4, 5, 6}
    };

    // 调用接受数组指针的函数
    int sum1 = sumWithArrayPointer(twoDArray, 2);
    printf("使用数组指针的和: %d\n", sum1);

    // 准备指针数组
    int *ptrArray[2];
    for (int i = 0; i < 2; i++) {
        ptrArray[i] = twoDArray[i];
    }

    // 调用接受指针数组的函数
    int sum2 = sumWithPointerArray(ptrArray, 2, 3);
    printf("使用指针数组的和: %d\n", sum2);

    return 0;
}

数组指针和指针数组作为函数参数的不同之处及适用场景

  • 不同之处
    • 数组指针:本质是一个指针,指向一个数组。在函数参数中,它的类型为int (*arr)[n],其中n是数组的列数。这种形式可以直接使用二维数组的下标访问方式arr[i][j],编译器知道数组的列数,在内存访问时能够正确计算偏移量。
    • 指针数组:本质是一个数组,数组中的元素是指针。在函数参数中,它的类型为int **arr。使用这种形式时,编译器不知道数组的列数,需要额外传递列数参数。并且访问元素时,也是通过指针偏移来实现arr[i][j]的效果。
  • 适用场景
    • 数组指针:适用于二维数组在内存中是连续存储的情况,比如静态分配的二维数组。这种方式代码简洁,编译器可以更好地进行优化,对于固定维度的二维数组操作非常方便。
    • 指针数组:适用于二维数组的列数可能不同(即所谓的“锯齿数组”),或者二维数组是动态分配内存的情况。因为指针数组中的每个指针可以指向不同长度的数组,更加灵活,但同时代码实现会相对复杂一些,需要更多的内存管理操作。