1

Если у меня есть функция, которая берет указатель на целое число, и я передаю ссылку на целочисленную переменную из моей основной, это вызов по значению или вызов по ссылке? Пример кода:C++ Вызов по ссылке

#include <iostream> 

using namespace std; 

void fun(int *a){ 
//Code block 
} 

int main(){ 
    int a = 5; 
    fun(&a); 
    return 0; 
} 

В приведенном выше коде, это вызов функции удовольствие исходящий вызов по значению или позвонить по ссылке?

+0

возможно дубликат [C++ Передача указатель на функцию (Howto) + C++ указатель Манипуляции] (http://stackoverflow.com/questions/3796181/c-passing-pointer-to-function-howto-c- манипуляция указателем) –

+4

Вы не передаете ссылку на свою функцию, вы передаете адрес 'a'. –

ответ

1

Вы передаете по значению адрес, на котором находится а.

Итак, когда в вашей пустоте называется fun, вы набираете * a, вы получаете доступ к значению a.

Но, как я уже сказал, вы передаете по значению int указатель на a.

1

Вы передаёте указатель на номер a, по значению.

В зависимости от того, какого уровня абстракции вы говорите, вы могли бы сказать, что вы поэтому прохождение a указателем, или проходя a на «ручку». В более широком смысле «передача a по ссылке» не была бы строго неверной, но в C++ она неверна, потому что «ссылка» означает что-то конкретное в C++. У вас нет ссылок на C++ в этом коде.

4

Ваш вызов - это пропуск по значению, но типа 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) ссылки или указателя позволяет изменять передаваемый ему аргумент. Передача значения по значению или константе не позволяет передать переданный ему аргумент.

-1
It is call by reference as you are passing reference the address reference to your variable so, 
inside function 
      *a = 100; 
changes the value of a in caller function as the content at that address has been changed. 
But address is passed by value so 
      a = NULL; 
will not change a, as a still be pointing to same address. 

 Смежные вопросы

  • Нет связанных вопросов^_^