确定存储指向不同维度的其他数组的指针的数组的类型
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]
跳过多少距离。
以上是关于确定存储指向不同维度的其他数组的指针的数组的类型的主要内容,如果未能解决你的问题,请参考以下文章