我很好奇为什么这是一个错误以及错误消息的含义。这是一些代码:
int *x[] = {"foo", "bar", "baz"};
int *y[] = {"foo", "bar", "baz"};
x = y;
我尝试编译,我得到了这个:
error: incompatible types when assigning to type ‘char *[3]’ from type ‘char **’
问题#1为什么这是一个错误?和问题#2为什么类型不同?
答案 0 :(得分:5)
正如所写,有很多问题。首先,数组文字的类型为char*[]
,而x
和y
的类型为int*[]
。其次,你不能直接分配数组,因为它们实际上是常量指针。
答案 1 :(得分:3)
存在不兼容的类型错误,因为您要将字符串数组(在C中键入char *)分配给指向int的指针数组(例如int *x[]
)。编译器给出的错误消息有点令人困惑,因为C在幕后做了很多尝试将变量从一种类型转换为另一种类型。
由于字符在内部表示为数字(字母对应于它们的ASCII值),C能够将字符转换为整数,因此它会尝试将变量x和y视为指向字符而不是整数的指针数组,因此{ {1}}。它将{“foo”,“bar”,“baz”}视为类型char *[3]
,因为字符串是类型char **
,而数组本质上存储为C中的指针,因此它是指向{{1}的指针},或char *
。
虽然这与你的问题没有完全相关,但我也想知道你在尝试用char *
做什么。正如它所写的,这将使x指向与y相同的数组,留下数组x曾经指向无法访问。要检查C中的两个变量是否相等,可以使用==运算符。测试相等性对于数组或字符串来说并不那么简单,但这完全超出了这个问题的范围。
答案 2 :(得分:2)
这是一个错误,因为数组是一个不可修改的左值 - 意味着你不能直接赋值给它。您只能单独修改阵列的成员。
类型是不同的,因为如果在不需要左值的上下文中使用数组,则会将其计算为指向其第一个元素的指针(somearray
变为有效&somearray[0]
)。
由于数组y
用于此类上下文,因此将其计算为其第一个元素的地址,其类型为int **
。由于数组x
在左值上下文中是,因此它被计算为数组(int *[3]
)。 (您的错误消息实际上与您的代码不匹配 - 我怀疑您的arrrays实际上是char *
的数组。)
(“左值上下文”意味着,其中之一:赋值运算符的左侧(名称来自的位置); sizeof
运算符的主语;或者&
运营商)。
答案 3 :(得分:0)
我建议从一个关于指针和数组的好教程开始。看起来您可能来自JavaScript或PHP等解释性语言。 C中的情况完全不同,你需要掌握堆栈内存,堆内存,指针等等的概念。一旦你这样做,一切都会有意义,你会喜欢C。
答案 4 :(得分:0)
出于某种原因,我不能使用与我发布问题相同的帐户。
“int”的东西是我的错字我真的意味着它是“char”。对不起,混乱。
然而,我认为caf回答了我的问题。
“这是一个错误,因为数组是一个不可修改的左值 - 意味着你不能直接赋值给它。你只能单独修改数组的成员。”
我只是想了解指针在c中是如何工作的,这就是为什么我要尝试这些你通常不会做的随机事情。我认为这可能有用,因为我认为数组=指针所以我可以让x指向y。我猜不是吗?
感谢所有回复人员。