C 为什么我会得到;指针类型的算术是必需的;?

C 为什么我会得到;指针类型的算术是必需的;?,c,pointers,casting,struct,C,Pointers,Casting,Struct,在下面的代码中,当我将浮点指针类型转换为一个结构时,我得到了一个错误,但是如果我将浮点指针类型转换为其他对象,编译器不会抱怨。为什么要这样做 typedef unsigned byte CELbool; typedef struct {(...)} Color; typedef struct { (...) Color color; CELbool b; } Light; Light _light; void function(float *x) { _lig

在下面的代码中,当我将浮点指针类型转换为一个结构时,我得到了一个错误,但是如果我将浮点指针类型转换为其他对象,编译器不会抱怨。为什么要这样做

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
}

编辑:假设a*x是指向颜色的指针,那么获得该颜色的正确方法是什么?我目前使用的是
Color c=*((Color*)(value))
,但我认为这不是正确的方法。

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

(CELbool)*x
*x
的值(因为
x
float*
,所以它是
float
)强制转换为
CELBool
,您已将其定义为某个整型的typedef。这种转换是可以的,因为C允许浮点值和整数值之间的转换,因为有一种合理的转换方法。然而,第二个演员是

(Color)*x
Color
是一个结构,C不定义浮点类型和
struct
s之间的转换,就像它不定义整型类型和
struct
s之间的转换一样,因为通常没有合理的方法进行转换

“需要指针或算术类型”错误的原因是,从
float
转换的类型需要是
float
s可以转换为的某种类型,这可能是某种实值类型、整型或指针类型,因为
float
s可以转换为指针(尽管这样做是一个非常糟糕的主意!)类型
Color
不是编译器要放在那里的合理内容列表所期望的,因此出现了错误


希望这有帮助!

您没有将浮点指针投射到任何东西上;您投射的是
*x
,指针的引用对象,类型为
float
。您试图将浮点投射到结构上…@EdS:我尝试的不同操作都会出现相同的错误,因此我最初没有意识到这一点。我试图将指针投射到结构上o一个颜色指针,然后取消对它的引用。假设我有一个*x是一个指向颜色的指针,那么获得该颜色的正确方法是什么呢?我目前正在使用*((Color*)(value)),但我认为这不是正确的方法。如果
x
确实是指向
颜色的指针,那么
*(Color*)x
将是获得它的方法;这表示“将
x
转换为指向
颜色的指针,然后取消对它的引用”。也就是说,如果参数是
浮点*
,为什么
x
真的指向
颜色呢?这似乎令人担忧。
浮点*值与
浮点值[]
,颜色是三个浮点数(r、g、b),这简化为
浮点数[3]
。我的方法实际上会根据另一个参数设置各种内容。我可能应该使用void*,但最常见的输入应该是浮点数。