0

我有一个 20 x 20 数组,需要通过读取 4 x 4 数组来迭代它。我以为我可以通过明确的分配来做到这一点,但除了强制关闭它并没有多大作用

const char SOURCE[20][20];
const char **pointer;

for(int x = 0; x < 20; x+=4)
{
    for(int y = 0; y < 20; y+=4)
    {
        pointer = (const char **)&SOURCE[x][y];
        printGrid(pointer);
    }
}

void printGrid(const char **grid)
{
    // do something usefull
}
4

4 回答 4

2

只是将指针转换为不同的类型不会改变它指向的类型(并且通常会导致未定义的行为,除非你真的知道你在做什么)。如果无法更改printGrid,则必须即时创建一个指针数组:

for ( int x = 0; x < 20; x += 4 ) {
    for ( int y = 0; y < 20; y += 4 ) {
        char const* p4[4] =
        {
            source[x] + y,
            source[x + 1] + y,
            source[x + 2] + y,
            source[x + 3] + y
        };
        printGrid( p4 );
    }
}
于 2013-08-19T15:21:47.083 回答
0

扩展詹姆斯的答案,您可以如下更改您的代码,因为它看到它将指针传递给 4 的数组,char而不仅仅是char.

for(int x = 0; x < 20; x+=4)
{
    for(int y = 0; y < 20; y+=4)
    {
        char const (*p4[4])[4] =
        {
            (const char(*)[4])(SOURCE[x] + y),
            (const char(*)[4])(SOURCE[x + 1] + y),
            (const char(*)[4])(SOURCE[x + 2] + y),
            (const char(*)[4])(SOURCE[x + 3] + y)
        };
    }
}
于 2013-08-19T14:45:22.753 回答
0

指向指针的指针数组数组不同。

但是,您可以使用指向数组的指针:

const char (*pointer)[20];

您当然需要更新printGrid函数以匹配类型。


至于指针指向指针和数组数组(也通常称为矩阵)的原因,请参见我的这个旧答案,它显示了两者的内存布局。

于 2013-08-19T13:59:41.067 回答
0

您的二维数组的类型为char

const char SOURCE[20][20];

当您遍历它时,您可以查看char或使用以下地址引用地址char*

for(int x = 0; x < 20; x+=4)
{
    for(int y = 0; y < 20; y+=4)
    {
        printGrid(SOURCE[x][y]); // do this unless you need to do something with pointer
    }
}

然后您可以printGrid使用以下任一签名进行制作:

void printGrid(const char& grid)
{
    // do something usefull
}

或者

void printGrid(const char* grid)
{
    // do something usefull
}
于 2013-08-19T14:14:44.363 回答