Кто-нибудь может объяснить, как printf печатает привет в следующем?
#include<stdio.h>
void main()
{
char *p;
p="hello";
printf("%s",*&*&p);
}
Я знаю это *&p … означает значение в p, то есть адрес строки «hello». Что происходит в начальном *&
Как вы сказали, *&p
средства p
, это означает последовательный *
а также &
отменяет следовательно *&*&p
становится p
тоже.
И как @Kerrek сказал (в комментарии), что *&p
выдает lvalue, поэтому вы берете его адрес снова.
Обратите внимание, что ваш код не соответствует стандарту. main()
должен иметь int
как тип возврата. И вы не можете назначить "hello"
к неконстантная char*
, Это должно быть const char*
, Стандартный соответствующий код будет следующим:
#include<stdio.h>
int main()
{
const char *p = "hello";
printf("%s",*&*&p);
}
&p
это адрес p
,
*p
на что указывает адрес? p
,
*&p
является *(&p)
вещь, на которую указывает адрес &p
— который p
сама (то есть вещь, на которую указывает адрес «адрес р»).
Таким образом, получается, что *&p
просто p
— *&
уничтожить друг друга. Вы можете повторить это: *&*&p
все еще будет p
, Вы можете сделать это до бесконечности: *&*&*&*&*&*&*&*&*&p
также будет p
,
«*&отменяет друг друга. Вы получаете адрес p, а затем снова разыменовываете его. Таким образом, конечный результат будет просто р.