Priekšnosacījums: Rādītāji , Atsauces
C un C++ atbalsta norādes, kas atšķiras no vairuma citu programmēšanas valodu, piemēram, Java, Python, Ruby, Perl un PHP, jo tās atbalsta tikai atsauces. Bet interesanti, ka C++ kopā ar rādītājiem atbalsta arī atsauces.
Pamatā gan atsauces, gan norādes ir ļoti līdzīgas, jo abas tiek izmantotas, lai viens mainīgais nodrošinātu piekļuvi citam. Tā kā abi nodrošina daudzas vienādas iespējas, bieži vien nav skaidrs, ar ko šie mehānismi atšķiras. Šajā rakstā es mēģināšu ilustrēt atšķirības starp norādēm un atsaucēm.
Rādītāji : rādītājs ir mainīgais, kas satur cita mainīgā atmiņas adresi. Rādītājam ir jāatceļ atsauce ar * operatoru, lai piekļūtu atmiņas vietai, uz kuru tas norāda.
Java 8 funkcijas
Atsauces : atsauces mainīgais ir aizstājvārds, tas ir, cits nosaukums jau esošam mainīgajam. Atsauce, tāpat kā rādītājs, tiek īstenota arī, saglabājot objekta adresi.
Atsauci var uzskatīt par konstantu rādītāju (nejaukt ar rādītāju uz konstantu vērtību!) ar automātisku novirzīšanu, t.i., kompilators izmantos * operators 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;>
Atšķirības :
1. Inicializācija: Rādītāju var inicializēt šādi:
int a = 10; int *p = &a; // OR int *p; p = &a;>
Mēs varam deklarēt un inicializēt rādītāju vienā solī vai vairākās rindās.
darīt kamēr java
2. Atsaucēs,
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>
PIEZĪME: Šī atšķirība var atšķirties atkarībā no kompilatora. Iepriekš minētā atšķirība ir saistīta ar Turbo IDE.
3. Pārcelšana: Rādītāju var piešķirt atkārtoti. Šis rekvizīts ir noderīgs, lai ieviestu datu struktūras, piemēram, saistīto sarakstu, koku utt. Skatiet šo piemēru:
int a = 5; int b = 6; int *p; p = &a; p = &b;>
4. No otras puses, atsauci nevar piešķirt atkārtoti, un tā ir jāpiešķir inicializācijas laikā.
fontu gimp
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. Atmiņas adrese: Rādītājam stekā ir sava atmiņas adrese un lielums, savukārt atsaucei ir tāda pati atmiņas adrese kā sākotnējam mainīgajam un tas neaizņem vietu kaudzē.
int &p = a; cout << &p << endl << &a;>
6. NULL vērtība: Rādītājam var tieši piešķirt NULL, bet atsaucei to nevar piešķirt. Ierobežojumi, kas saistīti ar atsaucēm (bez NULL, bez pārdalīšanas) nodrošina, ka pamatā esošās darbības nenonāk izņēmuma situācijā.
7. Novirzīšana: Jums var būt rādītājs uz rādītāju (pazīstams kā dubultā rādītājs), kas piedāvā papildu novirzīšanas līmeņus, savukārt atsauces piedāvā tikai vienu novirzīšanas līmeni. Piemēram,
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. Aritmētiskās darbības: Ar rādītājiem var veikt dažādas aritmētiskās darbības, taču tādas lietas, ko sauc par atsauces aritmētiku, nav (tomēr varat veikt rādītāja aritmētiku objekta adresei, uz kuru norāda atsauce, piemēram, &obj + 5).
Atsauču un rādītāju atšķirības tabulā C++
| Atsauces | Rādītāji | |
|---|---|---|
| Pārcelšana | Mainīgo nevar atkārtoti piešķirt atsaucē. | Mainīgo var atkārtoti piešķirt programmā Pointers. |
| Atmiņas adrese | Tam ir tāda pati adrese kā sākotnējam mainīgajam. | Rādītājiem ir sava atmiņas adrese. |
| Darbs | Tas attiecas uz citu mainīgo. | Tas saglabā mainīgā adresi. |
| Null Value | Tam nav nulles vērtības. | Tam var būt piešķirta vērtība null. |
| Argumenti | Uz šo mainīgo ir atsauce ar metodi, kas tiek nodota pēc vērtības. | Rādītājs to dara, izmantojot metodi, kas pazīstama kā atsauce. |
Kad lietot Kas
Izrādes ir tieši tādas pašas, kā atsauces tiek iekšēji ieviestas kā norādes. Tomēr varat paturēt prātā dažus punktus, lai izlemtu, kad ko izmantot:
- Izmantojiet atsauces:
- Funkciju parametros un atgriešanas veidos.
- Izmantojiet norādes:
- Ja ir nepieciešama rādītāja aritmētika vai NULL rādītāja nodošana. Piemēram, masīviem (Ņemiet vērā, ka piekļuve masīvam tiek īstenota, izmantojot rādītāja aritmētiku).
- Ieviest datu struktūras, piemēram, saistīto sarakstu, koku utt. un to algoritmus. Tas ir tāpēc, ka, lai norādītu uz dažādām šūnām, mums ir jāizmanto rādītāju jēdziens.
Citēts C++ FAQ Lite : izmantojiet atsauces, kad varat, un norādes, kad nepieciešams. Atsaucēm parasti tiek dota priekšroka, nevis norādes, kad nav nepieciešams atkārtoti ievietot. Tas parasti nozīmē, ka atsauces ir visnoderīgākās klases publiskajā saskarnē. Atsauces parasti parādās uz objekta ādas, bet norādes – iekšpusē.
Izņēmums no iepriekš minētā ir gadījumi, kad funkcijas parametram vai atgriešanas vērtībai ir nepieciešama kontrolpazīme — atsauce, kas neattiecas uz objektu. To parasti vislabāk var izdarīt, atgriežot/paņemot rādītāju un piešķirot nullptr vērtībai šo īpašo nozīmi (atsaucēm vienmēr ir jābūt ar aizstājvārdiem objektiem, nevis nulles rādītājam, uz kuru nav atsaukta).
skaitļi alfabētam
Saistīts raksts:
Kad mēs nododam argumentus kā atsauci vai norādes?