带指针的数组分区
Array Partition with pointer
我有一个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)
};
}
}
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 使用指针从C++中的数组中获取最大值
- C++使用整数的压缩数组初始化对象
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '