C ++ Call by Reference: Używanie wskaźników (z przykładami)

W tym samouczku nauczymy się na przykładach wywoływania w C ++ przez odniesienie do przekazywania wskaźników jako argumentu do funkcji.

W samouczku C ++ Functions nauczyliśmy się przekazywania argumentów do funkcji. Ta używana metoda jest nazywana przekazywaniem przez wartość, ponieważ przekazywana jest rzeczywista wartość.

Istnieje jednak inny sposób przekazywania argumentów do funkcji, w której rzeczywiste wartości argumentów nie są przekazywane. Zamiast tego przekazywane jest odwołanie do wartości.

Na przykład,

 // function that takes value as parameter void func1(int numVal) ( // code ) // function that takes reference as parameter // notice the & before the parameter void func2(int &numRef) ( // code ) int main() ( int num = 5; // pass by value func1(num); // pass by reference func2(num); return 0; )

Zwróć uwagę na &in void func2(int &numRef). Oznacza to, że używamy adresu zmiennej jako naszego parametru.

Tak więc, kiedy wywołujemy func2()funkcję in main(), przekazując zmienną num jako argument, w rzeczywistości przekazujemy adres zmiennej num zamiast wartości 5 .

Przekazywanie przez wartość w C ++ a przekazywanie przez odwołanie

Przykład 1: Przekazywanie przez odniesienie bez wskaźników

 #include using namespace std; // function definition to swap values void swap(int &n1, int &n2) ( int temp; temp = n1; n1 = n2; n2 = temp; ) int main() ( // initialize variables int a = 1, b = 2; cout << "Before swapping" << endl; cout << "a = " << a << endl; cout << "b = " << b << endl; // call function to swap numbers swap(a, b); cout << "After swapping" << endl; cout << "a = " << a << endl; cout << "b = " << b << endl; return 0; )

Wynik

 Przed zamianą a = 1 b = 2 Po zamianie a = 2 b = 1

W tym programie przekazaliśmy zmienne a i b do swap()funkcji. Zwróć uwagę na definicję funkcji,

 void swap(int &n1, int &n2)

Tutaj używamy &do oznaczenia, że ​​funkcja przyjmie adresy jako parametry.

W związku z tym kompilator może zidentyfikować, że zamiast rzeczywistych wartości, odwołania do zmiennych są przekazywane do parametrów funkcji.

W swap()funkcji parametry funkcji n1 i n2 wskazują na tę samą wartość, co odpowiednio zmienne a i b. Stąd zamiana odbywa się na rzeczywistej wartości.

To samo zadanie można wykonać za pomocą wskaźników. Aby dowiedzieć się więcej o wskaźnikach, odwiedź C ++ Pointers.

Przykład 2: przekazywanie przez odniesienie za pomocą wskaźników

 #include using namespace std; // function prototype with pointer as parameters void swap(int*, int*); int main() ( // initialize variables int a = 1, b = 2; cout << "Before swapping" << endl; cout << "a = " << a << endl; cout << "b = " << b << endl; // call function by passing variable addresses swap(&a, &b); cout << "After swapping" << endl; cout << "a = " << a << endl; cout << "b = " << b << endl; return 0; ) // function definition to swap numbers void swap(int* n1, int* n2) ( int temp; temp = *n1; *n1 = *n2; *n2 = temp; )

Wynik

 Przed zamianą a = 1 b = 2 Po zamianie a = 2 b = 1

Tutaj widzimy, że dane wyjściowe są takie same jak w poprzednim przykładzie. Zwróć uwagę na linię,

 // &a is address of a // &b is address of b swap(&a, &b);

W tym przypadku adres zmiennej jest przekazywany podczas wywołania funkcji, a nie zmienna.

Ponieważ zamiast wartości przekazywany jest adres, *należy użyć operatora wyłuskiwania, aby uzyskać dostęp do wartości przechowywanej w tym adresie.

 temp = *n1; *n1 = *n2; *n2 = temp; 

*n1i *n2podaje wartość przechowywaną odpowiednio pod adresem n1 i n2.

Ponieważ n1 i n2 zawierają adresy a i b, cokolwiek zostanie zrobione, *n1a * n2 zmieni rzeczywiste wartości a i b.

Stąd, kiedy drukujemy wartości a i b w main()funkcji, wartości ulegają zmianie.

Interesujące artykuły...