Печать строки в C с использованием арифметики с указателями, включая массивы, целые числа и указатели - PullRequest
4 голосов
/ 10 января 2012

Есть три структуры; массивы a и b и указатель c:

c --------------------------.
                            |
                            V
       ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___
a --> | a | \0| \0| \0| \0| b | i | g | \0| \0| r | i | d | e | \0|
       ´´´ ´´´ ´´´ ´´´ ´´´ ´´´ ´´´ ´´´ ´´´ ´´´ ´´´ ´´´ ´´´ ´´´ ´´´
       ___ ___ ___ ___ ___ ___ ___
b --> | F | l | y | i | n | g | \0|
       ´´´ ´´´ ´´´ ´´´ ´´´ ´´´ ´´´

Это код:

int main(){
   char a[3][5]={"a", "big", "ride"};
   char b[]="Flying";
   char *c=*(a+1);

   puts(b+(c-*a)-2);

   return 0;
}

Теперь я не могу понять выражение b+(c-*a)-2. Кто-то может быть добрым и сломать это?

1 Ответ

8 голосов
/ 10 января 2012
  • b+(c-*a)-2 совпадает с &b[(c-*a)-2]. Другими словами, если (c-*a)-2 является смещением в строку b, puts(b+(c-*a)-2) напечатает строку b, начиная с позиции со смещением (c-*a)-2.
  • c назначается *(a+1), или * (& (a [1])), или просто a[1], что указывает на "big"
  • Подсчитайте квадраты на диаграмме, чтобы найти значение c-*a (это 5)
  • b[5-2] - это "ing"

Отказ от ответственности: если кто-то попытается зарегистрировать такой код в моей компании, он больше не будет работать на нас.

...