一个数组不能定义为 c[0],它至少必须像 c[1] 为什么下面的代码是正确的?他在那里做什么?谢谢你的解释。
编辑:对不起,我在 VS2012 中编写 C++ 代码
int foo(double c[], int n) 
{
    if (n==1) {
        c[0] = 0;      //why is this possible?
    } else {
.
.
.
}
    double c[], 在参数位置,是 ; 的语法糖double *c。它实际上是一个指针。同样,c[0]是糖*c。
c[0] = 0;不是数组声明。这是对 指向的数组的第一个元素的赋值c。
在变量声明c[0]中意味着“c 是一个大小为 0 的数组”。由于大小为 0 的数组在 C 或 C++ 中不存在(并且没有意义),也就是说,正如您所指出的,这是非法的。
作为表达式的c[0]意思是“获取 c 的索引 0 处的元素”。由于 C 数组是 0 索引的,因此大小为 n 的数组的有效索引为 0 到 n-1。由于数组的大小始终必须大于 0,因此 0 始终是任何数组的有效索引。所以写c[0]ifc是一个数组或指向有效内存的指针总是合法的。
因为c[i]is 是一个产生左值的表达式,所以它也总是合法的c[0] = someValue(除非cis const)。
此外,数组名 c 可以被认为是数组中第一个元素的地址的同义词。假设我们有数组 double c[] 作为,

我们已经知道数组索引总是从 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.
    “数组不能定义为 c[0]”
有可能!
编号为0的数组成员是数组的第一个成员。
编号为1的数组成员是数组的第二个成员。
全面的:
编号为X的数组成员是数组的第 X+1 个成员。
这不是巫术:原因是我们计算时计算机不计算,十进制数字系统从数字零开始。