一个数组不能定义为c [0],它至少必须像c [1] 为什么以下代码正确?他在那做什么? 谢谢你的解释。
编辑:抱歉,伙计们,我在VS2012中编写C ++代码
int foo(double c[], int n)
{
if (n==1) {
c[0] = 0; //why is this possible?
} else {
.
.
.
}
答案 0 :(得分:6)
double c[]
,在论证位置,是double *c
的语法糖;它实际上是一个指针。同样,c[0]
是*c
的糖。
c[0] = 0;
不是数组声明。它是c
指向的数组的第一个元素的赋值。
答案 1 :(得分:2)
在变量声明中c[0]
表示“c是大小为0的数组”。因为大小为0的数组在C或C ++中不存在(并且没有意义),就像你指出的那样,非法。
表达式c[0]
表示“获取c的索引0处的元素”。由于C数组是0索引的,因此大小为n的数组的有效索引是0到n-1。由于数组的大小始终必须大于0,因此0始终是任何数组的有效索引。因此,如果c[0]
是一个数组或指向有效内存的指针,则编写c
始终是合法的。
由于c[i]
是一个产生左值的表达式,因此写c[0] = someValue
也是合法的(除非c
是const
)。
答案 2 :(得分:2)
此外,数组名称c可以被认为是数组中第一个元素的地址的同义词。 假设我们有数组double c [] as,
我们已经知道数组索引总是从0开始
使用c [0]表示法,我们可以访问第一个21
元素但实际编译器将c [0]转换为*(c + 0)以访问第一个元素。
同样,我们可以在程序中直接使用这些指针表示法。
例如,要访问可以使用索引c [2]访问的第三个元素, 我们可以使用指针*(c + 2)。
Thus ,
in array , c[0] means *(c+0)
c[1] means *(c+1)
c[2] means *(c+2) and so on.
答案 3 :(得分:0)
“数组不能定义为c [0]”
可以!
数字的数组成员是数组的第一个成员。
数组成员<1> 是数组的第二个成员。
总体:
具有X编号的数组成员数组的第X + 1个成员。
这不是巫术:原因是计算机不算数,十进制数字系统从数字零开始。