Выражение &p
не имеет ничего общего с mystring
.p
является целочисленной переменной, а &p
является адресом этой переменной.
int p = *mystring;
эквивалентно:
int p;
p = *mystring;
*mystring
является первым элементомmystring
массив, который является символом 'H'
.Таким образом, это эквивалентно:
int p = 'H';
Ваша инициализация переменной просто делает копию первого символа mystring
и помещает ее в p
.Он также преобразует его из char
в int
.
. При попытке печати p
в формате %s
вы вызываете неопределенное поведение, поскольку %s
требует соответствующий аргумент длябыть указателем на строку с нулевым символом в конце, и вы дали ей указатель на int
.
Сравните ваш код с этим:
int *p = mystring;
printf("%s", p);
Это ближе к правильномупотому что теперь p
является указателем, и он указывает на строку.Это не копия чего-либо.Но это все еще неверно, потому что аргумент для %s
должен быть char *
, а не int *
.Поэтому вам нужно преобразовать его:
printf("%s", (char *)p);
Но наиболее правильный способ сделать это - объявить p
как правильный тип указателя в первую очередь:
char *p = mystring;
printf("%s", p);