Вот пример, который демонстрирует различия между передачей по значению - значением указателя - ссылкой :
void swap_by_value(int a, int b){
int temp;
temp = a;
a = b;
b = temp;
}
void swap_by_pointer(int *a, int *b){
int temp;
temp = *a;
*a = *b;
*b = temp;
}
void swap_by_reference(int &a, int &b){
int temp;
temp = a;
a = b;
b = temp;
}
int main(void){
int arg1 = 1, arg2 = 2;
swap_by_value(arg1, arg2);
cout << arg1 << " " << arg2 << endl; //prints 1 2
swap_by_pointer(&arg1, &arg2);
cout << arg1 << " " << arg2 << endl; //prints 2 1
arg1 = 1; //reset values
arg2 = 2;
swap_by_reference(arg1, arg2);
cout << arg1 << " " << arg2 << endl; //prints 2 1
}
Метод «передачи по ссылке» имеет важное ограничение . Если параметр объявлен как , переданный по ссылке (поэтому ему предшествует знак &), соответствующий ему фактический параметр должен быть переменной .
Фактическим параметром, относящимся к формальному параметру «передано по значению», может быть выражение в целом, поэтому допускается использование не только переменной, но также литерала или даже результата вызова функции. 1016 *
Функция не может поместить значение во что-либо, кроме переменной. Он не может присвоить литералу новое значение или заставить выражение изменить его результат.
PS: Вы также можете проверить ответ Дилана Битти в текущей ветке, который объясняет его простыми словами.