带指针的数组分区

Array Partition with pointer

本文关键字:分区 数组 指针      更新时间:2023-10-16

我有一个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
}

只将指针投射到不同的类型不会改变它指向的类型(通常会导致未定义行为,除非你真的知道自己在做什么)。如果你无法更改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 );
    }
}

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

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

const char (*pointer)[20];

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


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

您的2D阵列类型为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
}

扩展James的Answer,您可以如下更改代码,因为它将指针传递到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)
        };
    }
}