Я понимаю путаницу здесь. Понятия «передать по значению» и «пройти по ссылке» не столь ясны, даже если они кажутся такими. Имейте в виду, что компьютер не знает эти понятия и не ведет себя в соответствии с ним. Компьютер не знает о типах. Следовательно, он не делает различия указателей и ценностей. Позвольте мне попытаться объяснить и пример:
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;
}
Тогда это будет реальный случай «вызова по ссылке».
Указатель передается по значению, но объект, на который указывает указатель, может быть изменен функцией (зависит от const-qualification). – dreamlax