Если мы покажем массив с добавленными соответствующими указателями, он будет выглядеть примерно так:
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+
| 'S' | 'h' | 'o' | 'r' | 't' | ' ' | 'M' | 'e' | 's' | 's' | 'a' | 'g' | 'e' | ' ' | 'S' | 'e' | 'r' | 'v' | 'i' | 'c' | 'e' | '\0' |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+
^ ^ ^
| | |
s1 s2 s3
Когда вы изменяете содержимое массива, сами указатели s2
и s3
не изменяется, они по-прежнему указывают на те же места в массиве.
Так что после
strncpy(s1 + 1, s2, 1);
массив (с указателями) выглядит как
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+
| 'S' | 'M' | 'o' | 'r' | 't' | ' ' | 'M' | 'e' | 's' | 's' | 'a' | 'g' | 'e' | ' ' | 'S' | 'e' | 'r' | 'v' | 'i' | 'c' | 'e' | '\0' |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+
^ ^ ^
| | |
s1 s2 s3
Единственный символ, на который указывает s2
, копируется в s1[1]
.
Затем с
strcpy(s1 + 2, s3);
массив выглядит как
+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+
| 'S' | 'M' | 'S' | 'e' | 'r' | 'v' | 'i' | 'c' | 'e' | '\0' | 'a' | 'g' | 'e' | ' ' | 'S' | 'e' | 'r' | 'v' | 'i' | 'c' | 'e' | '\0' |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+
^ ^ ^
| | |
s1 s2 s3
строка "Service"
копируется по части строки, начинающейся с s1[2]
.
Указатель s2
все еще указывает на то же место, но если мы рассмотрим s2
как указатель на первый символстроки, ее содержимое изменилось, поскольку вы перезаписали это содержимое.