【问题标题】:Address of an array数组的地址
【发布时间】:2012-01-14 19:25:47
【问题描述】:
int t[10];

int * u = t;

cout << t << " " << &t << endl;

cout << u << " " << &u << endl;

输出:

0045FB88 0045FB88
0045FB88 0045FB7C

u 的输出有意义。

我知道t&amp;t[0] 应该有相同的值,但是&amp;t 怎么也一样呢? &t 究竟是什么意思?

【问题讨论】:

  • ¤ 转换为指针的t&amp;t 之间的唯一区别是指针类型。后者的所指对象在形式上是数组类型,因此向它添加 1 会移动它很多(到内存中的下一个这样的数组)。而前者的所指对象是元素类型。术语:在 [comp.lang.c++] Usenet 组中,关于是否可以说像您的 u 这样的指针“指向”数组存在一些争议,因为它的所指对象不是数组类型。通过指出标准对此类措辞的使用,无数次解决了这一问题。干杯&hth.,
  • &u 是对整型指针的引用,你通常使用它作为一些函数的参数。

标签: c++ arrays pointers memory-address


【解决方案1】:

t 在表达式中单独使用时,会发生数组到指针的转换,这会生成指向数组第一个元素的指针。

t 用作&amp; 运算符的参数时,不会发生这种转换。然后&amp; 显式获取t(数组)的地址。 &amp;t 是指向整个数组的指针。

数组的第一个元素在内存中的位置与整个数组的开头相同,因此这两个指针具有相同的值。

【讨论】:

  • 谢谢!我想是隐式数组到指针的转换让我误以为u 是一个指针。
  • @quuxbazer: u 一个指针。 t 一个数组。 int * u = t 将数组到指针的转换应用到 t,并使用结果初始化 u
  • @JohannesSchaub-litb:在这种情况下,我会对正确的描述感兴趣。
  • (e ? a : n) 不会产生指针,例如,如果双方具有相同的数组类型。
  • @JohannesSchaub-litb:我不明白这如何使这个答案无效。当然,在某些情况下不会发生数组到指针的转换。但是,在这种情况下,它们正在发生。
【解决方案2】:

t的实际类型是int[10],所以&amp;t是数组的地址。

另外,int[] 隐式转换为int*,因此t 转换为数组第一个元素的地址。

【讨论】:

    【解决方案3】:

    没有名为t 的变量,因为您无法更改它。名称t 只是指第一个元素的地址(并且还具有与之相关的大小)。因此,获取地址的地址并没有什么意义,C 将它“折叠”成只是地址。

    同样的事情发生在函数的情况下:

    int foo(void)
    {
      return 12;
    }
    
    printf("%p and %p\n", (void *) foo, (void *) &foo);
    

    这应该打印同样的东西,因为没有变量保存foo的地址,而它的地址又可以被取走。

    【讨论】:

    • 它是C++,有一个变量叫t。您可以将其传递给接受 int(&amp;)[10] 类型参数的函数。
    • -1 "没有变量 t,因为你不能改变它。"是不正确的。在声明中命名的对象称为变量。去看看标准。
    猜你喜欢
    • 1970-01-01
    • 2015-09-29
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    相关资源
    最近更新 更多