为什么没有必要提及多维数组的第一维,并且必须提及其他维度:
int A[][][2]={{{1,2},{3,4}},{{4,5},{5,6}}}; // error
int A[][2][2]={{{1,2},{3,4}},{{4,5},{5,6}}}; // OK
我无法理解这背后的概念或逻辑。
答案 0 :(得分:5)
因为在使用多维数组时,计算实际索引会使用除第一个之外的所有维度。例如,对于声明为int arr[3][4][5];
的3D数组,arr[i][j][k]
根据定义为 *(&(arr[0][0][0]) + k + 5 *(j + 4 * i))
因此,当第一个维度可以从上下文初始化推导出来时,或者可以忽略(在函数中获取参数时),可以省略它。
示例:
int arr[][2] = { 1,2,3,4 };
void setArr(void *container, int arr[][4]);
答案 1 :(得分:4)
有必要提及2D数组的两个维度,除非它在函数的参数中或者如果存在初始化器,则可以省略第一维。
用作函数中的参数时,例如
int 2D_arr[m][n]
转换为
int (*2D_arr)[n]
因此,可以省略第一维。但是,第二维必须在那里告诉编译器指针2D_arr
是指向 n
整数数组的指针。
在第二种情况下,当存在初始化器时
int A[][2][2]={{{1,2},{3,4}},{{4,5},{5,6}}};
编译器使用初始化程序的长度来计算第一个维度。必须在声明时明确指定维度的其余部分。
答案 2 :(得分:1)
如果以静态方式声明2D数组......
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet"/>
<div class="container">
<div class="row">
<div class=col-md-4>
<div class="jumbotron">
Some element
</div>
</div>
<div class=col-md-4>
<div class="jumbotron">
Some element
</div>
</div>
<div class=col-md-4>
<div class="jumbotron">
Some element
</div>
</div>
<div class=col-md-4>
<div class="jumbotron">
Some element
</div>
</div>
<div class=col-md-4>
<div class="jumbotron">
Some element
</div>
</div>
<div class=col-md-4>
<div class="jumbotron">
Some element
</div>
</div>
<div class=col-md-4>
<div class="jumbotron">
Some element
</div>
</div>
<div class=col-md-4>
<div class="jumbotron">
Some element
</div>
</div>
<div class=col-md-4>
<div class="jumbotron">
Some element
</div>
</div>
<div class=col-md-4>
<div class="jumbotron">
Some element
</div>
</div>
<div class=col-md-4>
<div class="jumbotron">
Some element
</div>
</div>
<div class=col-md-4>
<div class="jumbotron">
Some element
</div>
</div>
<div class=col-md-4>
<div class="jumbotron">
Some element
</div>
</div>
<div class=col-md-4>
<div class="jumbotron">
Some element
</div>
</div>
<div class=col-md-4>
<div class="jumbotron">
Some element
</div>
</div>
<div class=col-md-4>
<div class="jumbotron">
Some element
</div>
</div>
<div class=col-md-4>
<div class="jumbotron">
Some element
</div>
</div>
<div class=col-md-4>
<div class="jumbotron">
Some element
</div>
</div>
<div class=col-md-4>
<div class="jumbotron">
Some element
</div>
</div>
</div>
</div>
......那么它的两个维度是显而易见的。
如果以动态方式声明2D数组,或者指向指针......
int arr[3][4];
...看起来好像在分配期间只提到了一个维度,但这是因为首先分配行然后分配每个列。获取或设置元素时,您可以像往常一样指定两个维度...
int r = 3, c = 4;
int** arr = new int*[r];
for (int i = 0; i < r; i++) {
arr[i] = new int[c];
}