C 当数组变量被视为指针时,以及当它被视为简单数组时?

C 当数组变量被视为指针时,以及当它被视为简单数组时?,c,arrays,pointers,C,Arrays,Pointers,在C中,当数组变量被视为指针时,当它被视为简单数组时?例如,sizeof(array_variable)运算符有时返回地址大小,有时返回数组大小。始终将其视为指针。 当使用不带索引的数组名时,它将给出数组的基址。将数组名与索引一起使用时,它将被视为*(数组名+索引)。它给出了基址中的第个indexe元素*数组表示第一个元素 始终将其视为指针。 当使用不带索引的数组名时,它将给出数组的基址。将数组名与索引一起使用时,它将被视为*(数组名+索引)。它给出了基址中的第个indexe元素*数组表示第一个

在C中,当数组变量被视为指针时,当它被视为简单数组时?例如,sizeof(array_variable)运算符有时返回地址大小,有时返回数组大小。

始终将其视为指针。
当使用不带索引的数组名时,它将给出数组的基址。将数组名与索引一起使用时,它将被视为*(数组名+索引)。它给出了基址中的第个indexe元素*数组表示第一个元素

始终将其视为指针。
当使用不带索引的数组名时,它将给出数组的基址。将数组名与索引一起使用时,它将被视为*(数组名+索引)。它给出了基址中的第个indexe元素*数组表示第一个元素

数组变量的名称始终是指针。如果应用于数组变量,则返回数组的大小是
sizeof()
的特殊化。

数组变量的名称始终是指针。
sizeof()
的特殊化是,如果应用于数组变量,它将返回数组的大小。

在函数参数中,数组(
[]
)或
[…]
)相当于指针(
*
)。因此
sizeof(myarg)==sizeof(void*)
对于
void f(char*myarg)是正确的
void f(char myarg[])
void f(char myarg[42])

在全局变量和局部变量中,数组不同于指针
sizeof(…)
反映了这种差异


数组总是可以自动转换为指针(但不是相反),并且使用第一个元素的地址,即
ary
转换为
&ary[0]

在函数参数中,数组(
[]
)或
[…]
)相当于指针(
*
)。因此
sizeof(myarg)==sizeof(void*)
对于
void f(char*myarg)是正确的
void f(char myarg[])
void f(char myarg[42])

在全局变量和局部变量中,数组不同于指针
sizeof(…)
反映了这种差异

数组始终可以自动转换为指针(但不能反过来),并使用第一个元素的地址,即
ary
转换为
&ary[0]
C 2011(N1570)6.3.2.1 3:

除非它是sizeof运算符、\u Alignof运算符、一元&运算符的操作数,或者是用于初始化数组的字符串文字,类型为“类型的数组”的表达式转换为类型为“指向类型的指针”的表达式,该表达式指向数组对象的初始元素,并且不是左值。如果数组对象具有寄存器存储类,则行为未定义

C 2011(N1570)6.7.6.3 7:

将参数声明为“类型数组”应调整为“类型限定指针”,其中类型限定符(如有)是数组类型派生的[]中指定的类型限定符

C 2011(N1570)6.3.2.1 3:

除非它是sizeof运算符、\u Alignof运算符、一元&运算符的操作数,或者是用于初始化数组的字符串文字,类型为“类型的数组”的表达式转换为类型为“指向类型的指针”的表达式,该表达式指向数组对象的初始元素,并且不是左值。如果数组对象具有寄存器存储类,则行为未定义

C 2011(N1570)6.7.6.3 7:

将参数声明为“类型数组”应调整为“类型限定指针”,其中类型限定符(如有)是数组类型派生的[]中指定的类型限定符


此问题中的正确答案搜索可变长度编码器或马基罗答案,以及AndreyT评论。此问题中的正确答案搜索可变长度编码器或马基罗答案,和AndreyT comment.+1用于说明函数参数中使用的数组语法的特殊情况。C标准不保证指向不同类型的指针的大小相同。+1用于说明函数参数中使用的数组语法的特殊情况。C标准不保证指向不同类型的指针的大小相同不同的类型是相同的。C没有专门化
sizeof
是一个运算符,而不是函数。当应用到数组表达式时,它生成数组的大小,而不仅仅是数组变量。C没有专门化
sizeof
是一个运算符,而不是函数。当应用于数组表达式时,它生成数组的大小,而不仅仅是数组变量。