繁体   English   中英

指针数组的初始化

[英]Initialization of an array of pointers to pointers

我需要以这种方式初始化指向四个变量abcd的指针的指针数组:

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=1PTTYPE=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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM