Jef*_*ven 3 c++ arrays comma multidimensional-array
在玩多维数组时,我发现如果我使用逗号分隔索引,它将返回数组中元素的地址,而忽略第一个逗号。以下示例显示了这一点:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
这给出了输出:
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
Run Code Online (Sandbox Code Playgroud)
如您所见,[0,0]/ [0][0]、[0,1]/[1][0]和[0,2]/处的地址值[2][0]匹配。它们也匹配配对中的第二个与[n,n]配对中的第一个数字匹配的任何地方[n][n]。
我发现这篇关于 C++ 中逗号运算符的维基百科文章同意这种跳过:
在 Pascal 中,多维数组使用逗号进行索引,例如
A[i, j]. 然而,在 C 中,A[i, j]等价于A[j],因为 的值i被丢弃。在 C 中索引多维数组的正确方法是使用类似A[i][j].
我唯一的问题是:为什么它返回一个地址?我试图找到这背后的原因,但完全被难住了。维基百科文章似乎不同意它应该返回一个地址,因为它说它“等效于A[j]”。我将非常感谢对此的回答。提前致谢!
当您寻址多维数组时,索引由逗号分隔,逗号arr[i,j]的行为类似于逗号运算符。
逗号运算符是一个二元运算符,它计算所有以逗号分隔的表达式,完成其副作用并丢弃它,直到列表中的最后一个表达式。如此有效,它忽略了您的特定情况下除最后一个索引之外的所有索引,即j
arr[j].
由于类型arr[j]无非是int arr[3],它衰减为指针int *,因此打印指针的值显示地址。
为了扩展这一点,ostream 运算符 没有可以接受类型的重载,
Ty[]它接受的最接近的是Ty*,Run Code Online (Sandbox Code Playgroud)ostream& operator<< (void* val);所以这实际上意味着,
Ty[]衰减到Ty*然后向下转换为void *并调用ostream& operator<< (void* val),这会打印指针的地址
维基百科文章似乎不同意它应该返回一个地址,因为它说它“相当于 A[j]”。我将非常感谢对此的回答。
为了简单起见,您希望程序在以下情况下打印什么?
int arr[3];
std::cout << arr << std::endl;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2759 次 |
| 最近记录: |