C всегда передает аргументы по значению, что означает, что вызываемая функция получает локальную копию того, на что ссылается вызывающая сторона.
Вызываемая функция может изменять полученное значение, поскольку оно является локальной копией, не влияя на исходное значение. Например:
char *test(char *s) {
s++;
return s;
}
t = test("A");
это допустимо и показывает, что параметр s может быть изменен, не затрагивая вызывающего (который передает литерал ...).
Но strcpy () вашего примера делает что-то другое: он принимает указатель s, а изменяет то, что указывает на . Указатели являются мощными, и их можно использовать для имитации «передачи по ссылке» (указатель является ссылкой).
после присвоения * s = * t, какое из них сравнивается с '\ 0'? * s или * t?
* s: в C присваивание возвращает значение - а значением является значение присвоенной переменной после выполнения присваивания. Запись:
if (i=3) ...
совпадает с
i=3;
if (i) ...
Если бы я был указателем, синтаксис был бы другим, но механизм тот же, присваивание «использовало бы» указатель, а значение всего присваивания использовалось в качестве выражения для оценки в тесте.