对指针进行类型转换?

Sta*_*aro 10 c arrays pointers

是否可以键入一个数组?

我有一组向量函数,它都接受指向float的指针,float是一个由三个浮点数组成的数组.我可以使用typedef float*vec3_t,但它不会让我创建一个对象,只需将其设置为括号中的数组即可.

typedef float* vec3_t;

vec3_t a = {1,1,1}; // Does not work
vec3_t b = (float[]){1,1,1}; // Works
float c[] = {1,1,1}; // Works

void f(vec3_t x);

f({1,1,1}); // Error
f((float[]){1,1,1}; // OK
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么这种方式有效吗?

Dar*_*usz 7

指针和数组不是一回事.虽然它们通常以相同的方式表现,但存在重大差异,其中一个是您刚刚发现的.

你的代码实际上做了什么

我已经用类型替换了typedefed类型,以使解释更加清晰.

float c[] = {1,1,1};

您只需创建并初始化一个数组

f({1,1,1});

上面的代码既不是左值也不是右值.该{val1,...,valn}语法是什么比一个初始化多,不能elsewehere使用.

float* b = (float[]){1,1,1};

在这里,您已创建并初始化了一个数组,然后将其存储在指针中.

f((float[]){1,1,1};

这种情况与上面的情况相同,但不是存储指针,而是将其作为参数传递给函数.

float* a = {1,1,1};

您正在尝试将三个变量写入尚未分配的内存位置.通常,{valn,...,valn}是初始化程序.此时你无需初始化.因此,此语法无效.您正在尝试将气体倒入尚未制造的罐中.

虽然我理解你想要实现的目标,但你似乎错误地理解了内存和指针的整个概念.想象一下这段代码,它(在某些肮脏的逻辑中)相当于你想要做的事情:

float* a = NULL;
a[0] = 1;
a[1] = 1;
a[2] = 1;
Run Code Online (Sandbox Code Playgroud)

如果执行此代码会发生什么?

所以现在你知道为什么编译器会禁止它.