【问题标题】:Sizeof Pointer to ArraySizeof 指向数组的指针
【发布时间】:2011-10-13 19:03:55
【问题描述】:

如果我有一个这样声明的数组:

int a[3][2];

那为什么是:

sizeof(a+0) == 8

而:

sizeof(a)   == 24

我不明白将 0 添加到指针如何更改 sizeof 输出。可能有一些隐式类型转换吗?

【问题讨论】:

    标签: c++ pointers


    【解决方案1】:

    如果将0 添加到a,则a 首先转换为int(*)[2] 类型的指针值(指向int[3][2] 类型的数组的第一个元素)。然后将0 添加到该指针值中,这会将0 * sizeof(int[2]) 字节添加到该指针值表示的地址。由于该乘法产生 0,因此它将产生相同的指针值。因为它是一个指针,sizeof(a+0) 产生一个指针的大小,在你的盒子上是 8 个字节。

    如果您使用sizeof(a),编译器就没有理由将a 转换为指针值(这仅在您想要索引元素或进行涉及元素地址的指针运算时才有意义)。所以表达式a 仍然是一个数组类型,你得到int[3][2] 的大小而不是int(*)[2] 的大小。所以,3 * 2 * sizeof(int) 在你的盒子上是 24 字节。

    希望这可以澄清事情。

    【讨论】:

    • 调用sizeof(a+0)sizeof(a[0])是一样的,都是取数组中第一个int[2]元素的大小,所以sizeof(int)*2 = 8。它没有占用指针的大小。
    • @Remy 如果您能制定该理论并将其作为论文发表,我将不胜感激
    • @RemyLebeau-TeamB: a[0] 等价于*(a+0),而不是(a+0)
    【解决方案2】:

    sizeof 告诉你表达式类型的大小。当您将0 添加到a 时,类型变为指针(在 64 位系统上为 8 个字节)。

    【讨论】:

      猜你喜欢
      • 2021-11-28
      相关资源
      最近更新 更多