2

我有以下代码:

#include <iostream>
using namespace std;
int main()
{
    int g[] = {9,8};
    int (*j)[2] = &g;
    cout << "*(j):" << *(j) << endl;
    cout << "j:" << j << endl;
    cout << "&j:" << &j << endl;
    cout << "&(*j)" << &(*j) << endl;
    cout << "*(*j):" << *(*j) << endl;
    return 0;
}

输出:

*(j):0x7fff5ab37c7c
j:0x7fff5ab37c7c
&j:0x7fff5ab37c70
&(*j)0x7fff5ab37c7c
*(*j):9

我认为 j 是一个指向两个整数数组的指针。

&g 是整个数组的地址。

然后 j 存储整个数组的地址。

所以我使用 *(j),它将取消引用数组中的第一个元素。

但是结果表明 *(j) 存储的数组地址与 j 相同。

我无法弄清楚这是怎么发生的。

4

2 回答 2

3

我认为 j 是一个指向两个整数数组的指针。
&g 是整个数组的地址。

那是对的。

所以我使用 *(j),它将取消引用数组中的第一个元素。

这不是。*j给你数组本身。当您将其插入 时cout,它会再次衰减为指针(这次是指向其第一个元素 type 的指针int*)并打印其值。

它实际上和你写的一样cout << g

于 2013-10-27T16:14:10.360 回答
2

“我认为这j是一个指向数组的指针”

是的,它是。这也是为什么*j输出与输出相同的地址g。在这种情况下,数组衰减到指针中,这就是为什么即使输出也会j产生相同的结果。

输出相同地址的事实可能会让您认为j并且*j是相同的指针,但它们不是。它们的类型不同(实际上很重要的事实):

int g[] = {9,8};     // int[]
int (*j)[2] = &g;    // int (*)[2]

所以 using*j变成等价于g直接使用,就像*(*j)变成等价于*g.
And&(*j)只不过是,它是用一个数组的地址j初始化的(取自衰减的地址,即这个数组的第一个元素的地址)。g

那么为什么j*j输出相同的地址并*(*j)输出第一个元素的值呢?

因为存在的j类型int (*)[2]。一个简单的例子:

int g[] = {9,8};
int (*j)[2] = &g;     // j points to the first element as well
cout << *((int*) j);

输出9

于 2013-10-27T16:15:45.433 回答