вопрос двойного указателя в C (один указатель для следующего, но двойной указатель для пред.) - PullRequest
1 голос
/ 27 мая 2011

В коде table.h для mysql. Есть следующий код

typedef struct st_table_share  
{
    ...  
    struct st_table_share * next,       /* Link to unused shares */  
      **prev;  

в учебнике у нас обычно

sometype *next, *prev;

но здесь используется **prev вместо *prev. В чем причина использовать двойной указатель для prev?

Ответы [ 2 ]

5 голосов
/ 27 мая 2011

Он не указывает на предыдущую структуру, как следующая, он указывает на указатель, который указывает на эту структуру.

Преимущество этого состоит в том, что он может указывать либо на «следующий» элемент предыдущей структуры, либо он может указывать на сам фактический указатель головы - в случае, когда это первый элемент в списке. Это означает, что удаление элемента включает «* prev = next» в обоих случаях - нет особого случая для обновления указателя головы.

Недостатком является то, что вы не можете (легко) использовать его для обхода конструкции назад; поэтому он действительно предназначен для оптимизации случая, когда вы заботитесь только о переходе вперед, но хотите легко удалить произвольный узел.

0 голосов
/ 27 мая 2011

это не «двойной указатель», как вы упоминаете. скорее это называется «разыменование».

int x = 10;
int* prev = &x;

* prev - адрес переменной x.

теперь допустим, что вам нужно передать адрес переменной указателя prev другой функции с именем foo, которая принимает адрес указателя в качестве своего параметра (указатель на указатель).

void function foo(int** ptr)
{
   prinft("%p", ptr); //this would print the address of prev

   printf("%p", *ptr); //this would print the value (the address of x) contained inside address contained inside ptr.

   printf("%d", **ptr); //this would print the value (the value of x, 10) contained at the address(address of x) contained inside address (address of prev) contained inside ptr 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...