确定存储指向不同维度的其他数组的指针的数组的类型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了确定存储指向不同维度的其他数组的指针的数组的类型相关的知识,希望对你有一定的参考价值。

我对许多LEN在[0,LEN)中具有整数的所有可能置换的许多恒定2D数组:

static const char permu2[][2] = {{0, 1}, {1, 0}};
static const char permu3[][3] = {{0, 1, 2}, {0, 2, 1}, {1, 0, 2},
                                {1, 2, 0}, {2, 0, 1}, {2, 1, 0}};
static const char permu4[][4] = {
    {0, 1, 2, 3}, {0, 1, 3, 2}, {0, 2, 1, 3}, {0, 2, 3, 1}, {0, 3, 1, 2},
    {0, 3, 2, 1}, {1, 0, 2, 3}, {1, 0, 3, 2}, {1, 2, 0, 3}, {1, 2, 3, 0},
    {1, 3, 0, 2}, {1, 3, 2, 0}, {2, 0, 1, 3}, {2, 0, 3, 1}, {2, 1, 0, 3},
    {2, 1, 3, 0}, {2, 3, 0, 1}, {2, 3, 1, 0}, {3, 0, 1, 2}, {3, 0, 2, 1},
    {3, 1, 0, 2}, {3, 1, 2, 0}, {3, 2, 0, 1}, {3, 2, 1, 0}};
static const char permu5[][5] = {{0, 1, 2, 3, 4}, {0, 1, 2, 4, 3}, {0, 1, 3, 2, 4}, /*... */}
// and many more as you can imagine...

而且我想将指向这些数组的指针存储在另一个数组中:

static const char *permu[] = {0,      0,      permu2, permu3, permu4,
                             permu5, permu6, permu7, permu8};
static const int fac_seq[] = {1,   1,    2,     6,      24,      120,
                              720, 5040, 40320, 362880, 3628800, 39916800};

因此,对于给定的LEN = n,我可以通过这种方式访问​​这些常量:

const int n = 8;
for ( size_t i = 0; i < fac_seq[n]; i++ ) {
    for ( size_t j = 0; j < n; j++ ) {
        printf( "%2d", *( permu[n] + n*i  + j ) );
    }
    putchar( '
' );
}

尽管这将编译并正常工作,但编译器(gcc)抱怨如下:

30.c:1966:47: warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
 static const char *permu[] = {0,      0,      permu2, permu3, permu4,
                                               ^~~~~~
30.c:1966:47: note: (near initialization for ‘permu[2]’)
30.c:1966:55: warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
 static const char *permu[] = {0,      0,      permu2, permu3, permu4,
                                                       ^~~~~~
30.c:1966:55: note: (near initialization for ‘permu[3]’)

permu数组的正确类型是什么?我尝试了const char **permu[],但仍然收到相同的警告。

答案

您可以尝试

static const void *permu[] = { };

然后您必须在访问时进行投射。

或者,您可以使每个数组都是一维的,然后自己编制索引。

另一答案

正确的声明是

static const char (*permu[9])[] = {0,      0,      permu2, permu3, permu4,
                                   permu5, permu6, permu7, permu8};

permu是由9个指针组成的数组,这些数组指向const char个未知数的数组。写入9是可选的。可以从初始化程序中推断出来。与其他答案一样,您could使其成为指向void的指针的数组,但是最好保留尽可能多的信息。您可以这样使用它:

const int n = 4;
const char (*perms)[n] = permu[n];
for (size_t i = 0; i < fac_seq[n]; i++) {
    for (size_t j = 0; j < n; j++) {
        printf("%2d", perms[i][j]);
    }
    putchar('
');
}

请注意,我要对perms进行分配。我将指针指向未知大小的数组,并将其转换为数组大小实际上为n的指针。这就是以后允许使用双[]语法的原因:类型const char[n]具有定义的大小(sizeof(char)*n),因此我们知道我们需要为perms[i]跳过多少距离。

Godbolt

以上是关于确定存储指向不同维度的其他数组的指针的数组的类型的主要内容,如果未能解决你的问题,请参考以下文章

二维数组和指向指针的指针

从函数返回指向数组的指针,函数名称后具有数组维度

C语言指向一维数组元素的指针

C++ 指针数组

C语言 如何给指针数组划分动态存储空间

动态更改指向结构的指针数组的数据类型