我有一个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
}
答案 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)
};
}
}