MST

星途 面试题库

面试题:C语言二维数组初始化对内存布局及指针操作的影响

给定一个二维数组`int arr[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} };`,分析其内存布局。同时,编写代码通过指针操作遍历该二维数组,输出所有元素,解释在这种初始化方式下指针操作的原理和注意事项。
18.1万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

内存布局分析

在C语言中,二维数组int arr[3][4]在内存中是按行连续存储的。即先存储第一行的所有元素,接着存储第二行,然后是第三行。内存布局如下:

IndexMemory LocationValue
0arr[0][0]1
1arr[0][1]2
2arr[0][2]3
3arr[0][3]4
4arr[1][0]5
5arr[1][1]6
6arr[1][2]7
7arr[1][3]8
8arr[2][0]9
9arr[2][1]10
10arr[2][2]11
11arr[2][3]12

代码实现

#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));
    }
    printf("\n");

    return 0;
}

指针操作原理和注意事项

  1. 原理

    • 由于二维数组在内存中按行连续存储,我们可以将其视为一个一维数组。int *ptr = &arr[0][0];这行代码将ptr指向二维数组的第一个元素。
    • 通过*(ptr + i)的方式,我们可以访问数组中的每个元素,i从0到3 * 4 - 1,这样就可以遍历整个二维数组。
  2. 注意事项

    • 越界访问:在使用指针遍历数组时,必须确保不会越界访问。例如,在上述代码中,如果i超过了3 * 4 - 1,就会访问到数组之外的内存,这可能导致未定义行为。
    • 指针类型:指针的类型必须与数组元素的类型一致。这里数组元素是int类型,所以指针也定义为int *。如果指针类型错误,可能导致不正确的内存访问和数据解析错误。