声明这样的数组时:
int array[][] = {
{1,2,3},
{4,5,6}};
Run Code Online (Sandbox Code Playgroud)
我得到一个错误说:"数组类型具有不完整的元素类型"
到底是怎么回事??
Jon*_*ler 23
使用N维数组(N> 0),您需要定义N-1维的大小; 只有一个维度可供编译器确定,它必须是第一个维度.
你可以写:
int d1[] = { ... };
int d2[][2] = { ... };
int d3[][2][3] = { ... };
Run Code Online (Sandbox Code Playgroud)
等等.
您需要指定除最高尺寸之外的所有尺寸。原因是编译器将分配一大块内存,而不是一组指向它们自己的小数组的指针数组。换句话说,
int array[][3][4] = ...;
Run Code Online (Sandbox Code Playgroud)
将分配一个大小为 3*4* 的连续内存区域(无论您在此处声明多少个 3x4 数组)。因此,稍后在您的代码中,您可以编写
array[1][2][3] = 69;
Run Code Online (Sandbox Code Playgroud)
为了找到在内存中写入 69 的位置,它从地址 (array) 开始,然后向前跳转 12*sizeof(int) 到达 array[1],加上 2*4*sizeof(int) 到达 array[ 1][2],加上 3*sizeof(int) 最终到达数组[1][2][3]的开头。与写作相比,例如,
int ***array = new int**[n];
for(i=0; i<n; i++)
{
array[i] = new int * [3];
for(j=0; j<4; j++)
array[i][j] = new int[4];
}
Run Code Online (Sandbox Code Playgroud)
(抱歉,如果我的语法不准确……自从我不得不用 C 编写这样的代码以来已经有一段时间了)。在此示例中,数组指向 n*sizeof(int**) 字节长的代码块。该数组的每个元素都指向另一个大小为 3*sizeof(int*) 字节长的数组。这些数组的每个元素都指向另一个大小为 4*sizeof(int) 字节长的数组。在这种情况下,不需要计算 array[1][2][3] 位于地址(array + some)处,而是需要跟踪内存中的几个不同的指针,然后才能找到写入 69 的位置。