仅使用指针在二维数组中移动



我想要的是只使用指针遍历数组:

int I[5][5] = { { 10, 20, 30, 40, 50},
{ 11, 21, 31, 41, 51},
{ 12, 22, 32, 42, 52},
{ 13, 23, 33, 43, 53},
{ 14, 24, 34, 44, 54} };
因此,使用for循环,我可以使用指针而不是索引打印数组的值,如下所示:
for(int(*p)[5] = I ; p<I+(sizeof(I)/sizeof(I[0])) ; p++){
for(int* q=*p ; q<*(p+1) ; q++){
cout<<*q<<" ";
}
cout<<endl;
}

但是,如果我想访问*q下面的下两个值,我怎么得到它们呢?例如,如果*q等于10,在同一次迭代中,我也想得到11和12。当*q= 32时,我想得到33和34。

我试着创建像这样的指针,但我不知道还能做什么:

int* p_ini = *(I);
int* p_fin = *(I+4);
int* q_ini = p_ini;
int* q_fin = (p_ini+4);

同样,所有这些都不使用任何索引。

如果您有一个指向外部数组(p)的元素的int(*)[5]指针,将该指针增加1将获得指向外部数组(p+1)的下一个元素的int(*)[5]指针,再增加1以获得下一个元素(p+2),依此类推。

然后,你可以解引用这些指针中的每一个,以获得指向这些内部数组(q,q2,q3等)第一个元素的int*指针。

然后,您可以将int*指针增加所需的元素数量(您可以在迭代p所指向的早期内部数组时轻松计算),即*q==10*(q2+0)*(q3+0),*(q2+2)*(q3+2)*q==32,等等。

例如:

for(int(*p)[5] = I; p < I+(sizeof(I)/sizeof(I[0])); ++p){
for(int *first = *p, *q = first; q < *(p+1); ++q){
if (*q == 10 || *q == 32) {
size_t offset = q - first;
int *q2 = *(p+1) + offset;
int *q3 = *(p+2) + offset;
cout << *q << ": " << *q2 << ", " << *q3 << endl;
}
}
}

在线演示

最新更新