Массив указателей в target-c - PullRequest
1 голос
/ 31 марта 2010

Меня смущают указатели в target-c.

В основном в моем коде куча статических данных.

static int dataSet0[2][2] = {{0, 1}, {2, 3}};
static int dataSet1[2][2] = {{4, 5}, {6, 7}};

И я хочу иметь массив для индексации всего этого.

dataSets[0]; //Would give me dataSet0...

Каким должен быть тип наборов данных и как его инициализировать?

Ответы [ 4 ]

3 голосов
/ 31 марта 2010

Хотя он размещен в памяти одинаково, указатель на многомерный массив отличается от указателя на плоский массив. Компилятор должен преобразовать индекс [] [] в индекс плоского массива для любых многомерных массивов. Не могу смешать два или различие для компилятора потеряно. Вы можете использовать все плоские массивы:

  static int dataSet00[2] = {0,1};
  static int dataSet01[2] = {2,3};
  static int * dataSet0[2] = {dataSet00, dataSet01};

  static int dataSet10[2] = {4, 5};
  static int dataSet11[2] = {6, 7};
  static int * dataSet1[2] = {dataSet10, dataSet11};

  static int ** dataSets[2] = {dataSet0, dataSet1};

или один большой многомерный массив:

  static int dataSets[2][2][2] = {{{0,1},{2,3}},{{4,5},{6,7}}};

но не комбинация двух, если вы не укажете компилятор, объявив специальный тип данных в соответствии с предложением Джона.

3 голосов
/ 31 марта 2010

Указатели на многомерные массивы могут быть хитрыми. Typedef может помочь:

typedef int (*DataSetType)[2];
DataSetType dataSets[] = { dataSet0, dataSet1 /* and so on*/ };
3 голосов
/ 31 марта 2010

Вы можете использовать NSPointerArray.

1 голос
/ 31 марта 2010

Ваш индексный массив будет массивом указателей на указатели на int.

Таким образом, объявление будет выглядеть так:

int ** dataset[numOfDataSets] = {dataSet0, dataSet1, ...}

Помните, что target-c - это надлежащая надмножество ansi-c, и этот вопрос, в частности, касается языка c, на самом деле.

Edit: важно помнить, что в C массивы по сути являются просто указателями, а двумерные массивы являются указателями на указатели.

Редактировать 2: Я думаю, что действовать на самом деле я заглушил приоритет оператора. Должно быть:

int (** dataset)[numOfDataSets] = {dataSet0, dataSet1, ...}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...