为什么我不能在等号的左侧放置一个数组名称

时间:2014-01-27 10:12:38

标签: c arrays unix pointers

为什么我们不能在c中执行此操作:

   char name[6];
   name = "Jason"; 

然而,我们可以使用指针。

  char name; 
  char * pName = &name; 
  pName = "Jason"; 

数组和指针之间的主要区别是什么?我明白数组是一个固定的常量指针,很公平,但我不太确定如果数组的名称是指针(指针常量)指向数组中的第一个元素为什么不能这是如何工作的我用等号更改该数组元素的内容?我回答了我的问题,说这是一个指针常数,但我没有掌握这个概念!

3 个答案:

答案 0 :(得分:2)

因为当您编写"a constant string"时,编译器会在编译的代码中分配此字符串,如果您c = "a string" c是指针,c现在将指向那个特定的位置。

数组的位置是固定的(你不能说“现在指向别的东西”),所以你应该用strcpy复制字符串。

strcpy(name, "Jason");

通过这种方式,编译器将在编译的代码中分配"Jason",但在执行时,其内容将被复制到专用于name的内存区域。

答案 1 :(得分:1)

作为评估=赋值运算符的结果,C永远不会复制裸字符串(实际字符数据)。这是因为在C中这样的事情不被视为“值”。您可以将数组嵌入到结构中以使其成为值,如注释中所指出的那样。

你的第一个例子只有在有的情况下才有意义,但事实并非如此。第二个例子只是指定一个指针值,这很好。但是你不能重新分配数组的地址(name在第一个例子中是一个常量指针)所以没有办法让它工作。

另外,请记住,有多个数组而不是字符数组,在我看来,在=运算符上为字符数组重载这么多特殊行为会很奇怪。

答案 2 :(得分:1)

简单地说,数组名称实际上是指向数组的常量指针。

由于在执行期间无法修改常量对象,因此将数组指定为左值(即赋值运算符的左侧)无效。

要使用您的示例,以下内容相当于尝试将某些内容分配给数组名称:

char name; 
const char *pName = &name; 
pName = "Jason";    //error!!

结帐 memcpy() strcpy() 以修改数组的内容。注意确保写入的数组不是常量(或静态分配)。