Вот как работают указатели. Результат, который вы видите, является нормальным и правильным.
Давайте перечислим все ваши переменные и на какие строки они указывают в памяти при объявлении:
str1 -> "One"
str2 -> "Two"
Затем вы выполняете некоторые инструкции присваивания:
test = str2;
Это присваивает значение указателя str2
test
. Таким образом, указатели
str1 -> "One"
str2 -> "Two"
test -> "Two"
Тогда
str2 = str1;
Назначает значение указателя str1
str2
. Теперь указатели
str1 -> "One"
str2 -> "One"
test -> "Two"
Затем вы печатаете test
, который указывает на то, на что str2
изначально указывал, что означает «Два».
Я думаю, вы считаете, что, поскольку вы присвоили str2
значению str1
и test
значению str2
, значение str1
каким-то образом переходит в test
. Это не вариант. Как только значение test
назначено, информация о том, откуда это значение пришло, теряется. Если вы хотите, чтобы значение test
было таким же, как str1
, вы можете изменить порядок операций присваивания:
str2 = str1;
test = str2;