这个片段中的指针发生了什么?

时间:2010-04-18 03:09:56

标签: c pointers

我很好奇为什么这是一个错误以及错误消息的含义。这是一些代码:

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为什么类型不同?

5 个答案:

答案 0 :(得分:5)

正如所写,有很多问题。首先,数组文字的类型为char*[],而xy的类型为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。我猜不是吗?

感谢所有回复人员。