Символьный указатель и массив - PullRequest
1 голос
/ 14 февраля 2011

Фрагмент кода:

char c[]="gate2011";
char *p=c;
printf("%s",p+p[3]-p[1]);

Вывод: 2011

Может кто-нибудь объяснить, как это произошло?----

Ответы [ 3 ]

3 голосов
/ 14 февраля 2011

Пройдя каждую строку по очереди:

 char c[] = "gate2011";

Предположим, что массив c расположен по адресу памяти 200.

 char *p = c;

p теперь является указателем на c.Поэтому он указывает на адрес памяти 200. Фактическое содержимое p равно 200, что указывает адрес памяти.

  printf("%s", p + p[3] - p[1]);

Значение p равно 200, когда мы рассматриваем его как указатель.Тем не менее, мы также можем рассматривать это как массив.p [3] получает значение 4-го элемента в строке, который является «е».C хранит символы как их значение ASCII.ASCII-значение "e" равно 101.

Далее мы получаем значение p [1].p [1] == "a", значение ASCII которого равно 97. Подставляя их в функцию:

  printf("%s", 200 + 101 - 97);

, что оценивается как

  printf("%s", 204);

По адресу памяти 204У нас есть строка «2011».Поэтому программа печатает «2011».

2 голосов
/ 14 февраля 2011

Я не уверен, почему вы хотите сделать что-то подобное, но в любом случае, это то, что происходит.

p + p[3] - p[1]

Здесь вы берете значение одного указателя и добавляете значениесимвола в позиции 3, а затем вычитает значение символа в позиции 1. Значения символов неявно преобразуются в числовые значения перед выполнением сложения и вычитания.

Если p - это местоположение 1000, тосумма 1000 + 101 (ASCII для e) - 97 (ASCII для a).Следовательно, результатом является указатель на местоположение 1004 в памяти.% S в printf затем подставляет строку, начинающуюся в этом месте и заканчивающуюся специальным символом '\ 0'.Таким образом, строка фактически обрезается до "2011" (первые 4 буквы пропущены, потому что 101 - 97 = 4).

Если это все еще не имеет смысла, я бы посоветовал вам внимательно посмотреть накак работают массивы в Си.

0 голосов
/ 14 февраля 2011

Чего ты ожидал?Почему бы и нет?

p [3] -p [1] = 'e' - 'a' = 4
p + 4 = "2011"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...