C 当数组变量被视为指针时,以及当它被视为简单数组时?
在C中,当数组变量被视为指针时,当它被视为简单数组时?例如,sizeof(array_variable)运算符有时返回地址大小,有时返回数组大小。始终将其视为指针。C 当数组变量被视为指针时,以及当它被视为简单数组时?,c,arrays,pointers,C,Arrays,Pointers,在C中,当数组变量被视为指针时,当它被视为简单数组时?例如,sizeof(array_variable)运算符有时返回地址大小,有时返回数组大小。始终将其视为指针。 当使用不带索引的数组名时,它将给出数组的基址。将数组名与索引一起使用时,它将被视为*(数组名+索引)。它给出了基址中的第个indexe元素*数组表示第一个元素 始终将其视为指针。 当使用不带索引的数组名时,它将给出数组的基址。将数组名与索引一起使用时,它将被视为*(数组名+索引)。它给出了基址中的第个indexe元素*数组表示第一个
当使用不带索引的数组名时,它将给出数组的基址。将数组名与索引一起使用时,它将被视为*(数组名+索引)。它给出了基址中的第个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
是一个运算符,而不是函数。当应用于数组表达式时,它生成数组的大小,而不仅仅是数组变量。