1

给定一个指针和一个数组,设置一个等于另一个在一种情况下会失败,而在另一种情况下则有效。

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;
4

1 回答 1

1

“数组名称是第零个元素的地址”这一事实在大多数情况下都是正确的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)- 在这里,它与sizeof(&c_arry[0])1.

于 2013-05-12T16:59:29.027 回答