一个数组不能定义为 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
(除非c
is 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 个成员。
这不是巫术:原因是我们计算时计算机不计算,十进制数字系统从数字零开始。