Rozumiem tutaj zamieszanie. Pojęcia "przekazywać według wartości" i "przekazywać przez odniesienie" nie są tak jasne, nawet jeśli wydają się takie. Należy pamiętać, że komputer nie zna tych pojęć i nie zachowuje się zgodnie z nim. Komputer nie wie o typach. W związku z tym nie czyni rozróżnienia wskaźników i wartości. Pozwól mi spróbować wyjaśnić i przez przykład:
void func1(int x)
{
x = 5;
}
void func2(int *x)
{
int a;
x = &a;
}
Operacja jest taka sama dla obu funkcji w maszynie: To staje się argument i zmienia go. Zauważ, że w drugiej funkcji nie modyfikuje * x, modyfikuje x.
Teraz możemy wywołać te funkcje,
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.
Wolę powiedzieć, że zasadzie każde wywołanie funkcji jest „wywołanie przez wartość”. Ale w przypadku typu wskaźnika mamy sposób na zmianę zawartości innego adresu w pamięci.
Gdybyśmy napisany func2
jak
void func2(int *x)
{
*x = 5;
}
Wtedy byłby to prawdziwy przypadek „rozmowy przez odniesienie”.
Wskaźnik jest przekazywany przez wartość, ale obiekt wskazywany przez wskaźnik może być modyfikowany przez funkcję (zależnie od klasy const). – dreamlax