Пройдя каждую строку по очереди:
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».