在C/C++中传递multidimesional数组

MTV*_*TVS 4 c c++ arrays

为什么在C/C++中,接收MD arr的func param需要具有所有子数组/维度的大小?

这里(PDF):它说MD arrs的唯一区别是"编译器会记住每个想象的维度"但是当我违反这些维度时,编译器什么都不做,例如:

char arr[3][5];
arr[0][5] = 10;
Run Code Online (Sandbox Code Playgroud)

那么,记住那些尺寸有什么意义呢?

Who*_*aig 7

对数组的索引访问必须基于索引值声明的较低维度以行 - 主顺序计算内存偏移计算.更多关于这一点.

但首先,你的问题与这个简单的观察紧密相关:

void foo( char a[] )
{
    a[5] = 'a';
}

// caller of foo() from somewhere
char arr[5];
foo(arr);
Run Code Online (Sandbox Code Playgroud)

为什么编译器让你做?因为这是C,你完全有权利用未定义的行为射击自己的脚.记住这一点:

void foo( char a[][5] )
{
    a[0][5] = 'a';
}

// caller of foo() from somewhere
char arr[4][5];
foo(arr);
Run Code Online (Sandbox Code Playgroud)

它与先前的代码一样"有效"(即您有权进入UB,风险和风险).在这种情况下,它将"工作",但仅仅因为底层数组的线性背景是二十个元素宽,我们只访问第六个元素,这在技术上arr[1][0].

这些劣质尺寸的目的是要正确计算像访问:

void foo( char a[][5] )
{
    a[2][1] = 'b';
}
Run Code Online (Sandbox Code Playgroud)

2优良指数必须使用声明下尺寸(在这种情况下5)有效地计算线性适当元素的偏移量.在一维线性块中布置2D数组,它用于执行此操作:

char arr[20]; // 4*5
arr[2*5+1] = 'b';
Run Code Online (Sandbox Code Playgroud)

请注意5.必须知道声明的劣等维度,才能正确计算行间距(词性).

我希望这至少让它更清晰一些.

我应该注意这种化合物.即,以下内容:

char arr[3][4][5];
arr[1][2][3] = 'c';
Run Code Online (Sandbox Code Playgroud)

有效地计算基础数组的线性背景下的正确位置:

char arr[60]; // 3*4*5
arr[ 1*(4*5) + 2*(5) + 3 ] = 'c';
Run Code Online (Sandbox Code Playgroud)

等等.把它带到你想要的那么多尺寸.必须知道所有较低的尺寸才能正确地做到这一点.