他们通常这样做:
sizeof <name_array> / sizeof <name_array>[0]
但毕竟,<name_array>
- 第一个元素 ( <name_array> == &<name_array>[0]
) 上的指针。那为什么它sizeof <name_array>
返回正确的数组大小。它的大小不存储在任何地方。
他们通常这样做:
sizeof <name_array> / sizeof <name_array>[0]
但毕竟,<name_array>
- 第一个元素 ( <name_array> == &<name_array>[0]
) 上的指针。那为什么它sizeof <name_array>
返回正确的数组大小。它的大小不存储在任何地方。
如果
name_array
完全声明为array,则该对象name_array
不是指向第一个元素的指针。name_array
只是一个数组。但是,数组值可以隐式转换为指向其第一个元素的指针。在 C 语言中,数组本身确实在除四个上下文之外的所有上下文中隐式转换为指向其第一个元素的指针。sizeof
&
_Alignof
您的情况只是数组仍然是数组的情况之一。因此,它
sizeof
返回数组的大小,而不是指针的大小。您关于“无处存储其大小”的评论并不完全清楚。“经典”
sizeof
是编译时表达式(常量)。当然,编译器在编译时就知道任何类型的大小。sizeof
应用于 VLA 的是在运行时计算的,但 VLA 的大小实际上是在运行时存储的。指针和数组不是一回事。举个例子:
结论:
我还没有找到权威的来源,但看起来数组名和指针是同义词并且工作相同,除了以下情况:
操作员
sizeof
- 见上文。使用字符串文字初始化:
可以分配或修改指针,但不能分配或修改数组(数组不是左值):