Я новичок в C, и я пытаюсь схватить указатели. Я натолкнулся на это выражение
char *foo = *(char **)bar;
что именно происходит? Я понимаю, что * является указателем ** является указателем на указатель, но я действительно не понимаю, что такое *(char **)bar
edit: стоит упомянуть, что bar объявляется как const void * bar
Начинающие и эксперты могут извлечь выгоду из того, чтобы основы были действительно прочными.
*
к «указателю на t» создает «переменную типа t». Итак, что у нас получилось?
void *bar = whatever; char *foo = *(char **)bar;
bar
– переменная типа «указатель на void». foo
– это переменная типа «указатель на символ». 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
того же типа.