【问题标题】:pointer to an int array gives the same address as when it is dereferenced指向 int 数组的指针给出的地址与取消引用时的地址相同
【发布时间】:2013-11-06 08:45:20
【问题描述】:

我有以下代码:

#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是一样的值。

我不知道这是怎么发生的。

【问题讨论】:

  • *j 是数组本身。

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


【解决方案1】:

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

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

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

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

所以使用*j 就等同于直接使用g,就像*(*j) 等同于*g
&amp;(*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

【讨论】:

    【解决方案2】:

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

    没错。

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

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

    效果和你写cout &lt;&lt; g一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-11
      • 1970-01-01
      相关资源
      最近更新 更多