MST

星途 面试题库

面试题:C语言指针运算的复杂场景

给定一个二维数组int arr[3][4],有一个指针p指向arr[0][0]。请通过指针运算,实现获取arr[1][2]的值,同时说明指针运算过程中地址偏移的原理。
11.1万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
  1. 获取arr[1][2]的值
    • 已知指针p指向arr[0][0],二维数组arr可以看作是按行存储的。在int arr[3][4]中,每个int类型的数据占4个字节(假设int为4字节)。
    • 要访问arr[1][2],先计算从arr[0][0]arr[1][0]的偏移,因为一行有4个int类型的数据,所以偏移量为4 * sizeof(int)
    • 再从arr[1][0]arr[1][2],偏移量为2 * sizeof(int)
    • 总的偏移量为(1 * 4 + 2) * sizeof(int)
    • 代码如下:
#include <stdio.h>

int main() {
    int arr[3][4] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };
    int *p = &arr[0][0];
    int value = *(p + 1 * 4 + 2);
    printf("arr[1][2]的值为: %d\n", value);
    return 0;
}
  1. 地址偏移原理
    • 在C语言中,二维数组在内存中是按行顺序存储的。对于int arr[m][n]arr[i][j]的地址计算公式为:&arr[0][0] + (i * n + j) * sizeof(int)
    • 这里i表示行号,j表示列号。从起始地址&arr[0][0]开始,先跳过i行,每行有n个元素,每个元素大小为sizeof(int),所以偏移i * n * sizeof(int),然后再在第i行中偏移j个元素的大小,即j * sizeof(int),两者相加就是arr[i][j]相对于arr[0][0]的地址偏移量。通过指针p,可以利用这种偏移量计算来访问数组中的任意元素,p + offset就是目标元素的地址,再通过解引用*(p + offset)获取其值。