为什么在声明多维数组时允许省略第一维,而不是其他维?

时间:2015-10-25 09:47:57

标签: c++ c arrays multidimensional-array

为什么没有必要提及多维数组的第一维,并且必须提及其他维度:

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 

我无法理解这背后的概念或逻辑。

3 个答案:

答案 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];
}