Когда мы говорим о разыменовании, необходимо ли в нем использовать *
? Если доступ к референта указателя каким-либо другим способом, это может рассматриваться как разыменования указателя или нет, как:Почему printf ("% s", ptr) способен разыменовывать пустоту *?
char *ptr = "abc" ;
printf("%c" , *ptr); // Here pointer is dereferenced.
printf("%s" , ptr); // What about this one?
То есть первая часть моего вопроса.
Теперь, если printf("%s" , ptr)
является примером разыменования, то любезно ответьте на следующую часть моего вопроса.
K & R говорит
a "pointer to void" is used to hold any type of pointer but cannot be dereferenced itself
Следовательно,
char a = 'c' ;
char *p = &a ;
void *k = &a;
printf("\n%c\n" , *p);
printf("\n%c\n" , *k);
не компилируется, компилятор дает ошибку
In function ‘main’: warning: dereferencing ‘void *’ pointer error: invalid use of void expression
Но если мы используем
char *a = "c" ;
char *p = a ;
void *k = a;
printf("\n%c\n" , *p);
printf("\n%s\n" , k);
Он компилируется и работает. Это означает, что указатель void может быть разыменован - у нас есть указатель на объект.
Если это так, то что делает K & R вышеупомянутых цитат означает в этом контексте?
Спасибо за ваше время.
Я не вижу, где вы разыскиваете 'void *' успешно. Пожалуйста, перечитайте свой код. – leppie