С struct list_t* list
, тогда list
является указателем на list_t
.
С struct list_t** list
, тогда list
является указателем на указатель на list_t
.
Если у вас есть, например,
list_t* my_list;
затем my_list
- указатель на list_t
. Если затем вы используете адрес оператора &
, чтобы получить указатель на my_list
(как в &my_list
), то вы получите указатель на указатель на list_t
, то есть list_t**
.
Использование указателей на указатели заключается в эмуляции передачи по ссылке в C, которая имеет только передачу по значению. Как вы говорите, если у вас есть указатель на указатель, то вы можете разыменовать его и заставить указатель куда-то еще. С простым указателем, он передается по значению, а значение копируется в переменную аргумента. Изменение копии не приведет к изменению оригинала.