面试题答案
一键面试#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;
}
数组指针类型和值的变化解释
-
数组指针类型:
int (*ptr)[4]
,这里ptr
是一个指针,它指向的是一个包含4个int
类型元素的数组。这是因为二维数组在内存中是以行优先的方式存储的,每一行可以看作是一个一维数组。 -
数组指针值的变化:
- 初始时,
ptr
指向arr
的首地址,也就是第一行数组{1, 2, 3, 4}
的首地址。 - 当执行
ptr + i
时,由于ptr
是指向包含4个int
元素的数组的指针,ptr + i
会使指针移动i
个int[4]
数组的大小,即i * sizeof(int[4])
字节,从而指向第i
行的数组。 - 再执行
*(ptr + i)
,这就获取到了第i
行数组的首地址,此时它等价于一个普通的一维数组指针。 - 接着
*(ptr + i) + j
会使指针在第i
行数组内移动j
个int
元素的大小,即j * sizeof(int)
字节,指向第i
行第j
列的元素。 - 最后
*(*(ptr + i) + j)
通过解引用获取到该位置的元素值并打印。
- 初始时,