【问题标题】:Why is the result of using `int (*p)[5]` so confusing?为什么使用 `int (*p)[5]` 的结果如此混乱?
【发布时间】:2011-11-30 08:12:52
【问题描述】:

我知道int (*p)[5] 表示一个指向5 个整数数组的指针。 所以我在下面编写了这个程序:

#include <iostream>
using namespace std;

int main()
{
  int a[5]={0,1,2,3,4};
  int (*q)[5]=&a;
  cout<<a<<endl;         
  cout<<q<<endl;
  cout<<*q<<endl;        
  cout<<**q<<endl;
  return 0;
}

在我的机器上结果是:

0xbfad3608
0xbfad3608       //?__?
0xbfad3608
0

我可以理解*q表示a[0]的地址,**q表示a[0]的值,但为什么q的值与a*q的值相同?在我可怜的心目中,应该是他们的地址!我完全糊涂了。有人请帮助我。请!

【问题讨论】:

    标签: c++ pointers pointer-to-array


    【解决方案1】:

    这样看:

       q == &a
       *q == a
       **q == *a
    

    您没有尝试打印&amp;a。如果这样做,您会看到它与a 具有相同的值。由于&amp;a == aq == &amp;a*q == a,通过传递性q == *q

    如果您想知道为什么&amp;a == a,请查看Why is address of an array variable the same as itself?

    【讨论】:

    • 是不是意味着&amp;a==a==&amp;a[0]
    • @zyc,不,但它们都从同一个地址开始。
    • @zyc: 是也不是,这被称为decay,即在大多数情况下,一个数组会衰减为一个指针,而这个指针的值就是它的第一个元素的地址,这也恰好是数组本身的地址。
    【解决方案2】:

    q&amp;a 是指向数组的指针。

    *qa 是“数组”。但是你不能真正将数组传递给函数(std::ostream::operator&lt;&lt; 是一个函数);你真的传递了一个指向第一个元素的指针,它是隐式创建的(称为指针衰减)。所以*qa 成为指向数组第一个元素的指针。

    数组的开头与数组在内存中的位置相同,很简单。由于所涉及的指针都不是指向字符的指针(它们经过特殊处理,以便字符串文字按预期工作),所以地址只是被打印出来。

    【讨论】:

      【解决方案3】:

      那是因为array 会自动转换为pointer,它只是具有array 的地址值。因此,当您尝试使用&lt;&lt;a&lt;&lt;*q 打印array 时,实际上是在打印其地址。

      【讨论】:

      • 是的,但我只想打印它的地址。
      猜你喜欢
      • 2012-10-11
      • 2019-08-14
      • 1970-01-01
      • 2011-04-28
      • 2015-06-09
      • 1970-01-01
      • 2016-05-13
      • 1970-01-01
      • 2022-11-25
      相关资源
      最近更新 更多