我正在自学 C++,目前正在学习多维数组。下面是我正在使用的代码。代码下方是我遇到的问题/概念。
int main(){
const unsigned row = 4, col = 4;
int arr[row][col], cnt = 0;
for (int(*a)[col] = arr; a != arr + col; ++a){
for (int *b = *a; b != *a + col; ++b){
*b = cnt;
++cnt;
}
}
system("pause");
return 0;
}
在 for 语句的第一行
for (int(*a)[col] = arr; 一个!= arr + col;++a)
。为什么int(*a)[col] = arr;
需要[col]
forfor
循环是否正确执行?在第二个 for 语句的第一行
for (int *b = *a; b != *a + col;++b)
。*a
不是取消引用指针吗?我不清楚第二个 for 语句的工作原理。我明白它执行的顺序是什么,但是我不清楚第一个for语句和第二个for语句之间的关系。任何澄清都会非常有帮助。
最佳答案
指针具有它们指向的类型。除了void *
,指针只能保存该类型对象的地址。
在第一行中:由于您要遍历数组的每一行,因此指针必须指向整行(而不是单个 int)。
在第二行中,*a
取消引用 a
。 *一个
。始终等同于 a[0]
。由于 a
指向一行,因此 a[0]
指定该行。
a[0]
是一个数组,因此当它用于初始化 b
时,它会衰减到指向该行第一个元素的指针。
第一个 tlook 遍历每一行;第二个循环遍历 ech 列。它的结构与:
for (int i = 0; i < row; ++i)
for (int j = 0; j < row; ++j)
arr[i][j] = ++cnt;
除非您使用的是指针而不是稍后添加到指针的整数偏移量。
关于c++ - 指针和多维数组题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27262726/