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

4

我有以下的代码:

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是一个指向整数的二维数组的指针,它指向一个虚构的地址400。因此,如果我解引用一次,我得到一个指向大小为2的一维数组的指针,仍然指向地址400。
我的第一个问题是:使用“常规”指针时,解引用会给出存储在所指地址上的值。对于多维数组来说不是这样吗?因为存储在地址400上的值显然是1,而不是400(至少从A和*A看,我认为可以这样假设)。
第二个问题是关于代码块中的最后一个cout。如果我输入A[0][1],我会得到一个“指向整数类型的指针”,对吧?那么再次解引用将给我虚构地址408处的值3。如果我像之前那样引用这个指向整数的指针会怎么样呢?我知道它只会给出它所指向的(第二个)一维数组的第一个值的地址(即408),但我该如何解释这个呢?在内存位置408上,显然存储着一个整数(即3)。但是,仅仅看表达式&A[0][1]给出地址408,人们可能会认为位置408存储了一个指向整数类型的指针。
我知道这些问题可能有点混乱甚至不太具体,但也许有人能帮助我理解。
谢谢! :-)

1
可能是重复的问题:数组是指针吗? / 数组名是指针吗? / 二维数组是双指针吗? - Brian61354270
2
这个回答解决了你的问题吗?什么是数组指针衰变? - Nelfeal
3
为什么有关于需要详细信息或清晰度的关闭投票?这是一个陈述得很清楚的问题。虽然提问者有错误的假设,但这并不意味着这个问题是离题的。 - Brian61354270
3
数组并不是指针,但在某些情况下可以转化为指向第一个元素的指针。但这并不意味着指针和数组是同一样东西。顺便说一句,在C++中,你应该优先使用std::array或者std::vector而不是C风格的数组。 - Jesper Juhl
显示剩余5条评论
1个回答

2
A是一个指向二维整数数组的指针。
错误。A是一个三维数组,它不是一个指针。
所以,如果我解引用一次,我得到一个指向大小为2的一维数组的指针,仍然指向地址400。
当你通过A间接引用时,首先它会隐式转换为指向第一个元素的指针,即指向一个二维数组的指针。通过转换后的指向二维数组的指针进行间接引用的结果是一个二维数组。实际上,第一个子数组的地址与外部数组的地址相同。
我的第一个问题是:使用“常规”指针工作时,解引用会给出存储在指向的地址中的值。对于多维数组来说,情况并非如此,对吗?
一个数组(无论是多维还是单维)转换成的指针,行为就像同类型的任何其他指针一样。
因为地址400处存储的值显然是1。
取决于类型。虚构地址处的类型为A[2][2][2]的值是一个多维数组。它不是整数,所以它的值不能为1。虚构地址处的类型为int的值将为1。
如果我键入A[0][1],得到的是"指向整数类型的指针",对吗?
不完全正确。A[0][1]是一个数组。但它确实可以隐式转换为指向整数的指针。
如果我像我之前那样引用这个指向整数的指针会怎么样?
你没有这样做,因为A[0][1]不是指向整数的指针。如果你取地址&A[0][1],你会得到一个指向包含2个整数的数组的指针,即int (*)[2]

抱歉,但你在一个观点上是错误的。对数组指针进行解引用会得到数组元素的类型,所以确实可以得到1的int类型。 - Mark Ransom
非常感谢!现在情况清楚多了。所以我的理解是,在一个地址中可以存储多个值,对吗?那么在我的情况下,在地址400处有一个类型为A[2][2][2]的值,一个类型为A[2][2]的值,一个类型为A[2]的值,还有一个int类型的值,是这样吗? - AZYZ
@AZYZ 你可以有多个对象共享相同的地址,而不是多个值。类似的情况也发生在联合体和空基类中。虽然我不确定标准在每种情况下有多精确。 - Nelfeal
在我的情况下,如果我打印*A:那么A首先被转换为一个指向二维数组的指针,然后到底打印了什么?据我所理解,解引用一个指针会显示该地址上的值。根据这个理论,在这种情况下应该打印一个二维数组。打印结果将把该二维数组转换为指向一维数组的指针,从而得到它指向的虚构地址(400)。这样说对吗?因此,由*A产生的二维数组与整数值3共享相同的地址吗? - AZYZ
1
@MarkRansom 解引用指向数组的指针会得到数组元素的类型 这并不与我的回答相矛盾。所以确实你会得到1的int类型。 这取决于数组的类型。 - eerorika

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接