当我运行以下程序时:
int a[3][4];
int k = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++)
a[i][j] = k++;
}
cout<<"a: "<<a<<endl;
cout<<"&a: "<<&a<<endl;
产生的输出是这样的:
a: 002FFB4C &a: 002FFB4C
为什么价值观相同?它不应该不同吗?
从技术上讲,他们可以,但他们不需要 - C 标准没有说明指针的确切数值。顺便说一句,我发现它们相同是很合乎逻辑的-数组不是指针,因此a
可以衰减为指向其第一个元素的指针,并且&a
是指向的指针a
,这显然与指向其的指针相同第一个元素:
+------------------+------------------+- - - -
| 1st element of a | 2nd element of a |
+------------------+------------------+- - - -
^ pointer to first element
^ pointer to a (as well)
在您的代码中,a
是数组数组的第一个元素的地址,即a[0]
. 它的地址与它a
自己的地址一致。不仅与a[0]
,&a[0]
和相同&a[0][0]
。
这是一个有趣的实验:
#include <cstdio>
#define print(a) std::printf("%10s: %p\n", #a, a);
int main()
{
int a[3][4];
print(&a);
print(a);
print(a[0]);
print(&a[0]);
print(&a[0][0]);
}
输出:
&a: 0xbfafca80
a: 0xbfafca80
a[0]: 0xbfafca80
&a[0]: 0xbfafca80
&a[0][0]: 0xbfafca80
在线演示。:-)