[英]Initialization of an array of pointers to pointers
我需要以这种方式初始化指向四个变量a
、 b
、 c
和d
的指针的指针数组:
float a = 2.8f, b = 3.7f, c = 4.6f, d = 5.5f;
float *pts[] = { &a, &b, &c, &d };
float **ptpts[4];
void main() {
ptpts[0] = &pts[0];
ptpts[1] = &pts[1];
ptpts[2] = &pts[2];
ptpts[3] = &pts[3];
int i;
for (i = 0; i < 4; i++) {
printf("ptpts[%d] = %f\n", i, **ptpts[i]);
}
}
是否有更简单的方法可以在声明时直接使用数组pts
来初始化数组ptpts
,以便一一摆脱ptpts
中每个元素的分配。 类似的东西(但不起作用):
float *pts[] = { &a, &b, &c, &d };
float **ptpts = &pts; // => initialization from incompatible pointer type
换句话说,没有办法从指针数组中获取相应的引用数组吗?
编辑:
在发表一些评论之后,我在此提供一些背景资料来解释我是如何提出这个问题的。 这可能有助于提出解决方案或为更好的架构提供想法。
我正在开发的程序有以下接口( interface.h
)。 根据编译时定义的标志PTTYPE
,接口将是一组变量或一组指针,具体取决于程序部署的环境。 程序必须符合两种接口类型( PTTYPE=1
或PTTYPE=0
)。
// interface.h
#if PTTYPE
float *pta, *ptb, *ptc, *ptd;
#define a (*pta)
#define b (*ptb)
#define c (*ptc)
#define d (*ptd)
#else
float a, b, c, d;
#endif
我不是这个接口文件的所有者,不能修改它。 我必须在我的程序中包含这个文件,并希望有一种简单而独特的方式来达到这些值。 这就是为什么我考虑使用指向指针的指针数组并且会有类似的东西:
#include "interface.h"
#if PTTYPE
float **ptpts[]={ &pta, &ptb, &ptc, &ptd };
#else
float *pts[]={ &a, &b, &c, &d };
float **ptpts = &pts; // => initialization from incompatible pointer
#end
void 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]);
}
}
float ..... = &pts;
是的,您可以,但您需要另一种指针类型(指向数组的指针):
float a = 2.8f, b = 3.7f, c = 4.6f, d = 5.5f;
float *pts[] = { &a, &b, &c, &d };
float *(*ptpts)[4] = &pts;
for (size_t i = 0; i < 4; i++)
{
printf("*ptpts[0][%zu] = %f\n", i, *ptpts[0][i]);
}
或者
for (size_t i = 0; i < 4; i++) {
printf("ptpts[%zu] = %f\n", i, *(*ptpts[i]));
}
是的,即使没有任何变量,您也可以
int main(void)
{
float **pptrs[] = {(float **){&(float *){&(float){1.0f}}},
(float **){&(float *){&(float){2.0f}}},
(float **){&(float *){&(float){3.0f}}},
(float **){&(float *){&(float){4.0f}}}, };
}
可以通过这种方式内联定义和初始化数组:
float **ptpts[] = { &pts[0], &pts[1], &pts[2], &pts[3]};
如果数组是全局的并且在main
中初始化是局部的,则需要一个循环或一系列赋值。
可以使用空格来提高可读性。
int main() {
float a=2.8f, b=3.7f, c=4.6f, d=5.5f;
float *pts[]={ &a, &b, &c, &d };
// What you want?
float **ptpts[] = { &pts[0], &pts[1], &pts[2], &pts[3] };
for( int i = 0; i < 4; i++ )
printf("ptpts[%d] = %f\n", i, **ptpts[i]);
return 0;
}
Output:
ptpts[0] = 2.800000
ptpts[1] = 3.700000
ptpts[2] = 4.600000
ptpts[3] = 5.500000
所以,感谢0___________的帮助,我能够找到一个解决我最初问题的解决方案(即用指针或变量初始化指向指针的指针数组)。 这样,我不再使用指针pts
的中间数组,而是使用复合文字直接创建指向指针的指针数组。
这是数组ptpts的初始化部分:
#if ITYPE
#define ADAPT(name) pt##name
#else
#define ADAPT(name) (float *){&name}
#endif
float **ptpts[] = { &ADAPT(a),
&ADAPT(b),
&ADAPT(c),
&ADAPT(d) };
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.