В этом вызове
reverse(str4, str3);
массив str4
передается по значению. Таким образом, выражение str4
, используемое в качестве аргумента, преобразуется во временный указатель на первый элемент массива.
Таким образом, функция reverse
имеет дело с этим временным объектом, который используется в качестве инициализатора параметра. функции.
Изменение этого параметра (локальной переменной функции) не влияет на содержимое исходного массива. Оно остается неизменным.
То есть в этом выражении внутри функции
str1 = strrev(str2);
фактически указатель str2
назначен указателю str1
. Строка, на которую указывает указатель str2, будет изменена. Что касается указателя str1
, то теперь он указывает на ту же строку, что и указатель str1
, и он не будет активен после выхода из функции.
Функция может быть определена, например, следующим образом, если вы хотите изменить строку, на которую указывает первый параметр функции
void reverse(char *str1, char *str2) {
strcpy( str1, strrev(str2) );
printf("%s\n\n", str1); //**It's a test.**
}
Однако функция не имеет большого смысла, потому что она инвертирует две строки одновременно.
Если вы хотите скопировать содержимое строки, на которую указывает второй параметр функции, в массив, на который указывает первый параметр функции, тогда определение функции может выглядеть следующим образом:
void reverse( char *str1, const char *str2 )
{
strcpy( str1, str2 );
strrev( s1 );
printf("%s\n\n", str1); //**It's a test.**
}
В этом случае строка, на которую указывает указатель str2
не изменится, а массив, на который указывает указатель str1
, получит обратную строку, на которую указывает указатель str2
.