C99环境下如何通过指针对数组直接用花括号初始化以省略for循环
解决方案
C语言本身不支持直接用大括号初始化语法给指针指向的数组批量赋值,你想要的写法确实不能直接编译,但可以通过*C99复合字面量+memcpy*的方式实现,完全不需要手写for循环,代码如下:
#include <string.h> // 需引入memcpy对应的头文件 // Creates a rectangle for mapping a texture. Array must be 20 elements long. void make_vertex_rect(float x, float y, float w, float h, float *vertex_positions) { memcpy(vertex_positions, (float[20]) { // 按原有顶点顺序填写初始化值即可 x, y, 0.0f, 0.0f, 0.0f, x + w, y, 0.0f, 1.0f, 0.0f, x + w, y - h, 0.0f, 1.0f, 1.0f, x, y - h, 0.0f, 0.0f, 1.0f }, sizeof(float[20])); }
原理解释
- 上述代码中
(float[20]) { ... }就是C99引入的复合字面量语法,会在当前栈上创建一个临时的长度为20的float数组,并用大括号内的数值完成初始化 - 之后调用
memcpy将临时数组的内容完整拷贝到vertex_positions指向的内存区域即可,针对这种固定小长度的拷贝操作,编译器通常会优化为寄存器直接赋值,性能不会弱于手写for循环,甚至可能更高 - 如果不想引入额外头文件,也可以用结构体封装数组,利用C语言支持结构体直接赋值的特性实现,同时也可以使用你提到的指定初始化器特性:
// 提前定义封装数组的结构体 typedef struct { float data[20]; } VertexRect; void make_vertex_rect(float x, float y, float w, float h, float *vertex_positions) { *(VertexRect*)vertex_positions = (VertexRect) { .data = { x, y, 0.0f, 0.0f, 0.0f, x + w, y, 0.0f, 1.0f, 0.0f, x + w, y - h, 0.0f, 1.0f, 1.0f, x, y - h, 0.0f, 0.0f, 1.0f } }; }
内容的提问来源于stack exchange,提问作者Nils
相关产品推荐
相关产品推荐

