A **
- это просто указатель на указатель. Таким образом, если instruction*
содержит адрес структуры instruction
, instruction**
содержит адрес instruction*
, который содержит адрес объекта instruction
.
Чтобы получить доступ к instruction
, на который указывает указатель, на который указывает instruction**
, вы просто используете две звездочки вместо одной, например (**p).repetitions
или что-то подобное.
Вы можете визуализировать это так:
instruction* ----> instruction
instruction** ----> instruction* ----> instruction
Помните, однако, что простое объявление struct instruction** instructions;
на самом деле не создает структуру instruction
. Он просто создает указатель, который содержит значение мусора. Вам придется инициализировать его:
struct instruction inst;
// set members of inst...
*instructions = &inst;
...
(*instructions)->repetitions++; // or whatever
Однако похоже, что вы используете instruction**
для указания массива instruction*
s. Для инициализации массива вам необходим цикл for
:
instructions = malloc(sizeof(struct instruction*) * num_of_arrays);
for (i = 0; i < num_of_arrays; ++i)
instructions[i] = malloc(sizeof(struct instruction) * size_of_each_subarray);
И тогда вы можете получить доступ к элементу, как instructions[i]->datamember
.