Ваш вызов - это пропуск по значению, но типа int*
не аргумента типа int
. Это означает, что копия указателя создается и передается функции. Вы можете изменить значение того, на что оно указывает, но не указателя.
Так что, если ваша функция как этот
void fun(int *a)
{
*a = 10;
}
и вы звоните из main
как этот
int main() {
int b = 1;
fun(&b);
// now b = 10;
return 0;
}
вы можете изменить значение b
, передавая указатель на него в вашу функцию.
Тот же эффект будет, если вы сделали следующее - который проходит по ссылке
void fun2(int& a)
{
a = 5;
}
int main()
{
int b = 10;
fun2(b);
// now b = 5;
return 0;
}
Теперь рассмотрим третью функцию, которая принимает целочисленный аргумент по значению
void fun3(int a)
{
a = 10;
}
int main()
{
int b = 1;
fun3(b);
// b is still 1 now!
return 0;
}
С перевала по значению , fun3
изменяет копию переданного ему аргумента, а не переменную b
в объем основного.
Передача с помощью (не const) ссылки или указателя позволяет изменять передаваемый ему аргумент. Передача значения по значению или константе не позволяет передать переданный ему аргумент.
возможно дубликат [C++ Передача указатель на функцию (Howto) + C++ указатель Манипуляции] (http://stackoverflow.com/questions/3796181/c-passing-pointer-to-function-howto-c- манипуляция указателем) –
Вы не передаете ссылку на свою функцию, вы передаете адрес 'a'. –