为什么我得到“需要指针类型的算术”?

时间:2012-03-07 01:12:47

标签: c pointers casting struct

在下面的代码中,当我将float指针强制转换为struct时,我得到一个错误,但是如果我将其转换为其他东西,编译器就不会抱怨。为什么要这样做?

typedef unsigned byte CELbool;
typedef struct {(...)} Color;
typedef struct {
    (...)
    Color color;
    CELbool b;
} Light;

Light _light;

void function(float *x) {
    _light.b = (CELbool)*x; // No error
    _light.color = (Color)*x; // (!) Used type 'Color' where arithmetic or pointer type is required
}

编辑:所以说我有* x是指向Color的指针,那么获取该Color的正确方法是什么?我目前正在使用Color c = *((Color *)(value)),但我认为这不是正确的方法。

1 个答案:

答案 0 :(得分:7)

您正在进行的转换不是从指针转换为整数或结构,而是从浮点数转换为整数和结构。表达式

(CELbool)*x

*x(由xfloat*float)的值转换为CELBool,您已定义作为某种整数类型的typedef。这种转换是可以的,因为C允许在浮点值和整数值之间进行转换,因为有一种合理的转换方式。但是,第二个演员是

(Color)*x

Color是一个结构,C不定义浮点类型和struct之间的转换,就像它没有定义整数类型和struct之间的转换一样,因为一般来说没有合理的方法来进行这种转换。

关于“需要指针或算术类型”的错误的原因是因为float的强制转换需要转换为float可以转换为的某种类型,这可能是一些实值类型,整数类型或指针类型,因为float可以转换为指针(虽然这样做是一个非常糟糕的主意!)类型Color不是预期的通过编译器列出的合理的事情列表,因此错误。

希望这有帮助!