带指针的数组分区

时间:2013-08-19 13:56:40

标签: c++ pointers multidimensional-array

我有一个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 个答案:

答案 0 :(得分: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 );
    }
}

答案 1 :(得分:0)

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

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

const char (*pointer)[20];

您当然需要更新printGrid功能以匹配类型。


至于为什么指针指针和数组数组(通常也称为矩阵)的原因参见例如this old answer of mine显示两者的内存布局。

答案 2 :(得分:0)

您的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
}

答案 3 :(得分:0)

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