C двойной указатель - PullRequest
       2

C двойной указатель

5 голосов
/ 28 апреля 2011
struct counter{
    long long counter;
}

struct instruction{
    struct counter *counter
    int repetitions;
    void (*work_fn)(long long *);
};

int ncounter; //number of counters
struct counter *counter; //counter array

int nthreads; //number of threads
int *ninstructions; //number of instructions

struct instruction **instructions; 

Как это на самом деле работает? У меня проблемы с ** указателями

Ответы [ 3 ]

10 голосов
/ 28 апреля 2011

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.

1 голос
/ 28 апреля 2011

struct instruction **instructions; // How does this actually works ? I am having trouble with ** pointers

Я не уверен, в чем реальная проблема, но я постараюсь ответить на вопрос.

Двойной указатель - это указатель на указатель. Например, его можно использовать как массив указателей (если вы соответственно выделите память). Например:

instructions = malloc(5*sizeof(struct instruction*));
for (int i = 0; i < 5; i++)
    instructions[i] = malloc(sizeof(struct instruction));

И вы получили хороший набор из 5 указателей на struct instruction. Используйте это так:

instructions[0]->repetitions = 0;
0 голосов
/ 28 апреля 2011

instructions - указатель на указатель на struct instruction.

Это означает, что *instructions даст вам указатель на struct instruction. Этот вид конструкции часто используется для создания динамического массива указателей на некоторый составной тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...