何时可以使用字符数组的名称来生成有效的 L 值?



给定一个指针和一个数组,设置两者相等在一种情况下失败,在另一种情况下有效。

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])不同。

相关内容

最新更新