像数组一样遍历结构成员的 C 方法?

标签 c vector iteration memory-address subscript

假设我有一个 vector 类:

typedef struct vec3_s
{
    float x, y, z;
}
vec3;

但是,我希望能够在不将其转换为 float 组的情况下对其进行迭代。虽然在这种情况下强制转换是可以接受的,但我很好奇是否可以在直接 C 中使用类似 C++ 的功能。例如,在 C++ 中,自 std::vector< T >有下标[]运算符重载,我可以将其第一个索引的地址传递给采用 void* 的函数.

即,

void do_something_with_pointer_to_mem( void* mem )
{
    // do stuff
}

int main( void )
{
    std::vector< float > v;

    // fill v with values here

    // pass to do_something_with_pointer_to_mem

    do_some_with_pointer_to_mem( &v[ 0 ] );

    return;
}

另一个更具体的例子是当调用 glBufferData(...) 时在 OpenGL 中制作(使用 C++ 时):

glBufferData( GL_ARRAY_BUFFER, sizeof( somevector ), &somevector[ 0 ], GL_STREAM_DRAW );

那么,是否可以使用下标运算符在 C 语言中完成类似的事情?如果不是,我必须编写一个函数(例如 float vec3_value_at( unsigned int i ) ),仅 static inline 是否有意义?它在它定义的头文件中?

最佳答案

如果您所有的结构字段都是同一类型,您可以使用如下 union :

typedef union vec3_u
{
    struct vec3_s {
        float x, y, z;
    };
    float vect3_a[3];
}
vec3;

这样您就可以独立访问每个 x、y 或 z 字段或使用 vect3_a 数组迭代它们。这个解决方案在内存或计算方面没有任何成本,但我们可能离类似 C++ 的解决方案有点远。

关于像数组一样遍历结构成员的 C 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14418595/

相关文章:

c - 缓冲区溢出在 x86 上需要 16 个字节,但在 x64 上需要 29 个字节

c++ - 原始类型的 emplace_back 与 push_back

python - 在字符串列表中的特定元素之前和之后插入一个元素

loops - 如何在 COBOL 中对表进行排序?

C:如何将 float 包装到区间 [-pi, pi)

c - 尝试使用 scanf 中的数据时出现段错误?

serialization - 如何序列化 boost::interprocess::containers::vector

c++ - 分配 vector 值

python - 在Python中创建正态分布

c - NSString 字符串格式 : with C array?