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

时间:2015-04-29 02:48:30

标签: c++ arrays multidimensional-array comma

在玩多维数组时,我发现如果我使用逗号分隔索引,它会返回数组中元素的地址,而忽略第一个逗号。这由以下示例显示:

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 ++中逗号运算符的Wikipedia article同意这个跳过:

  

在Pascal中,使用逗号对多维数组进行索引,例如: A[i, j]。但是,在C中,A[i, j]相当于A[j],因为i的值被丢弃。在C中索引多维数组的正确方法是使用类似A[i][j]的结构。

我唯一的问题是:为什么会返回一个地址?我试图找到这背后的原因,但是完全被难倒了。维基百科的文章似乎不同意它应该返回一个地址,因为它表示它等同于A[j]&#34;。我非常感谢你对此的回答。提前谢谢!

1 个答案:

答案 0 :(得分:4)

当您处理多维数组时,索引用逗号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& operator<< (void* val)并调用   int arr[3]; std::cout << arr << std::endl; ,它打印指针的地址

  

维基百科的文章似乎不同意它应该返回一个   地址,因为它表示它等于A [j]&#34;。我会的   非常感谢这个答案。

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

var Promise = require('bluebird'),
    mongodb = Promise.promisifyAll(require('mongodb'));