如何直接初始化指向指针的指针数组?兼容多编译环境
问题解决方案
一、基础场景:直接初始化指针的指针数组
要避免逐个赋值ptpts,可以直接在声明时用数组初始化列表,将pts每个元素的地址作为ptpts的初始化值:
float a = 2.8f, b = 3.7f, c = 4.6f, d = 5.5f; float *pts[] = { &a, &b, &c, &d }; // 直接初始化ptpts,每个元素对应pts元素的地址 float **ptpts[] = { &pts[0], &pts[1], &pts[2], &pts[3] }; int main() { int i; for (i = 0; i < 4; i++) { printf("ptpts[%d] = %f\n", i, **ptpts[i]); } return 0; }
你之前尝试的float **ptpts = &pts;会报错,原因是类型不兼容:&pts的类型是float*(*)[4](指向float*数组的指针),而float**是指向单个float*的指针,两者属于不同的指针类型,无法直接赋值。
二、兼容PTTYPE标志的解决方案
要同时适配PTTYPE=1和PTTYPE=0的场景,核心是让两种情况下ptpts的类型和访问逻辑完全一致。我们可以统一将ptpts定义为float**数组:
#include "interface.h" #if PTTYPE // PTTYPE=1时,直接用接口中指针变量的地址初始化 float **ptpts[] = { &pta, &ptb, &ptc, &ptd }; #else // PTTYPE=0时,先存储变量的指针到pts,再用pts元素的地址初始化ptpts float *pts[] = { &a, &b, &c, &d }; float **ptpts[] = { &pts[0], &pts[1], &pts[2], &pts[3] }; #endif int main() { a = 2.8f; b = 3.7f; c = 4.6f; d = 5.5f; int i; for (i = 0; i < 4; i++) { printf("ptpts[%d] = %f\n", i, **ptpts[i]); } return 0; }
这样修改后,两种模式下ptpts都是float**[4]类型的数组,循环中的访问代码无需改动,彻底解决类型不兼容问题。
可选简化写法(依赖C99+)
如果你的编译器支持C99及以上标准,可以省去中间的pts数组,用复合字面量直接生成临时指针变量并取其地址:
#else float **ptpts[] = { &((float*){&a}), &((float*){&b}), &((float*){&c}), &((float*){&d}) }; #endif
这种写法更简洁,但需要注意:复合字面量在文件作用域下是静态存储期,不会有生命周期问题;如果要兼容老编译器,还是保留pts数组的写法更稳妥。
额外提示
标准C中不推荐使用void main(),应改为int main()并返回0,保证程序符合规范。
内容的提问来源于stack exchange,提问作者Steens
相关产品推荐
相关产品推荐

