MST

星途 面试题库

面试题:C语言指针变量值与类型:数组指针的运用

假设有一个二维数组`int arr[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};`,请使用数组指针遍历该二维数组,并打印出每个元素的值,同时解释在这个过程中数组指针的类型和值是如何变化的。
28.7万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>

int main() {
    int arr[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
    int (*ptr)[4] = arr; // 数组指针,指向包含4个int的数组

    for (int i = 0; i < 3; ++i) {
        for (int j = 0; j < 4; ++j) {
            std::cout << *(*(ptr + i) + j) << " "; // 打印元素
        }
        std::cout << std::endl;
    }

    return 0;
}

数组指针类型和值的变化解释

  1. 数组指针类型int (*ptr)[4],这里ptr是一个指针,它指向的是一个包含4个int类型元素的数组。这是因为二维数组在内存中是以行优先的方式存储的,每一行可以看作是一个一维数组。

  2. 数组指针值的变化

    • 初始时,ptr指向arr的首地址,也就是第一行数组{1, 2, 3, 4}的首地址。
    • 当执行ptr + i时,由于ptr是指向包含4个int元素的数组的指针,ptr + i会使指针移动iint[4]数组的大小,即i * sizeof(int[4])字节,从而指向第i行的数组。
    • 再执行*(ptr + i),这就获取到了第i行数组的首地址,此时它等价于一个普通的一维数组指针。
    • 接着*(ptr + i) + j会使指针在第i行数组内移动jint元素的大小,即j * sizeof(int)字节,指向第i行第j列的元素。
    • 最后*(*(ptr + i) + j)通过解引用获取到该位置的元素值并打印。