C ++ Soita viitteenä: osoittimien käyttäminen (esimerkkien kanssa)

Tässä opetusohjelmassa opitaan C ++ -puhelusta viittaamalla välitysosoittimiin argumentiksi funktiolle esimerkkien avulla.

C ++ Funktiot -oppaassa opimme argumenttien välittämisen funktiolle. Tätä käytettyä menetelmää kutsutaan arvon välittämiseksi, koska todellinen arvo välitetään.

On kuitenkin toinen tapa välittää argumentteja funktiolle, jossa argumenttien todellisia arvoja ei välitetä. Sen sijaan viittaus arvoihin välitetään.

Esimerkiksi,

 // 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; )

Huomaa &sisään void func2(int &numRef). Tämä tarkoittaa, että käytämme muuttujan osoitetta parametrina.

Joten, kun kutsumme func2()funktion sisään main()välittämällä muuttujan num argumenttina, välitämme tosiasiallisesti numeromuuttujan osoitteen arvon 5 sijasta .

C ++ Pass by Value vs. Pass by Reference

Esimerkki 1: Viittaaminen ilman viitteitä

 #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; )

Tuotos

 Ennen vaihtamista a = 1 b = 2 Vaihdon jälkeen a = 2 b = 1

Tässä ohjelmassa välitimme muuttujat a ja b swap()funktiolle. Huomaa funktion määritelmä,

 void swap(int &n1, int &n2)

Tässä käytämme &merkitsemään, että funktio hyväksyy osoitteet parametreiksi.

Siksi kääntäjä voi tunnistaa, että todellisten arvojen sijaan muuttujien viite välitetään toimintoparametreille.

Kun swap()toiminto, toiminto parametrit N1 ja N2 osoittavat samaan arvoon kuin muuttujat a ja b vastaavasti. Siksi vaihtaminen tapahtuu todellisen arvon perusteella.

Sama tehtävä voidaan tehdä osoittimilla. Saat lisätietoja osoittimista käymällä C ++ -osoitteissa.

Esimerkki 2: Viitteiden välittäminen osoittimilla

 #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; )

Tuotos

 Ennen vaihtamista a = 1 b = 2 Vaihdon jälkeen a = 2 b = 1

Täällä voimme nähdä, että tulos on sama kuin edellinen esimerkki. Huomaa rivi,

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

Tässä muuttujan osoite välitetään funktion kutsun aikana muuttujan sijaan.

Koska osoite välitetään arvon sijasta, poikkeamaoperaattoria *on käytettävä pääsemään kyseiseen osoitteeseen tallennettuun arvoon.

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

*n1ja *n2antaa osoitteeseen n1 ja vastaavasti n2 tallennetun arvon.

Koska n1 ja n2 sisältävät a: n ja b: n osoitteet, mihin tahansa tehdään *n1ja * n2 muuttaa a: n ja b: n todellisia arvoja.

Siksi, kun tulostamme main()funktion a ja b arvot, arvot muuttuvat.

Mielenkiintoisia artikkeleita...