面试题答案
一键面试内存布局分析
在C语言中,二维数组int arr[3][4]
在内存中是按行连续存储的。即先存储第一行的所有元素,接着存储第二行,然后是第三行。内存布局如下:
Index | Memory Location | Value |
---|---|---|
0 | arr[0][0] | 1 |
1 | arr[0][1] | 2 |
2 | arr[0][2] | 3 |
3 | arr[0][3] | 4 |
4 | arr[1][0] | 5 |
5 | arr[1][1] | 6 |
6 | arr[1][2] | 7 |
7 | arr[1][3] | 8 |
8 | arr[2][0] | 9 |
9 | arr[2][1] | 10 |
10 | arr[2][2] | 11 |
11 | arr[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;
}
指针操作原理和注意事项
-
原理:
- 由于二维数组在内存中按行连续存储,我们可以将其视为一个一维数组。
int *ptr = &arr[0][0];
这行代码将ptr
指向二维数组的第一个元素。 - 通过
*(ptr + i)
的方式,我们可以访问数组中的每个元素,i
从0到3 * 4 - 1
,这样就可以遍历整个二维数组。
- 由于二维数组在内存中按行连续存储,我们可以将其视为一个一维数组。
-
注意事项:
- 越界访问:在使用指针遍历数组时,必须确保不会越界访问。例如,在上述代码中,如果
i
超过了3 * 4 - 1
,就会访问到数组之外的内存,这可能导致未定义行为。 - 指针类型:指针的类型必须与数组元素的类型一致。这里数组元素是
int
类型,所以指针也定义为int *
。如果指针类型错误,可能导致不正确的内存访问和数据解析错误。
- 越界访问:在使用指针遍历数组时,必须确保不会越界访问。例如,在上述代码中,如果