"123456789"
- это строковый литерал .Это объект типа char [10]
в C. Это объект типа массива.
Когда объект типа массива используется с двоичным оператором +
, он неявно преобразуется (распадается) в указательтип.Результирующее значение указателя указывает на начало массива.Таким образом, исходный массив char [10]
затухает до char *
, указывая на символ '1'
в "123456789"
.
Двоичный оператор +
при применении к указателю выполняет арифметику указателя .Добавление 3
к указателю char *
создает указатель, который указывает на 3 байта справа от исходного указателя.Таким образом, вы получаете указатель, который указывает на символ '4'
в "123456789"
.
После этого вы используете формат %s
, чтобы попросить printf
напечатать строку, начинающуюся с этого '4'
.И это вывод, который вы получаете.
То же самое происходит в C ++, за исключением того, что в C ++ этот строковый литерал имеет тип const char [10]
и уменьшается до указателя const char *
,