指向int数组的指针提供与解除引用时相同的地址

时间:2013-10-27 16:09:51

标签: c++ arrays pointers memory-address dereference

我有以下代码:

#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是指向两个整数数组的指针。

&amp; g是整个数组的地址。

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

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

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

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

2 个答案:

答案 0 :(得分:3)

  

我认为j是指向两个整数数组的指针   并且&amp; g是整个数组的地址。

这是正确的。

  

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

事实并非如此。 *j为您提供数组本身。当您将其插入cout时,它会再次衰减到指针(此时指向指向其第一个元素的指针,键入int*)并打印其值。

实际上就像你写cout << g一样。

答案 1 :(得分:1)

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

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

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

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

所以使用*j等同于直接使用g,就像*(*j)相当于*g。 并且&(*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