То, когда мы говорим о, разыменовывают, является этим необходимый это *
должен использоваться в нем? Если мы получаем доступ к референту указателя некоторым другим способом, может он рассматриваться как разыменование указателя или нет, как:
char *ptr = "abc" ;
printf( "%c" , *ptr ); // Here pointer is dereferenced.
printf( "%s" , ptr ); // What about this one?
Это - первая часть моего вопроса.
Теперь, если printf( "%s" , ptr )
пример разыменования затем доброжелательного ответа следующая часть моего вопроса также.
K&R говорит
"указатель на пустоту" используется для содержания любого типа указателя, но не может быть разыменован самого
Следовательно,
char a = 'c' ;
char *p = &a ;
void *k = &a;
printf( "\n%c\n" , *p );
printf( "\n%c\n" , *k );
Не компилирует, компилятор дает ошибку
В 'основной' функции: предупреждение: разыменование ‘пусто *’ ошибка указателя: недопустимое использование пустого выражения
Но если мы используем
char *a = "c" ;
char *p = a ;
void *k = a;
printf( "\n%c\n" , *p );
printf( "\n%s\n" , k );
Это компилирует и работает. То, что означает, что пустой указатель может быть разыменован - у нас есть объектный указатель, относится к.
Если это так, затем, что делает вышеупомянутые средства кавычки K&R в этом контексте?
Спасибо за внимание.
Нет. у вас есть «неопределенное поведение» - стандарт языка C не говорит, что должно произойти. В вашем случае он «работает», но для другого пользователя / компилятора / платформы может и не работать. Ваше утверждение:
printf( "\n%s\n" , k );
эквивалентно:
int k = 42;
printf( "\n%s\n" , k );
и также не определено.