【C/C++】趣味题目:二维数组地址
趣味题目:二维数组地址
题目
如果程序代码(下面)输出地址是0x6ffe00,则cout << a + 1 << endl;
输出结果是
A 0x6ffe04
B 0x6ffe0C
C 0x6ffe08
D 0x6ffe00
#include <bits/stdc++.h>using namespace std;int main() {int a[2][3] = {0};cout << a << endl;return 0;
}
答案以及解析
正确答案:B
a 表示首行所在地址
&a 表示整个二维数组的地址
a[i] 表示第i行子数组的首个元素的地址
&a[I] 表示第i行子数组所在地址
&a[I][j] 表示第i行第j列元素地址
这个问题考查的是 C++ 中多维数组的内存布局和指针运算规则。
int a[2][3] = {0};
该语句定义了一个二维数组 a
,它包含:
- 2 行
- 每行 3 个
int
类型元素
所以总共有 2 × 3 = 6 个 int
元素,连续存储在内存中。
cout << a << endl;
在这里,a
是二维数组名,它的类型是 int[2][3]
,但在 cout
中它会退化为指针,具体来说,a
退化为指向第一行的指针,即 int (*)[3]
。
所以:
a == &a[0]
假设输出是:
0x6ffe00
那么这是 a
(即 &a[0]
)的地址。
cout << a + 1 << endl;
这里 a
是 int (*)[3]
,即指向 3 个 int
的数组指针。
所以 a + 1
表示跳过第一行,指向第二行 a[1]
。
也就是:
a + 1 == &a[1]
这个地址相对于 a
增加了 一行的大小,即 3 个 int
。
- 通常情况下,
int
占 4 字节(标准系统中) - 所以 3 个
int
就是:3 × 4 = 12 字节
原始地址:0x6ffe00
增加:12 字节 → 0x6ffe00 + 0xC = 0x6ffe0C
所以输出将是:
0x6ffe0C
地址为什么“递增”?
这是因为数组在内存中是按连续存储的,且地址是从低地址往高地址排布的(大多数平台上如此)。
比如:
int a[2][3] = {{a[0][0], a[0][1], a[0][2]},{a[1][0], a[1][1], a[1][2]}
}
内存排列顺序是(行主序):
&a[0][0], &a[0][1], &a[0][2], &a[1][0], &a[1][1], &a[1][2]
这也是为什么 a + 1
会跳过一整行(3 个 int
)而不是只跳 1。
可以通过如下方式验证:
#include <iostream>
using namespace std;int main() {int a[2][3] = {{1, 2, 3}, {4, 5, 6}};cout << "a : " << a << endl;cout << "a + 1 : " << a + 1 << endl;cout << "&a[1][0]: " << &a[1][0] << endl;return 0;
}
输出结果中你会看到:
a : 0xXXXX
a + 1 : 0xXXXX + 12
&a[1][0]: 同上