我正在自学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;
a != arr + col; ++a)
的第一行。为什么int(*a)[col] = arr;
需要
[col]
循环的for
是否正确执行?
在第二行for语句for (int *b = *a; b != *a + col; ++b)
的第一行。 *a
是否取消引用指针?
对于我的工作原理,我不清楚第二个声明。我理解它执行的顺序,但我不清楚第一个for语句和第二个语句之间的关系。任何澄清都会非常有帮助。
答案 0 :(得分:0)
指针有一种他们指向的类型。除void *
外,指针只能保存该类型对象的地址。
在第一行中:由于循环遍历数组的每一行,因此指针必须指向整行(而不是指向单个int)。
在第二行中,*a
取消引用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;
除了使用指针而不是稍后添加到指针的整数偏移量。