Да, ваша концепция полностью неверна.
В вашей Alter()
функции, которую я здесь упрощаю (для удаления посторонних выводов, не связанных с вашим вопросом)
void Alter(char* X, char* Y)
{
char* T;
T = X;
X = Y;
Y = T;
cout<<X<<"&"<<Y<<endl;
}
X
и Y
являются указателями и передаются по значению. Таким образом, назначения X = Y
и Y = T
не видны вызывающей стороне, то есть main()
. В частности, назначения в функции (X = Y
и Y = T
) не имеют эффекта, видимого для main()
.
Однако X
и Y
каждая указывает (или может использоваться для ссылки) на что-то - в вашем коде первый символ массивов в main()
. Эти функции в функции: *X
и *Y
. Одно архаичное описание, которое, похоже, используется в вашей учебной книге, - это то, что они «передаются по ссылке».
Если мы изменим Alter()
, чтобы назначить *X
и *Y
, а именно
void Alter(char* X, char* Y)
{
char T; // note the missing * here relative to your code
T = *X; // note the added * in this line
*X = *Y; // note the added *s in this line and the next
*Y = *T;
cout<<X<<"&"<<Y<<endl; // this statement is unchanged
}
В этом случае вывод будет
Sirst&Fecond
Sirst&Fecond
(т. Е. Первые символы массивов меняются местами, и этот эффект виден для main()
).
Мы также можем изменить Alter()
на
void Alter(char*& X, char*& Y) // note the ampersands here
{
char* T;
T = X;
X = Y;
Y = T;
cout<<X<<"&"<<Y<<endl;
}
В C ++ здесь амперсанды означают, что X
и Y
являются ссылками на указатели. Таким образом, назначения в этой функции будут видны вызывающей стороне.
Однако, ваш пример main()
(который опять-таки просто удалить лишний вывод) не скомпилируется с использованием этой функции
int main() // main() returns int in standard C++, not void
{
char X[]="First", Y[]="Second";
Alter(X,Y);
cout<<X<<"*"<<Y;
}
Это не скомпилируется, потому что X
и Y
в main()
являются массивами, а массивы НЕ являются указателями - поэтому они не могут быть переданы функции, которая ожидает передачи ссылок на указатели. Это означает, что ваша функция Alter()
не может использоваться для замены массивов в main()
.