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)
有人可以解释为什么这种方式有效吗?
指针和数组不是一回事.虽然它们通常以相同的方式表现,但存在重大差异,其中一个是您刚刚发现的.
我已经用类型替换了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)
如果执行此代码会发生什么?
所以现在你知道为什么编译器会禁止它.