MST

星途 面试题库

面试题:C语言指针与数组等价访问方式 - 复杂场景

定义一个二维数组 `int matrix[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};`。编写一个函数,使用指针方式访问并返回 `matrix[i][j]` 处的元素值(`i` 和 `j` 作为函数参数传入),并解释在二维数组场景下指针与数组等价访问方式与一维数组有何不同,这种不同在内存布局上是如何体现的。
33.6万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>

// 函数声明
int getElement(int (*matrix)[4], int i, int j);

int main() {
    int matrix[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
    int i = 1, j = 2;
    int value = getElement(matrix, i, j);
    printf("matrix[%d][%d] 的值为: %d\n", i, j, value);
    return 0;
}

// 函数定义
int getElement(int (*matrix)[4], int i, int j) {
    return *(*(matrix + i) + j);
}

二维数组与一维数组指针访问方式的不同

  1. 一维数组:在一维数组中,数组名本身就是一个指向数组首元素的指针。例如,int arr[5];arr 就相当于 &arr[0],类型为 int*。访问数组元素 arr[i] 等价于 *(arr + i),因为数组在内存中是连续存储的,arr + i 直接指向第 i 个元素的地址,再通过解引用 * 操作获取该元素的值。
  2. 二维数组:对于二维数组 int matrix[3][4];matrix 是指向第一行数组的指针,其类型为 int (*)[4],而不是 int**matrix + i 指向第 i 行数组的起始地址,*(matrix + i) 等价于 matrix[i],是指向第 i 行第一个元素的指针,类型为 int*。要访问 matrix[i][j],需要先通过 *(matrix + i) 找到第 i 行首元素指针,再加上 j 偏移并解引用,即 *(*(matrix + i) + j)

内存布局体现

  1. 一维数组:一维数组的内存布局是简单的线性连续存储。例如 int arr[5],内存中依次存储 arr[0]arr[1]arr[2]arr[3]arr[4],相邻元素地址连续递增,步长为 sizeof(int)
  2. 二维数组:二维数组在内存中也是连续存储的,但逻辑上按行排列。对于 int matrix[3][4],先存储第一行的 4 个元素,再存储第二行,然后第三行。matrix[0]matrix[1]matrix[2] 这三行在内存中连续存储,每行内部的 4 个元素也连续存储。访问 matrix[i][j] 时,需要先找到第 i 行的起始地址(matrix + i),再在该行内找到第 j 个元素(*(matrix + i) + j)。