首页 > 解决方案 > 传递数组名称时 sizeof 如何工作

问题描述

为什么 sizeof(array_name) 是数组的大小,而 sizeof(&a[0]) 是指针的大小,即使将数组名传递给函数时,传递的是数组开头的位置。

标签: cpointerssizeof

解决方案


在大多数表达式中,当使用数组时,它会自动转换为指向其第一个元素的指针。

有一个特殊规则sizeof:当数组是 的操作数时sizeof,它不会自动转换为指针。因此,sizeof array_name给出数组的大小,而不是指针的大小。

此规则也适用于一元运算&符:&array_name是数组的地址,而不是指针的地址。

此外,如果数组是用于初始化数组的字符串文字,则它不会转换为指针。字符串文字用于初始化数组。

对此的规则是 C 2018 6.3.2.1 3:

除非它是sizeof运算符的操作数,或一元&运算符,或者是用于初始化数组的字符串字面量,否则类型为“array of type ”的表达式将转换为类型为“pointer to type ”的表达式指向数组对象的初始元素并且不是左值。如果数组对象具有寄存器存储类,则行为未定义。


推荐阅读