【发布时间】:2015-04-29 02:48:30
【问题描述】:
在玩多维数组时,我发现如果我使用逗号分隔索引,它将返回给我数组中元素的地址,而忽略第一个逗号。以下示例显示了这一点:
int arr[3][3];
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
// Output arr[,] test
cout << "arr[" << i << "," << j << "]: " << arr[i,j] << endl;
}
}
cout << "\n--------------\n" << endl;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
// Output arr[][] test
cout << "arr[" << i << "][" << j << "]: " << &arr[i][j] << endl;
}
}
这给出了输出:
arr[0,0]: 0x28feec
arr[0,1]: 0x28fef8
arr[0,2]: 0x28ff04
arr[1,0]: 0x28feec
arr[1,1]: 0x28fef8
arr[1,2]: 0x28ff04
arr[2,0]: 0x28feec
arr[2,1]: 0x28fef8
arr[2,2]: 0x28ff04
--------------
arr[0][0]: 0x28feec
arr[0][1]: 0x28fef0
arr[0][2]: 0x28fef4
arr[1][0]: 0x28fef8
arr[1][1]: 0x28fefc
arr[1][2]: 0x28ff00
arr[2][0]: 0x28ff04
arr[2][1]: 0x28ff08
arr[2][2]: 0x28ff0c
如您所见,[0,0]/[0][0]、[0,1]/[1][0] 和 [0,2]/[2][0] 处的地址值匹配。只要[n,n] 对中的第二个数字与[n][n] 对中的第一个数字匹配,它们也会匹配。
我发现 Wikipedia article 关于 C++ 中的逗号运算符同意这个跳过:
在 Pascal 中,多维数组使用逗号进行索引,例如
A[i, j]。然而,在 C 中,A[i, j]等价于A[j],因为i的值被丢弃了。在 C 中索引多维数组的正确方法是使用类似A[i][j]的结构。
我唯一的问题是:为什么它会返回一个地址?我试图找到这背后的原因,但完全被难住了。维基百科文章似乎不同意它应该返回一个地址,因为它说它“相当于A[j]”。我将非常感谢对此的回答。提前谢谢!
【问题讨论】:
-
数组衰减为指针,所以当你有一个数组
myArray[i][j]时,只索引一次:myArray[i]你得到一个指向大小为j的数组的指针。这就是为什么你会得到一个指针。 -
编译器通常会对此发出警告。确保设置了警告选项。
-
“维基百科的文章似乎不同意它应该返回一个地址......” - 它没有返回一个地址。它评估为
int (&)[3];对三个int的数组的引用。您在输出表达式中使用它的方式会导致转换为int *。
标签: c++ arrays multidimensional-array comma