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

Posted

技术标签:

【中文标题】C++多维数组逗号索引地址【英文标题】:C++ Multi-dimensional Array Comma Index Address 【发布时间】: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 (&amp;)[3];对三个 int 的数组的引用。您在输出表达式中使用它的方式会导致转换为int * 【参考方案1】:

当您处理多维数组时,索引由逗号分隔 arr[i,j] ,逗号的行为类似于 comma operator。

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

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


要对此进行扩展,ostream operator 没有可以接受类型 Ty[] 的重载,这是最接近的 它接受的是Ty*

ostream& operator<< (void* val); 

所以这实际上意味着,Ty[] 衰减为 Ty* 然后向下转换为 void * 并调用 ostream&amp; operator&lt;&lt; (void* val),打印指针的地址


***的文章似乎不同意它应该返回一个 地址,因为它说它“等同于 A[j]”。我会很 非常感谢您对此的回答。

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

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

【讨论】:

所以,因为我使用的是多维数组,所以它得到了arr[i],它返回的地址类似于普通数组arr 的返回地址。好答案!

以上是关于C++多维数组逗号索引地址的主要内容,如果未能解决你的问题,请参考以下文章

如何选择多维数组中的逗号?

将c多维数组转换为多维c++向量

二维数组多维数组

c ++:解析包含表达式“访问多维数组”的字符串

C++ 数组与字符串⁽²²⁾|多维数组

二维数组&多维数组