有可能typedef数组吗?
我有一组向量函数,它们都接受一个指向浮点数的指针,它是一个三个浮点数组.我可以使用typedef float * vec3_t,但是它不会让我通过简单地将它设置为等于括号中的数组来创建对象.
typedef float* vec3_t; vec3_t a = {1,1,1}; // Does not work vec3_t b = (float[]){1,1}; // Works float c[] = {1,1}; // Works void f(vec3_t x); f({1,1}); // Error f((float[]){1,1}; // OK
有人可以解释为什么这样工作吗?
解决方法
指针和数组不一样.虽然他们通常以相同的方式表现,但存在重大差异,其中一个您刚刚发现.
你的代码实际上是什么
我用实际类型替换了typedefed类型,以使解释更清晰.
float c [] = {1,1};
您只需创建并初始化一个数组
F({1,1});
上面的代码既不是左值也不是右值. {val1,…,valn}语法只不过是一个初始化器,不能用于elsewehere.
float * b =(float []){1,1};
在这里,您已经创建并初始化了一个数组,然后将其存储在一个指针中.
F((浮动[]){1,1};
这种情况与上述情况相同,但不是存储指针,而是将其作为参数传递给函数.
float * a = {1,1};
您正在尝试将三个变量写入尚未分配的内存位置.
一般来说,{valn,valn}是一个初始化器.在这一刻你没有什么可以初始化.因此,此语法无效.您正在尝试将气体倒入尚未制造的罐中.
虽然我明白你想要实现什么,但是你似乎总是忽略内存和指针的整体概念.想象一下这个代码(在一些脏的逻辑中)与你想要做的相当:
float* a = NULL; a[0] = 1; a[1] = 1; a[2] = 1;
如果您执行此代码会发生什么?
所以现在你知道为什么编译器禁止它.