Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.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++_C_Function_Multidimensional Array - Fatal编程技术网

C++ 数组的奇异参数恢复

C++ 数组的奇异参数恢复,c++,c,function,multidimensional-array,C++,C,Function,Multidimensional Array,我试图理解一些将多维数组传递给函数的代码。但是这个函数的原型引起了我的兴趣 程序将创建此“tab”变量: #define N 8 float tab[N][N]; tab[0][0] = 2; tab[0][1] = 3; tab[0][2] = -1; tab[1][0] = 3; tab[1][1] = 1; tab[1][2] = -4; tab[2][0] = 1; tab[2][1] = 2; tab[2][2] = 3; hello(tab); 我们有这个功能: functio

我试图理解一些将多维数组传递给函数的代码。但是这个函数的原型引起了我的兴趣

程序将创建此“tab”变量:

#define N 8

float tab[N][N];
tab[0][0] = 2; tab[0][1] = 3; tab[0][2] = -1;
tab[1][0] = 3; tab[1][1] = 1; tab[1][2] = -4;
tab[2][0] = 1; tab[2][1] = 2; tab[2][2] =  3;
hello(tab);
我们有这个功能:

function hello(float mat[][N]) {
我不明白为什么hello函数得到的tab变量是空的[],然后是[N]。它改变了什么?我不明白。。。为什么不使用tab[][]

代码似乎是由一个优秀的开发人员编写的,所以我不认为N变量是无缘无故出现在这里的

如果你能给我解释一下,谢谢你的时间


让我解释一下“非技术性”,但可能比较全面:

float tab[ROW][COL]
看作一个二维浮点数数组,其中“ROW”代表行,“COL”代表列,并将该数组映射到一个完整的内存行,即

r0c0,r0c1,r0c2
r1c0,r1c1,r1c2
r2c0,r2c1,r2c2
对于
行=3
列=3
。然后,如果编译器必须找出在何处写入
选项卡[2][1]
,则必须采用行大小的2倍+1(其中行大小实际上是列数
COL
)。因此,对单元格进行寻址时,需要知道行的大小,而在行中只需添加列索引。因此,像
tab[][N]
这样的声明就足够了,因为
N
定义了列的数量,即行的大小,并允许编译器正确地寻址每个单元格

希望能有所帮助

float tab[N][N];
通过
N
定义
N
的数组。我不打算使用行或列,因为数组如何面向程序逻辑可能与数组在内存中的表示方式无关。只需知道它将是一个N*N长的内存块,可以使用
mat[0..N-1][0..N-1]
访问。尺寸已知且恒定。定义数组时,它必须知道其大小,并且此大小不能更改。如果不知道大小,请使用
std::vector
std::vector

是非法的,因为数组的大小未知。编译器不知道要为数组分配多少存储空间,也无法生成功能性(即使有缺陷)程序

将数组传递给函数时,例如

function hello(float mat[][N])
数组衰减为指针。更多信息:一旦数组衰减,第一个维度的大小将丢失。要安全地使用数组,您必须已经知道数组的大小,或者将其作为另一个参数提供。例如:

function hello(float mat[][N], size_t matLen)
有疑问的是,大小为
N
。你知道这是
N
,你可以放心地打电话

hello(mat);
不提供任何大小调整,只需在函数内部使用
N
作为边界。N不是一个迂回的名称,但可以给它一个更具描述性的名称

你也可以是完全明确的

function hello(float mat[N][N])

并消除任何歧义,以及将函数用于大小为M×N的数组的能力。有时这是一个值得权衡的问题。

大约一半的答案在这里:。从中你可以推断出第二部分:当数组衰减时,第一维度的大小丢失。我应该重写我的评论。大小不一定会丢失。它可能会被丢弃
float mat[][N]
选择放弃并成为指向未知数量长度数组的指针
N
@user4581301谢谢您的回答。你提供给我的答案对我来说有点高。我认为数组的第一维包含第二维每个冒号的起始点的地址。如果我失去了第一维度的大小,那么我如何才能安全地到达第二维度而不脱离数组并进行分段呢@user4581301好的,但它不会改变,如果我不能安全地访问第一个维度,我也不能访问第二个维度?假设你是编译器,看到
void hello(float mat[]]){use(mat[1][1]);}
如何计算
mat[1][1]的内存位置
如果您不知道该数组有多少列?谢谢您的回答。如果我做对了,编译器不需要在第一个[]中传递多少行的信息!好啊所以它不会改变数组的任何内容?这只是一种简化?@医生:是的,它不会改变数组的内容。如果是简化或抽象,我不能说:如果类型是
tab[][N]
,则可以传入具有
N
列的任何数组,而不管此数组有多少行。如果类型为
tab[R][C]
,则您只需传入带有
C
列和
R
行的数组即可。此参数声明float*mat[N],并不等同于float mat[][N],@vladfrom。事实并非如此。我做了一些完全错误的事情。谢谢你的回答。我现在明白了。它只是编译器工作的最小符号!
function hello(float mat[N][N])