【问题标题】:How it calculate size of array using pointer to array?它如何使用指向数组的指针计算数组的大小?
【发布时间】:2021-11-09 23:16:59
【问题描述】:

我有以下代码,它具有指向二维数组的指针变量指针。

int main()
{
    int (*ptr)[2][3];
    printf("%u\n", sizeof(ptr)); // ---> give size of pointer = 8
    printf("%u\n", sizeof(*ptr)); // ---> give size of array = 24, how it works adding * to ptr gives array size

    return 0;
}

【问题讨论】:

  • sizeof(*ptr) 为您提供ptr 指向的大小,这是一个 2×3 整数数组。所以它应该和int a[2][3]; sizeof(a)一样,看起来就是这样。
  • 您是指大小(24 字节)还是形状(2×3)?

标签: c pointers multidimensional-array sizeof dereference


【解决方案1】:

表达式 ptr 的类型为int (*)[2][3](指向int 的3 元素数组的2 元素数组的指针) - 它是一个指针 类型,因此无论您的系统上的指针类型多么大(在本例中为 8 个字节)。

表达式*ptr 的类型为int [2][3] - 它是int 的2x3 数组,这意味着它足够存储6 个int 对象。 int 在您的系统上是 4 个字节宽,总大小为 24 个字节。

如果sizeof 的操作数是一个表达式而不是一个类型名,它会按照表达式的type。例如,表达式1 的类型为int,表达式2 的类型为int,表达式1 + 2 的类型为int,所以

sizeof 1 == sizeof 2 == sizeof (1 + 2) == sizeof (int)

请记住,sizeof 是一个 运算符,而不是函数 - 如果操作数是类型名称(如 (int))或操作数是包含较低优先级的运算符。例如

sizeof 1 + 2

将被解析为

(sizeof 1) + 2

因为算术 + 运算符的优先级低于一元 sizeof 运算符,这可能不是您想要的。然而,像

这样的表达
 sizeof *foo[N]

将被解析为

 sizeof (*(foo[N]))

所以在这种情况下不需要括号。有些人会建议您无论如何都要使用括号,这不是一个坏建议;最终,您将了解何时不需要它们,并且可以放心地将它们排除在外。

【讨论】:

    【解决方案2】:

    sizeof(ptr) 给出了指针本身的大小,即系统中的8

    sizeof(*ptr) 为您提供指针ptr 引用的对象的大小。由于ptr 是指向6 整数(3x2)的二维数组的指针,因此该数组的大小为24 字节,假设sizeof(int) == 4

    【讨论】:

      【解决方案3】:

      您必须将转换说明符 %zu 与运算符 sizeof 返回的类型为 size_t 的值一起使用。

      printf("%zu\n", sizeof(ptr)); 
             ^^^^^
      

      如果你有类似的指针

      T *p;
      

      其中T 是某种类型,那么表达式*p 的类型为T。所以sizeof( *p ) 等价于sizeof( T )

      此声明

      int (*ptr)[2][3];
      

      声明一个指向数组类型int[2][3]的指针;您可以通过以下方式使用 typedef 重写声明

      typedef int T[2][3];
      T *ptr;
      

      所以表达式sizeof( *ptr )等价于表达式sizeof( int[2][3] )

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-22
        • 2017-11-06
        相关资源
        最近更新 更多