Что делает "12345" + 2 в C? - PullRequest
       0

Что делает "12345" + 2 в C?

27 голосов
/ 26 августа 2010

Я видел это сделано в C раньше:

#define MY_STRING "12345"
...
#define SOMETHING (MY_STRING + 2)

Что здесь расширяется ЧТО-ТО? Это даже законно? Или они имеют в виду это:

#define SOMETHING (MY_STRING[2])

Ответы [ 2 ]

81 голосов
/ 26 августа 2010

Строковые литералы существуют в фиксированном сегменте данных программы, поэтому они представляются компилятору как тип указателя.

+-+-+-+-+-+--+
|1|2|3|4|5|\0|
+-+-+-+-+-+--+
 ^ MY_STRING
     ^ MY_STRING + 2
20 голосов
/ 26 августа 2010

Если у вас есть массив или указатель, p+x эквивалентно &p[x].Так что MY_STRING + 2 эквивалентно &MY_STRING[2]: он возвращает адрес третьего символа в строке.

Обратите внимание, что происходит, когда вы добавляете 0. MY_STRING + 0 совпадает с &MY_STRING[0], оба изкоторые аналогичны написанию просто MY_STRING, поскольку ссылка на строку является не чем иным, как указателем на первый символ в строке.К счастью, операция идентификации «добавить 0» не работает.Считайте, что это своего рода тест на умственную единицу, который мы можем использовать для проверки правильности нашего представления о том, что означает +.

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