C++中指针和数组的地址和值

问题描述 投票:0回答:1

我有以下代码:

int main()
{
    int A[2][2][2] =
    {
    {{1, 2}, {3, 4}},
    {{4, 5}, {5, 6}}
    };
    cout << A << endl; // assume it's 400
    cout << *A << endl; // 400
    cout << **A << endl; // 400
    cout << ***A << endl; // 1

        cout << &A[0][1] << endl; // 408

}

所以数组显然与指针共享很多属性 - 如果我错了,请纠正我,但在这种情况下, A 是一个指向 2 维整数数组的指针,它指向虚构的地址 400。所以如果我取消引用一旦我得到一个指向大小为 2 的 1 维数组的指针,仍然指向地址 400。

我的第一个问题如下:使用“常规”指针,取消引用给出存储在指向的地址处的值。多维数组并非如此,对吗?因为存储在地址 400 处的值显然是 1,而不是 400(我认为至少可以以某种方式假设查看 A 和 *A)。

第二个问题是关于代码块中最后一个cout。如果我输入 A[0][1] 我会得到一个“指向整数类型的东西”,对吧?因此,再次取消引用将在虚构地址 408 处给我值 3。如果我像以前一样引用这个整数指针会怎么样?我知道它只是给出了它所指向的(第二个)1-dim 数组的第一个值的地址(所以 408),但是我如何解释它?在内存位置408中,显然存储了一个整数(即3)。但同样,仅查看给出地址 408 的表达式 &A[0][1],人们可能会认为位置 408 存储了一个指向整数类型的指针。

我知道这些问题可能有点令人困惑,甚至不具体,但也许有人有一些话可以帮助我解决这个问题。

谢谢! :-)

c++ arrays pointers memory
1个回答
0
投票

A 是指向 2 维整数数组的指针

错了。

A
是一个 3 维数组。它不是一个指针。

因此,如果我取消引用,一旦我得到一个指向大小为 2 的 1 维数组的指针,仍然指向地址 400。

当您间接通过

A
时,首先它会隐式转换为指向第一个元素的指针,即指向 2D 数组的指针。通过转换后的指针间接指向二维数组的结果是二维数组。事实上,第一个子数组的地址与外部数组的地址相同。

我的第一个问题如下:使用“常规”指针,取消引用给出存储在指向的地址处的值。多维数组不是这样的,对吧?

数组(无论是否为多维)转换为的指针,其行为就像任何其他相同类型的指针一样。

因为地址400处存储的值显然是1

取决于类型。存储在虚构地址处的类型

A[2][2][2]
的值是一个多维数组。它不是整数,因此它的值不能为 1。虚构地址处类型
int
的值将为 1。

如果我输入 A[0][1] 我会得到一个“指向整数类型的东西”,对吗?

不完全是。

A[0][1]
是一个数组。但它确实可以隐式转换为整数指针。

© www.soinside.com 2019 - 2024. All rights reserved.