[英]Typecasting an array to pointer?
是否可以键入一个数组?
我有一组向量函数,它都接受指向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
有人可以解释为什么这种方式有效吗?
指针和数组不是一回事。 虽然它们通常以相同的方式表现,但存在重大差异,其中一个是您刚刚发现的。
我已经用类型替换了typedefed类型,以使解释更加清晰。
float c[] = {1,1,1};
您只需创建并初始化一个数组
f({1,1,1});
上面的代码既不是左值也不是右值。 {val1,...,valn}
语法只不过是初始化程序 ,不能在其他地方使用。
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;
如果执行此代码会发生什么?
所以现在你知道为什么编译器会禁止它。
你必须将许多不同的功能堆积到你的代码中,所以你的意思并不完全清楚“为什么这样工作”。 什么是“这个”具体?
无论如何,为了“typedef一个数组”你必须键入一个数组,而不是指针
typedef float vec3_t[3];
之后你就能做到
vec3_t a = { 1, 1, 1 };
其余代码与typedefing数组无关。 您只是发现了复合文字语法,它与(non-scalar-type) { initializers }
并创建了给定类型的无名临时对象。 (non-scalar-type)
部分是复合文字语法的重要部分。 你不能省略它。
所以,而不是做
vec3_t a = { 1, 1, 1 };
f(a);
如果你不关心命名数组对象a
,你可以简单地做
f((vec3_t) { 1, 1, 1 });
要么
f((float [3]) { 1, 1, 1 });
要么
f((float []) { 1, 1, 1 });
具有相同的效果。
数组不是指针。 数组有一个基指针。 但无论如何,您尝试实现的最适用的数据结构将是:
struct{
float x;
float y;
float z;
} myFloat3;
数组对于可变长度的结构和东西很方便,但不是最有效的选择,因为你知道你有3个浮点数,你可以利用它。 让编译器有效地打包您的大量结构,并从堆中分配您需要的内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.