【问题标题】:A short C++ program about the pointer关于指针的简短 C++ 程序
【发布时间】:2016-09-29 10:59:56
【问题描述】:
#include <iostream>
using namespace std;
    int main()
    {

        int x[][3]={1,2,3,4,5};
        cout<<&x   <<" "<<*x   <<" "<<x   <<endl;
        cout<<&x[0]<<" "<<*x[0]<<" "<<x[0]<<endl;
        cout<<&x[0][0]<<endl;
        return 0;
    }

结果是:

0x28fef8 0x28fef8 0x28fef8
0x28fef8 1        0x28fef8
0x28fef8

为什么x[0][0] 和 x 在同一个指针中? 0x28fef8 中到底是什么? 1 还是 0x28fef8?

【问题讨论】:

    标签: c++ pointers


    【解决方案1】:

    像你这样的数组在内存中看起来像这样

    +---------+---------+---------+---------+--------- +----------+ | x[0][0] | x[0][1] | x[0][2] | x[1][0] | x[1][1] | x[1][2] | +---------+---------+---------+---------+--------- +----------+

    xx[0]x[0][0]的位置都是一样的。

    此外,数组自然会衰减为指向其第一个元素的指针。如果你使用普通的x,你会得到&amp;x[0]。如果你使用x[0],你会得到&amp;x[0][0]。因此,当您执行*x[0] 时,它与执行*&amp;x[0][0] 相同,并且取消引用和地址运算符相互抵消,因此您留下x[0][0],这是您打印的值。

    此外,为了帮助您理解为什么x&amp;x[0] 相同,您需要知道对于任何数组或指针 x 和索引i 表达式@987654335 @ 与 *(x + i) 相同。这意味着表达式&amp;x[i]&amp;*(x + i) 相同,并且由于地址和取消引用运算符再次相互抵消,&amp;x[i](x + i) 相同(或没有括号x + i)。现在考虑i 为零的情况,那么我们有&amp;x[0]x + 0 相同,与x 相同。所以&amp;x[0]x 相同,反之亦然。


    对于其他想知道 &amp;x&amp;x[0]&amp;x[0][0] 代表什么的人,请参阅:

    +---------+---------+---------+---------+--------- +----------+ | x[0][0] | x[0][1] | x[0][2] | x[1][0] | x[1][1] | x[1][2] | +---------+---------+---------+---------+--------- +----------+ ^ ^ ^ ^ | | | | +- &x +- &x[0][1] +- &x+1 +- &x[1][1] | | +- &x[0] +- &x[1] | | +- &x[0][0] +- &x[1][0]

    虽然所有xx[0]&amp;x&amp;x[0]&amp;x[0][0] 可能代表相同的内存地址,但它们在语义上是不同的,即它们代表不同的类型:

    • x 是一个指向三个char(或char (*)[3])数组的指针
    • x[0] 是指向char(或char *)的指针
    • &amp;x 是一个指向三个char(或char (*)[3][3])的数组的指针
    • &amp;x[0] 是指向三个char(或char (*)[3])的数组的指针
    • &amp;x[0][0] 是指向char(或char *)的指针

    【讨论】:

    • @molbdnilo 我不是说*x[0] 衰减,而是说x[0](注意缺少取消引用运算符)衰减。
    • 哦,现在我明白你的意思了......(今天有点厚)。我只是从不认为*array 是“衰减到指针,然后取消引用”,而是“完全等同于array[0],但语法不同”。
    • 非常感谢。我想我明白了。但是地址 0x28fef8 中到底是什么? 1 或 0x28fef8,你会看到 &x=x=0x28fef8=&x[0][0]。
    • @Ken 编译器放置数组的位置无关紧要。在您的具体情况下,它恰好位于地址0x28fef8。实际地址并不重要。是的,&amp;x&amp;x[0]&amp;x[0][0] 是同一个地址,xx[0] 也是同一个地址。不同的表达方式表示不同的东西,即使它们的值相同。
    • 吹毛求疵。 &amp;x+1&amp;x[1] 的地址不同。 &amp;x+1 的数值是 sizeof(x)&amp;x 的偏移量。它指向数组末尾之后的内存块。
    【解决方案2】:

    当数组名满足sizeof()时返回数组大小,当数组名满足&时返回指向数组的指针,而不是数组名的地址。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-08
      • 1970-01-01
      • 2014-05-13
      • 2017-05-13
      • 2013-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多