我有以下
typedef struct{
GLfloat x;
GLfloat y;
GLfloat z;
}Vertex3D;
我想使用一个 for 循环。是否可以根据其索引从结构中指定您想要的原语。例如,如果我想使用数字 0 表示 x 1 表示 y 和 2 表示 z 就像一个数组?
感谢您的所有回复。我想我会改用数组。希望避免它,但很好。GC
你可以使用
((GLfloat *)&Vertex3D)[i];
但这很丑陋。
编辑:正如下面的答案所指出的,这在技术上甚至可能行不通。有可能(尽管对于这种特殊情况不太可能)元素将被填充并且在内存中不连续。
不合法。结构的元素可能会在内存中对齐,但我强烈建议不要这样做,这可能会在以后引起很多麻烦,尤其是当您发现结构以后需要其他成员时。
请尝试:
typedef struct
{
GLfloat c[3];
}Vertex3D;
和
#define VERTEX_X 0
#define VERTEX_Y 1
#define VERTEX_Z 2
然后访问:
Vertex3D v;
v.c[VERTEX_X] = 5.5;
不,不干净。你可以做
Vertex3D v;
float *pv = (float*)&v;
/* use pv[0],pv[1],pv[2] */
从技术上讲,这是未定义的行为,但在这种特殊情况下,我不希望任何广泛使用的编译器/OS/CPU 组合出现问题。
您可以利用结构存储在内存中的方式,但我建议不要这样做。因为所有元素在内存中彼此相邻,您可以将其视为一个数组,这在技术上是一种未定义的行为,但只要您的结构中的所有内容都是相同的类型,就不会导致任何问题(因为它基本上是一个数组)。
这是我为证明这一点而制作的测试程序
#include <stdio.h>
typedef struct {
int x;
int y;
int z;
} Point;
int main() {
Point test = {1, 2, 3};
printf("x: %d\ty: %d\tz: %d\n", test.x, test.y, test.z);
int *ptest = (int *) &test;
for (int i = 0; i < 3; i++)
printf("%d\n", ptest[i]);
return 0;
}
按预期工作