В первой ситуации вы пытаетесь изменить T
в строке «Test», скомпилированной в программу, которая содержится в той части памяти, которую ваш код не должен изменять (обычно;В некоторых средах это разрешено, но обычно это не так).Это потому, что (*p)++
означает (условно говоря) *p = *p + 1
(например, получить символ, на который указывает p
, увеличить его и записать обратно), и, конечно, *p
указываетк скомпилированному «Test».
Ваша вторая версия не имеет этой проблемы, потому что вы увеличиваете ch
, который вам разрешено изменять .Ваша вторая версия фактически увеличивает две разные вещи;сначала он делает char ch = *p++;
, который получает символ в *p
, а затем увеличивает p
(теперь он указывает на «e» в «Тесте»), а затем вы делаете ch = ch++
.(Вы, вероятно, имели в виду просто ch++;
, поскольку ++
работает непосредственно со своим операндом.)