logo

Rodyklės ir nuorodos C++

Būtina sąlyga: Rodyklės , Nuorodos

C ir C++ palaikymo rodyklės, kurios skiriasi nuo daugelio kitų programavimo kalbų, tokių kaip Java, Python, Ruby, Perl ir PHP, nes palaiko tik nuorodas. Tačiau įdomu tai, kad C++ kartu su rodyklėmis taip pat palaiko nuorodas.



Iš pirmo žvilgsnio nuorodos ir rodyklės yra labai panašios, nes abi naudojamos tam, kad vienas kintamasis suteiktų prieigą prie kito. Kadangi abu teikia daug tų pačių galimybių, dažnai neaišku, kuo šie mechanizmai skiriasi. Šiame straipsnyje pabandysiu iliustruoti skirtumus tarp nuorodų ir nuorodų.

Rodyklės : Rodyklė yra kintamasis, kuriame yra kito kintamojo atminties adresas. Rodyklė turi būti susieta su * operatorių, kad pasiektų atminties vietą, į kurią jis nurodo.

tinklų tipai

Nuorodos : Nuorodos kintamasis yra slapyvardis, ty kitas jau esamo kintamojo pavadinimas. Nuoroda, kaip ir rodyklė, taip pat įgyvendinama išsaugant objekto adresą.
Nuoroda gali būti laikoma nuolatine rodykle (negalima painioti su rodykle į pastovią reikšmę!) su automatine nekryptimi, t. y. kompiliatorius taikys * operatorius jums.



int i = 3;   // A pointer to variable i or 'stores the address of i' int *ptr = &i;   // A reference (or alias) for i. int &ref = i;>

Skirtumai :

1. Inicijavimas: Rodyklė gali būti inicijuota tokiu būdu:

int a = 10; int *p = &a; // OR  int *p; p = &a;>

Mes galime paskelbti ir inicijuoti žymeklį tuo pačiu žingsniu arba keliose eilutėse.



2. Nuorodose

int a = 10; int &p = a; // It is correct // but int &p; p = a; // It is incorrect as we should declare and initialize references at single step>

PASTABA: Šis skirtumas gali skirtis priklausomai nuo kompiliatoriaus. Aukščiau pateiktas skirtumas yra susijęs su Turbo IDE.

3. Perskyrimas: Rodyklė gali būti priskirta iš naujo. Ši ypatybė naudinga diegiant duomenų struktūras, pvz., susietą sąrašą, medį ir kt. Žr. šį pavyzdį:

int a = 5; int b = 6; int *p; p = &a; p = &b;>

4. Kita vertus, nuoroda negali būti priskirta iš naujo ir turi būti priskirta inicijuojant.

int a = 5; int b = 6; int &p = a; int &p = b; // This will throw an error of 'multiple declaration is not allowed'  // However it is valid statement, int &q = p;>

5. Atminties adresas: Žymeklis krūvoje turi savo atminties adresą ir dydį, o nuoroda turi tą patį atminties adresą kaip ir pradinis kintamasis ir neužima vietos krūvoje.

int &p = a; cout << &p << endl << &a;>

6. NULL reikšmė: Rodyklė gali būti tiesiogiai priskirta NULL, o nuoroda negali būti. Apribojimai, susiję su nuorodomis (be NULL, be perskyrimo) užtikrina, kad pagrindinės operacijos nepatektų į išimties situaciją.

str iki tarpt

7. Netiesioginis: Galite turėti žymeklį prie žymeklio (žinomo kaip dvigubas žymeklis), siūlantis papildomus netiesioginės krypties lygius, o nuorodos siūlo tik vieną netiesioginės krypties lygį. Pavyzdžiui,

In Pointers, int a = 10; int *p; int **q; // It is valid. p = &a; q = &p;  // Whereas in references, int &p = a; int &&q = p; // It is reference to reference, so it is an error>

8. Aritmetinės operacijos: Su rodyklėmis galima atlikti įvairias aritmetines operacijas, tuo tarpu tokio dalyko, kuris vadinamas nuorodos aritmetika, nėra (tačiau galite atlikti rodyklės aritmetiką objekto, į kurį nukreipta nuoroda, adresu, kaip &obj + 5).

Skirtumo tarp nuorodų ir rodyklių lentelės forma C++

Nuorodos Rodyklės
Perskyrimas Kintamojo negalima iš naujo priskirti nuorodoje. Kintamąjį galima iš naujo priskirti rodyklėse.
Atminties adresas Jis turi tą patį adresą kaip ir pradinis kintamasis. Rodyklės turi savo atminties adresą.
Darbas Tai reiškia kitą kintamąjį. Tai saugo kintamojo adresą.
Nulinė vertė Jis neturi nulinės vertės. Jo vertė gali būti priskirta kaip nulis.
Argumentai Šis kintamasis nurodomas metodu pereiti pagal vertę. Žymiklis tai veikia pagal metodą, žinomą kaip perdavimas pagal nuorodą.

Kada naudoti Ką

Spektakliai yra visiškai tokie patys, kaip nuorodos yra įdiegtos viduje kaip rodyklės. Tačiau vis tiek galite turėti omenyje kai kuriuos dalykus, kad nuspręstumėte, kada ką naudoti:

pridedant eilutę Java
  • Naudokite nuorodas:
    • Funkcijų parametruose ir grąžinimo tipuose.
  • Naudokite nuorodas:
    • Jei reikia rodyklės aritmetikos arba NULL žymeklio perdavimas. Pavyzdžiui, masyvams (Atkreipkite dėmesį, kad prieiga prie masyvo įgyvendinama naudojant rodyklės aritmetiką).
    • Įdiegti duomenų struktūras, tokias kaip susietasis sąrašas, medis ir kt., ir jų algoritmus. Taip yra todėl, kad norėdami nurodyti skirtingas ląsteles, turime naudoti rodyklių sąvoką.

Cituojama C++ FAQ Lite : naudokite nuorodas, kai galite, ir nuorodas, kai turite. Paprastai pirmenybė teikiama nuorodoms, o ne nuorodoms, kai nereikia dėti iš naujo. Paprastai tai reiškia, kad nuorodos naudingiausios klasės viešoje sąsajoje. Nuorodos paprastai rodomos objekto odoje, o rodyklės – viduje.

Aukščiau pateiktų dalykų išimtis yra tada, kai funkcijos parametrui arba grąžinamai vertei reikia kontrolinės nuorodos – nuorodos, kuri nenurodo objekto. Paprastai tai geriausia padaryti grąžinant / paimant žymeklį ir nulptr reikšmei suteikiant šią ypatingą reikšmę (nuorodos visada turi būti slapyvardžiai objektai, o ne nulinė nuoroda).

Susijęs straipsnis:
Kada perduodame argumentus kaip nuorodą arba rodykles?