2012-04-07 37 views
5

可能重复:
C - Difference between “char var[]” and “char *var”?差[]用C

我写了下面的C代码

#include<stdio.h> 
int main() 
{ 
    char name[31]; 
    char *temp; 
    int i ; 
    scanf("%s",name); 
    temp = name; 
    name = temp; 

} 

我有以下错误编译时

incompatible types when assigning to type 'char[31]' from type 'char *' 

数组名是一个指向第一个元素的指针(这里是char pointer ..right?)。对吗?上面的代码意味着字符数组和char *是不同的类型..它是真的吗? 为什么类型的名称!=字符* 为什么我不能指定另一个字符指针的字符指针(数组名)

+0

请在此处提问之前查看C常见问题解答。 – 2012-04-07 15:44:47

回答

5

“数组名称是指向第一个元素的指针(这里是char pointer .. right?)。right?”

char name[31]; 
char *temp; 
/* ... */ 
name = temp; 

name = temp分配的name的值被转换为一个指针char。该值被转换,不是的对象。该对象仍然是一个数组,数组不是可修改的左值。由于赋值操作数的约束条件要求赋值运算符的左操作数为可修改的左值,因此出现错误。

+0

Downvoter,请解释你为什么downvoted这个答案同样的错误。 – ouah 2012-04-07 14:10:42

+0

+1补偿:) – 2012-04-07 15:44:02

+0

@JensGustedt谢谢Jens;) – ouah 2012-04-07 16:45:29

1

首先,阵列存储缓冲器,不是指针,但在需要的时候他们可能会衰减到指针。

现在,name是一个数组,所以你不能指定它。当您将一个数组分配给一个指针时,该数组将被衰减为一个指针,并且该赋值是有效的。

+0

这是我新的信息...谢谢 – 2012-04-07 12:06:40

9

数组名称是指向第一个元素的指针(这里是char指针..好吗?)。 对不对?

错误。数组衰减指向大多数上下文中的第一个元素,但它们当然不是指针。有一个在C FAQ一个很好的解释和不可估量的图像(一个是一个数组,p是一个指针):分配给输入从类型“的char [31]”时

Arrays and pointers

不兼容的类型“字符 *”

在C语言中数组是不可修改的左值,你不能改变他们指出,因为他们不随地摆在首位点什么。

+0

感谢您的链接... – 2012-04-07 12:05:47

+0

好......了点阵列是不可修改的左值......这意味着 我不能也可做 焦炭名[31] ; char temp [31]; int i; scanf(“%s”,name); temp = name; name = temp; 对不对? ...另外如何在我在这里评论时缩进代码? :) – 2012-04-07 12:09:57

+0

scanf几乎可以(放下&)。剩下的是错误的。 – cnicutar 2012-04-07 12:10:44

1

不,指针指向相同类型的对象。这意味着如果指针正确分配,指针可以用作完全成熟的数组。
一个非指针意味着你有“在你面前”的数据,它不会让你正确地获取数据(也有时间问题),所以说实话,指针更好用你的情况到处都是。

1

因为'name'是一个数组。所以 这行:

name = temp; 

会给你错误。

此外,您在for循环中的条件是错误的。名称[]将具有垃圾值,并且您不能使用

name[i]!='\0' 

作为条件。

+0

刚才删除的错误 – 2012-04-07 12:05:10