给定一个指针和一个数组,设置一个等于另一个在一种情况下会失败,而在另一种情况下则有效。
char *c_ptr = "I'm a char pointer";
char c_arry[] = "I'm a char array";
c_ptr = c_arry; //This line works.
c_arry = c_ptr; //This line fails.
当上面的行失败时,它会生成以下警告:“error: incompatible types when assignment to type”。这个错误似乎很虚伪,坦率地说,有点放荡,因为就在前面一行,她声称她是我的类型。
为了理解这个问题,我重新阅读了 K&R 关于指针和数组的章节,并在第 102 页注意到他们声称“数组名称是第零个元素的地址”。如果 K&R 是准确的,替换 &c_arry[0] 应该会产生相同的错误,对吧?但是这一行:
&c_arry[0] = c_ptr;
给了我一个新错误:“左值需要作为赋值的左操作数”。 为什么这个所谓的相同值会产生不同的错误?当 GCC 和 K&R 相互矛盾时,这就是我求助于 stackoverflow 专家的时候。
读了一点左值,我得出的结论是,这是一个左值与右值的问题,并且 c_arry 只能是一个左值 - 即分配的值 - 在两个,只有两种情况:
- 字符串初始化(即
char c_arry[] = "I'm a char array";
) - 和字符分配(即
c_arry[0] = 'A';
)
我的结论准确吗?这是唯一c_arry
可以分配的两种方式吗?
或者换一种说法,对于以下任何代码行,是否存在一个有效的 X?
c_arry = X;
&c_arry = X;
&c_arry[0] = X;
*c_arry = X;
*c_arry[0] = X;