给定一个指针和一个数组,设置两者相等在一种情况下失败,在另一种情况下有效。
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:不兼容的类型当赋值给类型"时。这个错误似乎不诚实,坦率地说,有点淫荡,因为就在前一行,她声称她是我喜欢的类型。
为了理解这个问题,我重读了K&R关于指针和数组的章节,注意到在第102页他们声称"数组名称是第0个元素的地址"。如果K&R是准确的,那么代入& c_array[0]也会产生同样的误差,对吗?但是这一行:
&c_arry[0] = c_ptr;
给了我一个新的错误:"左值要求作为赋值的左操作数"。为什么这个所谓的相同值会产生不同的错误?当GCC和K&R相互矛盾时,我就会求助于stackoverflow专家。
阅读了一些关于l值的内容,我得出结论,这是一个l值与r值的问题,并且c_array只能在两种情况下是l值,即赋值,并且只有两种情况:
- 字符串初始化(即
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;
"数组名称是第0个元素的地址"这一事实在大多数情况下是正确的1并不意味着你可以给它赋任何值。虽然这
char str[] = "hello";
看起来像赋值,实际上是初始化;左值的概念不适用于它
此外,使用&
操作符获取地址永远不会产生左值,因此没有办法得到不破坏前三个示例的X
。
后两个是可以分配的,只需要稍作调整:
*c_arry = 'x'; // the same as c_arry[0] = 'x'
char *c_arry_of_ptr[2];
...
*c_arry_of_ptr[0] = 'x';
1一个值得注意的例外是
sizeof(c_arry)
-在这里,对于大小不同于1
的数组,它与sizeof(&c_arry[0])
不同。