Зубчатые массивы существуют в C/C++?

Если бы основной метод не был бы статичен, необходимо было бы создать объект основного класса снаружи программы. Как Вы хотели бы сделать это?

28
задан Sam 1 September 2014 в 18:02
поделиться

6 ответов

В CI будет использоваться массив указателей.

Например:

int *jagged[5];

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

и т. Д. И т. Д.

24
ответ дан 28 November 2019 в 02:39
поделиться

Есть несколько способов сделать это. Вот другой способ:

int jagged_row0[] = {0,1};
int jagged_row1[] = {1,2,3};
int *jagged[] = { jagged_row0, jagged_row1 };
16
ответ дан 28 November 2019 в 02:39
поделиться

Если вы просто хотите его инициализировать, вы можете сказать:

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

, но массив все равно будет иметь форму [2] [3]. Если вам нужен настоящий массив с зазубринами, вам придется создавать его динамически. И если вы это сделаете и используете C ++, вы должны использовать std :: vector , как предлагает friol.

14
ответ дан 28 November 2019 в 02:39
поделиться

В 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] и т. д.

12
ответ дан 28 November 2019 в 02:39
поделиться

In C99 you can do the following:

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} };  

The only difference here (as compared to rampion's answer) is that the arrays don't decay to pointers and one has to access the individual arrays via another level of indirection - (e.g. *jagged[0] - and the size of each row has to be recorded - i.e. sizeof(*jagged[0]) will not compile) - but they're jagged-appearing to the bone ;)

4
ответ дан 28 November 2019 в 02:39
поделиться

Причина, по которой вы получили ошибку, заключается в том, что вы должны указать границы, по крайней мере, для внешнего измерения; т.е.

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

Вы не можете сделать jagged [0] двухэлементным массивом int, а jagged [1] - трехэлементным массивом int; N-элементный массив - это тип, отличный от M-элементного массива (где N! = M), и все элементы массива должны быть одного типа.

То, что вы можете сделать, - это то, что другие предлагали выше, и создать зазубренный массив указателей на int; таким образом каждый элемент может указывать на целочисленные массивы разных размеров:

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

Несмотря на то, что row0 и row1 относятся к разным типам (двухэлементные и трехэлементные массивы int), в контексте инициализатора они оба неявно преобразуются в того же типа (int *).

3
ответ дан 28 November 2019 в 02:39
поделиться