MST

星途 面试题库

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

假设有一个二维数组`int arr[3][4]`,请编写代码将其转换为指针数组`int *ptr[3]`,并解释在转换过程中涉及到的C语言指针与数组之间的原理,包括地址计算、数据访问方式的变化等。
11.4万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>

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

    for (int i = 0; i < 3; i++) {
        ptr[i] = arr[i];
    }

    // 输出验证
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++) {
            printf("%d ", ptr[i][j]);
        }
        printf("\n");
    }

    return 0;
}

指针与数组原理

  1. 地址计算
    • 在二维数组int arr[3][4]中,arr是数组名,代表首元素地址,也就是arr[0]的地址。arr[0]本身又是一个包含4个int类型元素的数组,其地址也是arr[0][0]的地址。对于arr[i][j],其地址计算为&arr[0][0] + i * 4 + j(假设int类型占4个字节),因为每一行有4个int类型元素。
    • 对于指针数组int *ptr[3]ptr是数组名,代表首元素地址,即ptr[0]的地址。ptr[i]存储的是arr[i]的地址,也就是arr[i][0]的地址。
  2. 数据访问方式变化
    • 对于二维数组arr,可以使用arr[i][j]的方式访问数据,编译器会根据上述地址计算方式找到对应的数据。
    • 对于指针数组ptrptr[i]是一个指针,指向arr[i]的起始地址,ptr[i][j]等同于*(ptr[i] + j),先找到ptr[i]指向的地址,然后偏移jint类型的位置来访问数据。