Позволяет делать эту строку построчно:
print_reverse("Hello");
void print_reverse(char *s)
Теперь s
указывает на строку, содержащую:
- - ----+----+----+----+----+----+----+---- - -
| H | e | l | l | o | \0 |
- - ----+----+----+----+----+----+----+---- - -
^
s
Этот последний символ называется терминатором строки «NUL»потому что «NUL» - это имя символа с нулевым значением ASCII (все значения ASCII, которые не могут быть напечатаны, имеют трехбуквенные имена).
size_t len=strlen(s);
Теперь len
имеет значение пять.Обратите внимание, что он не включает терминатор «NUL», поэтому даже если строка занимает 6 байтов, длина равна 5.
char *t=s+len-1;
Теперь t
имеет значение s + 4.Если вы посчитаете ячейки памяти, это то, что вы получите:
- - ----+----+----+----+----+----+----+---- - -
| H | e | l | l | o | \0 |
- - ----+----+----+----+----+----+----+---- - -
^ ^
s t
Обратите внимание, что s+strlen(s)
будет указывать на терминатор "NUL".
printf("%s %s\n",t,s);
Этот printf должен печатать Hello o
while(t>=s)
Этот цикл while будет продолжаться до тех пор, пока t>=s
означает, что он будет выполнять тело цикла для каждого символа, включая тот, на который указывает s
.
printf("%c",*t);
Печатает содержимое памяти, на которую указывает t.Он начинается с o
и продолжается в обратном направлении к H
.
t=t-1;
Это та часть, которая движется t назад.В конце концов, t пройдет s, а затем цикл закончится.Когда цикл завершится, он будет выглядеть следующим образом:
- - ----+----+----+----+----+----+----+---- - -
| H | e | l | l | o | \0 |
- - ----+----+----+----+----+----+----+---- - -
^ ^
t s
Тогда есть одна последняя строка:
puts("");
, которая печатает пустую строку и окончательный перевод строки - там не былоперевод строки в строке, но он нам нужен, так что это способ сделать это.