Как получить доступ к данным по указателю? - PullRequest
0 голосов
/ 26 января 2019

Я пытаюсь изучить C и испытываю проблемы с доступом к данным из указателя данных.

У меня есть пример кода:

// character array for string
char mystring[] = "Hello";

// store mystring's pointer
int p = *mystring;

printf("String to pointer is %d\n":, p);
>> String to pointer is: 1819043144

// trying to access data from pointer p
printf("%s",&p);
>> H

Почему это просто "H""просто распечатать, когда я пытаюсь получить доступ к данным из указателя р с помощью оператора &?

1 Ответ

0 голосов
/ 26 января 2019

Выражение &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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...