C / C ++中是否存在锯齿状的数组?

在C或C ++中是否有这样一个锯齿状的数组?

当我编译这个:

int jagged[][] = { {0,1}, {1,2,3} }; 

我得到这个错误:

错误:作为multidimensional array的“锯齿”声明必须对除第一个以外的所有维都有界限

在CI中会使用一个指针数组。

例如:

 int *jagged[5]; jagged[0] = malloc(sizeof(int) * 10); jagged[1] = malloc(sizeof(int) * 3); 

等等

有很多方法可以做到这一点。 这是另一种方式:

 int jagged_row0[] = {0,1}; int jagged_row1[] = {1,2,3}; int *jagged[] = { jagged_row0, jagged_row1 }; 

如果你只是想初始化它,你可以说:

 int jagged[][3] = { {0,1}, {1,2,3} }; 

但数组仍然具有[2] [3]的形状。 如果你想要一个真正的参差不齐的数组,你将不得不dynamic创build它。 如果你这样做,并正在使用C ++,你应该使用std::vector ,正如friol所build议的那样。

C ++ (不编译,可能有一个更紧凑的语法):

 std::vector<std::vector<int> > myArray; myArray.push_back(std::vector<int>()); myArray.push_back(std::vector<int>()); myArray[0].push_back(0); myArray[0].push_back(1); myArray[1].push_back(1); myArray[1].push_back(2); myArray[1].push_back(3); 

所以现在你可以访问元素,例如myArray [0] [0]等

你得到这个错误的原因是你必须指定至less外部尺寸的边界; 即

 int jagged[][3] = {{0,1},{1,2,3}}; 

你不能有锯齿[0]是一个2元素的int和参差不齐的数组[1]是一个3元素的int数组; N元素数组与M元素数组(其中N!= M)是不同的types,并且数组的所有元素都必须是相同的types。

可以做的是其他人在上面提出的build议,并创build一个int指针数组锯齿状; 这样每个元素可以指向不同大小的整数数组:

 int row0[] = {0,1}; int row1[] = {1,2,3}; int *jagged[] = {row0, row1}; 

即使row0和row1是不同的types(int的2元素和3元素数组),在初始化器的上下文中,它们都被隐式转换为相同的types(int *)。

在C99中,您可以执行以下操作:

 int jagged_row0[] = {0,1}; int jagged_row1[] = {1,2,3}; int (*jagged[])[] = { &jagged_row0, &jagged_row1 }; // note the ampersand // also since compound literals are lvalues ... int (*jagged2[])[] = { &(int[]){0,1}, &(int[]){1,2,3} }; 

这里唯一的区别(与rampion的答案相比)是数组不会衰减到指针,并且必须通过另一个间接级别访问单个数组(例如*jagged[0] ,并且每行的大小被logging – 即sizeof(*jagged[0])将不会编译) – 但他们是锯齿状的骨头;)

用C ++ 11初始化器列表可以更简洁地编写:

 #include <vector> #include <iostream> int main() { // declare and initialize array std::vector<std::vector<int>> arr = {{1,2,3}, {4,5}}; // print content of array for (auto row : arr) { for (auto col : row) std::cout << col << " "; std::cout << "\n"; } } 

输出是:

 $ g++ test.cc -std=c++11 && ./a.out 1 2 3 4 5 

以供参考: