0

一个数组不能定义为 c[0],它至少必须像 c[1] 为什么下面的代码是正确的?他在那里做什么?谢谢你的解释。

编辑:对不起,我在 VS2012 中编写 C++ 代码

int foo(double c[], int n) 
{

    if (n==1) {
        c[0] = 0;      //why is this possible?
    } else {
.
.
.

}
4

4 回答 4

6

double c[], 在参数位置,是 ; 的语法糖double *c。它实际上是一个指针。同样,c[0]是糖*c

c[0] = 0;不是数组声明。这是对 指向的数组的第一个元素的赋值c

于 2013-05-22T16:49:44.387 回答
2

在变量声明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)。

于 2013-05-22T16:54:18.583 回答
2

此外,数组名 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.
于 2013-05-22T17:10:09.537 回答
0

“数组不能定义为 c[0]”

有可能!

编号为0的数组成员是数组的第一个成员

编号为1的数组成员是数组的第二个成员

全面的:

编号为X的数组成员是数组的第 X+1 个成员

这不是巫术:原因是我们计算时计算机不计算,十进制数字系统从数字零开始。

于 2013-05-22T17:35:39.110 回答