объяснить указатели на указатели

Я новичок в C, и я пытаюсь схватить указатели. Я натолкнулся на это выражение

char *foo = *(char **)bar; 

что именно происходит? Я понимаю, что * является указателем ** является указателем на указатель, но я действительно не понимаю, что такое *(char **)bar

edit: стоит упомянуть, что bar объявляется как const void * bar

Начинающие и эксперты могут извлечь выгоду из того, чтобы основы были действительно прочными.

  • « Переменная типа t» – это место хранения, которое может использоваться для хранения или получения значения типа t.
  • « Указатель на t» – это значение .
  • Применение оператора разыменования * к «указателю на t» создает «переменную типа t».

Итак, что у нас получилось?

 void *bar = whatever; char *foo = *(char **)bar; 
  • bar – переменная типа «указатель на void».
  • foo – это переменная типа «указатель на символ».
  • casting bar to char** читает переменную bar и извлекает значение типа «pointer to void». Затем это значение преобразуется в значение типа «указатель на указатель на символ».
  • Выделение этого значения создает переменную типа «указатель на символ».
  • Затем извлекается значение этой переменной, а значение присваивается переменной foo .

Имеют смысл?

 *(char**)bar; 

Нарисуйте указатель на указатель на char и разыменовывайте, что приводит к указателю на char (т. char* ).

Помните, что указатели – всего лишь косвенные. Когда вы разыскиваете указатель, вы «бросаете звезду», то есть:

 char ***p = ...; p -> char*** *p -> char** **p -> char* ***p -> char 

Я не знаю, какой тип bar без броска, но здесь идет:

bar вставляется в указатель на указатель на char .

* Перед (char **) «разыгрывает» значение справа. В этом случае он возвращает указатель char * удерживаемый в указателе местоположения по bar .

Результатом «разыменования» является char * – указатель на символ, который присваивается переменной foo того же типа.