Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 二维静态和动态阵列传递_C++ - Fatal编程技术网

C++ 二维静态和动态阵列传递

C++ 二维静态和动态阵列传递,c++,C++,假设我们有以下声明: int** a; int b[x][y]; 我可以实现一个函数吗 foo f(bar c) {} 这让我 f(a); f(b); 无需重载它?当然,只需使用void*:) 回答你的问题,不。多维数组和指向指针的指针不同。原因是索引方案intb[2][2]是由4个整数组成的连续内存块。索引到它相当于以下内容: b[i][j] == *(b + 2*i + j) 第二个维度是类型定义的一部分!编译器知道,由于数组的内存布局,它只需要一次解引用 同时,对于int**a索引

假设我们有以下声明:

int** a;
int b[x][y];
我可以实现一个函数吗

foo f(bar c) {}
这让我

f(a);
f(b);

无需重载它?

当然,只需使用
void*
:)

回答你的问题,不。多维数组和指向指针的指针不同。原因是索引方案
intb[2][2]
是由4个整数组成的连续内存块。索引到它相当于以下内容:

b[i][j] == *(b + 2*i + j)
第二个维度是类型定义的一部分!编译器知道,由于数组的内存布局,它只需要一次解引用

同时,对于
int**a
索引如下:

a[i][j] == *(*(a+i)+j)

你可以使用一个有两个转换构造函数的类型:p,这会破坏点,但它不会重载该函数。我认为如果你理解编译器为多维数组引用生成的代码,你可以自己回答这个问题。对于b[i][j],编译器生成(b+iy+j)(或者可能是(b+jx+i),我永远不记得了)。无论哪种方式,函数f()都不知道b[][]的维数,因此无法正确处理对c[i][j]的引用。这两种类型不兼容,因此不能。我们真的需要具有危险误导性的第一行吗?@LightnessRacesinOrbit,它真的具有误导性吗?我想这说明了一点,除非你想放弃所有的类型信息,否则你不能按照OP的要求去做。