MST

星途 面试题库

面试题:C语言多维数组与指针转换细节

假设有一个二维数组`int arr[3][4]`,解释它在内存中的存储方式。当将`arr`作为指针传递给一个函数时,函数如何正确接收并通过指针操作数组元素?编写一个函数`void printArray(int *ptr, int rows, int cols)`,使用指针来打印该二维数组的所有元素。
26.9万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
  1. 二维数组int arr[3][4]在内存中的存储方式
    • 在C语言中,二维数组int arr[3][4]按行优先顺序存储在内存中。即先存储第一行的4个元素,接着存储第二行的4个元素,最后存储第三行的4个元素。整个数组在内存中是连续存储的。
    • 例如,arr[0][0]是数组的第一个元素,紧跟其后的是arr[0][1]arr[0][2]arr[0][3],然后是arr[1][0]arr[1][1]等。
  2. 函数接收并通过指针操作数组元素
    • 当将arr作为指针传递给函数时,由于二维数组名本质上是指向其首元素的指针,这里首元素是一个包含4个int类型元素的一维数组,所以函数参数可以声明为int (*ptr)[4](这里4是二维数组第二维的大小)。这样ptr就可以正确指向二维数组的每一行,通过指针偏移操作数组元素。
  3. printArray函数实现
#include <stdio.h>

void printArray(int *ptr, int rows, int cols) {
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            // 通过指针偏移获取元素
            printf("%d ", *(ptr + i * cols + j));
        }
        printf("\n");
    }
}

你可以使用以下方式调用这个函数:

int main() {
    int arr[3][4] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };
    printArray((int *)arr, 3, 4);
    return 0;
}

printArray函数中,ptr是指向int类型的指针,通过i * cols + j的偏移量来正确访问二维数组的每一个元素。在main函数中,将二维数组arr强制转换为int *类型传递给printArray函数,并传入数组的行数和列数。