【问题标题】:Multi dimensional array and pointer in c++C++中的多维数组和指针
【发布时间】:2021-12-02 13:53:46
【问题描述】:
    int a[2][2] = {{1, 2}, {3, 4}};
    cout << a << endl;
    cout << *a << endl;
    cout << &a[0][0] << endl;

这段代码的输出是:

     0x7fff3da96f40

     0x7fff3da96f40

     0x7fff3da96f40

但是,如果a 是0x7fff3da96f40,那么*a 应该是地址0x7fff3da96f40 中的值,即1。

但是,我们又得到了相同的地址。

为什么会这样?

【问题讨论】:

  • 尝试*a = 0,您会在错误消息中看到*a 是什么。这不是整数。
  • a 是 int (&amp;)[2][2],*a 是 int(&amp;)[2],a[0][0] 是 int&amp;。前两个衰减为指针。
  • 这是因为a 不是 0x7fff3da96f40 – a不是指针而是数组。您看到的值是它衰减为指向其第一个元素的指针,&amp;a[0](并且第一个元素也是一个数组,当您打印它时,它衰减为指向 its 第一个元素的指针)。
  • @Jarod42 请原谅我的吹毛求疵,但它们不是参考资料。表达式不能有引用类型。
  • 很多时候,当你想“如果 A 为真,那么 B 应该发生,为什么 B 不发生?”,那是因为 A 不为真。

标签: c++ arrays pointers multidimensional-array


【解决方案1】:

*a应该是地址0x7fff3da96f40中的值

是的。关键是值的类型,那个类型是int[2]。

cout 不能直接打印数组,但它可以打印指针,因此您的数组被隐式转换为指向其第一个元素的指针,并按原样打印。

数组的大多数用法都进行这种转换,包括将* 和[] 应用于数组。

【讨论】:

    【解决方案2】:

    如果你尝试

    int a[2][2] = {{1, 2}, {3, 4}};
    cout << a << endl;
    cout << *a << endl;
    cout << &a[0][0] << endl;
    cout << typeid(a).name() << endl;
    cout << typeid(*a).name() << endl;
    cout << typeid(&a[0][0]).name() << endl;
    

    可能的输出是

    0x7ffe4169bb50
    0x7ffe4169bb50
    0x7ffe4169bb50
    A2_A2_i
    A2_i
    Pi
    

    所以现在您可以看到您正在使用的变量是什么类型。它们是有些不同的实体,从相同的内存地址开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-15
      相关资源
      最近更新 更多