MST

星途 面试题库

面试题:C语言指针表达式在复杂场景下的应用

假设有一个二维数组 `int arr[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};`,以及一个指针 `int *ptr = &arr[0][0];`。通过指针表达式,如何获取 `arr[1][2]` 的值,并解释指针运算的过程。如果要遍历整个二维数组,如何通过指针表达式实现?
10.4万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
  1. 获取 arr[1][2] 的值:
    • 指针表达式为 *(ptr + 1 * 4 + 2)
    • 解释:在二维数组 arr[3][4] 中,数组在内存中是按行顺序存储的。ptr 指向 arr[0][0]。要访问 arr[i][j],首先要跳过前面 i 行,每行有 4 个元素(因为二维数组第二维的大小是 4),所以先移动 i * 4 个元素的位置,然后再移动 j 个元素位置。这里 i = 1j = 2,所以指针移动的总偏移量为 1 * 4 + 2,然后通过 * 解引用操作符获取该位置的值。
  2. 遍历整个二维数组:
#include <stdio.h>

int main() {
    int arr[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
    int *ptr = &arr[0][0];
    for (int i = 0; i < 3 * 4; i++) {
        printf("%d ", *(ptr + i));
        if ((i + 1) % 4 == 0) {
            printf("\n");
        }
    }
    return 0;
}

在代码中,通过 for 循环,从 i = 0i < 3 * 4(因为二维数组总共有 3 * 4 = 12 个元素),每次循环指针 ptr 移动一个元素位置(ptr + i),并通过 * 解引用操作符获取并打印该位置的值。当 (i + 1) % 4 == 0 时,说明一行已经遍历完,打印换行符。