它如何使用指向数组的指针计算数组的大小?
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]))
所以在这种情况下不需要括号。有些人会建议您始终使用括号,这不是一个坏建议;最终您会了解何时不需要它们并且可以放心地将它们排除在外。
我有以下代码,它有指向二维数组的指针变量指针。
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]))
所以在这种情况下不需要括号。有些人会建议您始终使用括号,这不是一个坏建议;最终您会了解何时不需要它们并且可以放心地将它们排除在外。