Я понимаю путаницу здесь. Понятия «передача по значению» и «передача по ссылке» не столь ясны, даже если они кажутся таковыми.
Имейте в виду, что компьютер не знает этих понятий и не ведет себя в соответствии с ним.
Компьютер не знает о типах. Следовательно, он не делает различий между указателями и ценностями.
Позвольте мне попытаться объяснить и пример:
void func1(int x)
{
x = 5;
}
void func2(int *x)
{
int a;
x = &a;
}
Операция одинакова для машины в обеих функциях: она получает аргумент и изменяет его. Обратите внимание, что во второй функции она не модифицирует * x, она модифицирует x .
Теперь, если мы вызовем эти функции,
int y = 10;
func1(y); //value of y does not change
func2(&y); //value of &y does not change, but the value of the address which y points may change.
Я предпочитаю сказать, что в основном, каждый вызов функции - это "вызов по значению" . Но в случае типа указателя у нас есть способ изменить содержимое другого адреса в памяти.
Если бы мы написали func2
как
void func2(int *x)
{
*x = 5;
}
Тогда это будет реальный случай "вызова по ссылке".