它如何使用指向数组的指针计算数组的大小?

How it calculate size of array using pointer to array?

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

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;
}

您必须将转换说明符 %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] ).

sizeof(ptr) 给出指针本身的大小,在你的系统中是 8

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

表达式 ptr 的类型为 int (*)[2][3](指向 int 的 3 元素数组的 2 元素数组的指针)- 它是一个 pointer 类型,所以无论你的系统上有多大的指针类型(在本例中为 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]))

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