为什么在声明多维数组时允许省略第一个维度,而不允许省略其他维度?
Why is it allowed to omit the first dimension, but not the other dimensions when declaring a multi-dimensional 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
我不能理解这背后的概念或逻辑
有必要提及二维数组的两个维度,除非它是在函数的形参中,或者如果存在初始化式,则可以省略第一个维度。
当用作函数的参数时,例如
int 2D_arr[m][n]
转换为
int (*2D_arr)[n]
因此,第一维可以省略。但是,必须有第二个维度来告诉编译器指针2D_arr
是指向的指针,是n
int 的数组。
第二种情况,当存在初始化式时
int A[][2][2]={{{1,2},{3,4}},{{4,5},{5,6}}};
编译器只使用初始化式的长度来计算第一个维度。维度的其余部分必须在声明时显式指定。
因为在使用多维数组时,计算实际索引使用除了第一个维度之外的所有维度大小。例如,对于声明为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]);
如果你以静态方式声明一个2D数组…
int arr[3][4];
…那么它的二维性是显而易见的。
如果以动态方式声明2D数组,或者作为指针指向指针的指针…
int r = 3, c = 4;
int** arr = new int*[r];
for (int i = 0; i < r; i++) {
arr[i] = new int[c];
}
…看起来好像在分配过程中只提到了一个维度,但那是因为首先分配了行,然后分配了列。当获取或设置元素时,像往常一样指定两个维度…
num = arr[1][2];
arr[1][2] = num;
相关文章:
- 错误:在第 6 行'{'标记之前,此处不允许使用函数定义
- error dllimport 函数的定义不允许在一个特定的联合中,而其他类、结构和联合将按预期导出
- 查找不在标准中的第一个值::设置<int>最小-最大值
- C++:为什么允许在另一个函数中声明函数,而不允许在函数定义中声明?
- C++去除前x个元素的有效方法,在不改变向量大小的情况下将第x+1个元素推到第一个
- C++第一个cout将不会打印
- OpenGL 2D游戏只绘制第二个精灵纹理而不是第一个
- 我在代码中有一个错误,错误是:(智能感知:不允许抽象类类型"HourlyWorker"的对象:)
- 是否可以从另一个类对象调用一个类函数而不继承第一个类
- 将参数初始化为构造函数,而不是第一个
- 获取不等于特定值的向量的第一个N元素
- 当一长串字符传递给第一个 cin 时,为什么不暂停第二个 cin 上的输入?
- 第一个C 库:我不确定在哪里参考并声明我的变量
- 为什么不允许将右值引用绑定到非常数引用,而允许在其中一个上调用非常数成员函数
- C++ 不允许我在以前工作后通过引用将 vector 传递给另一个函数
- 将读锁定升级为写锁定,而不在 C++11 中释放第一个
- 我在第一个 switch 语句中找不到错误
- 如何允许用户在opengl中缩放一个对象而不缩放另一个对象
- 当我超过第一个 getline() 的输入中的数组大小时,第二个 getline 或其他输入函数不起作用
- C++ 入门 1.4.4.不太理解第一个IF语句的必要性