C++多维数组逗号索引地址

C++ Multi-dimensional Array Comma Index Address

本文关键字:索引 地址 数组 C++      更新时间:2023-10-16

在玩多维数组时,我发现如果我使用逗号来分隔索引,它会返回数组中元素的地址,而不考虑第一个逗号。以下示例对此进行了说明:

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]对中的第一个数字匹配的地方。

我发现这篇关于逗号运算符的维基百科文章C++同意这种跳过:

在 Pascal 中,多维数组使用逗号进行索引,例如A[i, j].然而,在C中,A[i, j]等价于A[j],因为i的值被丢弃。在 C 中索引多维数组的正确方法是使用A[i][j]这样的结构。

我唯一的问题是:为什么它会返回一个地址?维基百科的文章似乎不同意它应该返回一个地址,因为它说它"等同于A[j]"。

当你对多维数组进行寻址时,用逗号分隔的索引arr[i,j],逗号的行为类似于逗号运算符。

逗号运算符是一个二元运算符,它计算所有逗号分隔的表达式,完成其副作用,并将其丢弃,直到列表中的最后一个表达式。如此有效地,它忽略了您特定情况下的最后一个索引之外的所有索引,即jarr[j].

由于arr[j]的类型只不过是int arr[3],它衰减为指针int *,因此打印指针的值会显示地址。


为了对此进行扩展,ostream 算子 没有可以接受类型Ty[]的重载,最接近 它接受是Ty*

ostream& operator<< (void* val); 

因此,这实际上意味着,Ty[]衰减到Ty*然后向下转换为void *并调用ostream& operator<< (void* val),用于打印指针的地址


维基百科文章似乎不同意它应该返回 地址,因为它说它"等同于 A[j]"。我会非常 非常感谢对此的回答。

为了简单起见,您希望程序在以下情况下打印什么?

int arr[3];
std::cout << arr << std::endl;