0

当我运行以下程序时:

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

为什么价值观相同?它不应该不同吗?

4

2 回答 2

3

从技术上讲,他们可以,但他们不需要 - C 标准没有说明指针的确切数值。顺便说一句,我发现它们相同是很合乎逻辑的-数组不是指针,因此a可以衰减为指向其第一个元素的指针,并且&a是指向的指针a,这显然与指向其的指针相同第一个元素:

+------------------+------------------+- - - -
| 1st element of a | 2nd element of a |
+------------------+------------------+- - - -
^ pointer to first element
^ pointer to a (as well)
于 2013-07-23T15:58:25.737 回答
0

在您的代码中,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

在线演示。:-)

于 2013-07-23T15:57:53.390 回答