Ukazovatele C ++ s príkladmi

Obsah:

Anonim

Čo sú ukazovatele?

V C ++ sa ukazovateľ vzťahuje na premennú, ktorá obsahuje adresu inej premennej. Rovnako ako bežné premenné, aj ukazovatele majú dátový typ. Napríklad ukazovateľ typu integer môže obsahovať adresu premennej typu integer. Ukazovateľ typu znaku môže obsahovať adresu premennej typu znaku.

Ukazovateľ by ste mali vidieť ako symbolické znázornenie adresy pamäte. Pomocou ukazovateľov môžu programy simulovať call-by-reference. Môžu tiež vytvárať a manipulovať s dynamickými dátovými štruktúrami. V C ++ sa ukazovateľová premenná vzťahuje na premennú ukazujúcu na konkrétnu adresu v pamäti, na ktorú ukazuje iná premenná.

V tomto výučbe pre C ++ sa dozviete:

  • Čo sú ukazovatele?
  • Adresy v C ++
  • Syntax deklarácie ukazovateľa
  • Referenčný operátor (&) a operátor Deference (*)
  • Ukazovatele a polia
  • Ukazovateľ NULL
  • Ukazovatele premenných
  • Aplikácia ukazovateľov
  • Výhody použitia ukazovateľov

Adresy v C ++

Aby ste pochopili ukazovatele C ++, musíte pochopiť, ako počítače ukladajú údaje.

Keď vytvoríte premennú v programe C ++, priradí sa jej určitý priestor pamäti počítača. Hodnota tejto premennej je uložená na priradenom mieste.

Na poznanie umiestnenia v pamäti počítača, kde sú uložené údaje, poskytuje C ++ operátor & (referencia). Operátor vráti adresu, ktorú zaberá premenná.

Napríklad ak x je premenná, & x vráti adresu premennej.

Syntax deklarácie ukazovateľa

Deklarácia jazyka C ++ má nasledujúcu syntax:

datatype *variable_name;
  • Dátový typ je základný typ ukazovateľa, ktorým musí byť platný dátový typ C ++.
  • Názov_ premennej by mal byť názov premennej ukazovateľa.
  • Hviezdička použitá vyššie na vyhlásenie ukazovateľa je podobná hviezdičke použitej na vykonanie operácie násobenia. Je to hviezdička, ktorá označuje premennú ako ukazovateľ.

Tu je príklad platných vyhlásení ukazovateľa v C ++:

int *x; // a pointer to integerdouble *x; // a pointer to doublefloat *x; // a pointer to floatchar *ch // a pointer to a character

Referenčný operátor (&) a operátor Deference (*)

Referenčný operátor (&) vráti adresu premennej.

Operátor dereferencie (*) nám pomáha získať hodnotu, ktorá bola uložená na adrese v pamäti.

Napríklad:

Ak máme premennú s menom num, uloženú na adrese 0x234 a s hodnotou 28.

Referenčný operátor (&) vráti 0x234.

Operátor dereferencie (*) vráti 5.

Príklad 1:

#include using namespace std;int main() {int x = 27;int *ip;ip = &x;cout << "Value of x is : ";cout << x << endl;cout << "Value of ip is : ";cout << ip<< endl;cout << "Value of *ip is : ";cout << *ip << endl;return 0;}

Výkon:

Ako to funguje:

Tu je snímka obrazovky s kódom:

Vysvetlenie kódu:

  1. Importujte súbor hlavičky iostream. Toto nám umožní používať funkcie definované v hlavičkovom súbore bez výskytu chýb.
  2. Ak chcete používať svoje triedy bez toho, aby ste ich volali, zahrňte štandardný menný priestor.
  3. Zavolajte funkciu main (). Logika programu by mala byť pridaná do tela tejto funkcie. {Označuje začiatok tela funkcie.
  4. Deklarujte celočíselnú premennú x a priraďte jej hodnotu 27.
  5. Deklarujte ukazovateľovú premennú * ip.
  6. Uložte adresu premennej x do premennej ukazovateľa.
  7. Vytlačte nejaký text na konzolu.
  8. Vytlačte hodnotu premennej x na obrazovku.
  9. Vytlačte nejaký text na konzolu.
  10. Vytlačte adresu premennej x. Hodnota adresy bola uložená v premennej ip.
  11. Vytlačte nejaký text na konzolu.
  12. Hodnota tlače uložená na adrese ukazovateľa.
  13. Program by mal vrátiť hodnotu po úspešnom vykonaní.
  14. Koniec tela hlavnej () funkcie.

Ukazovatele a polia

Polia a ukazovatele fungujú na súvisiacom koncepte. Pri práci s poľami s ukazovateľmi je potrebné si uvedomiť rôzne veci. Samotný názov poľa označuje základnú adresu poľa. To znamená, že na priradenie adresy poľa smerníku by ste nemali používať ampersand (&).

Napríklad:

p = arr;

Vyššie uvedené je správne, pretože arr predstavuje adresu polí. Tu je ďalší príklad:

p = &arr;

Vyššie uvedené je nesprávne.

Pole môžeme implicitne previesť na ukazovateľ. Napríklad:

int arr [20];int * ip;

Nižšie je uvedená platná operácia:

ip = arr;

Po vyššie uvedenom vyhlásení budú adresy ip a arr rovnocenné a budú zdieľať vlastnosti. Avšak ip môže byť priradená iná adresa, ale nemôžeme priradiť nič k arr.

Príklad 2:

Tento príklad ukazuje, ako prechádzať pole pomocou ukazovateľov:

#include using namespace std;int main() {int *ip;int arr[] = { 10, 34, 13, 76, 5, 46 };ip = arr;for (int x = 0; x < 6; x++) {cout << *ip << endl;ip++;}return 0;}

Výkon:

Tu je snímka obrazovky s kódom:

Vysvetlenie kódu:

  1. Deklarujte celočíselnú premennú ukazovateľ ip.
  2. Deklarujte pole s názvom arr a uložte do neho 6 celých čísel.
  3. Priradiť arr na ip. IP a arr sa stanú rovnocennými.
  4. Vytvorte slučku pre. Premenná slučky x bola vytvorená na iteráciu nad prvkami poľa od indexu 0 do 5.
  5. Vytlačte hodnoty uložené na adrese ukazovateľa IP. Na jednu iteráciu sa vráti jedna hodnota a celkovo sa vykoná 6 opakovaní. Endl je kľúčové slovo C ++, ktoré znamená koncový riadok. Táto akcia umožňuje presunúť kurzor na ďalší riadok po vytlačení každej hodnoty. Každá hodnota bude vytlačená v samostatnom riadku.
  6. Ak chcete po každej iterácii presunúť ukazovateľ na ďalšiu pozíciu int.
  7. Koniec slučky.
  8. Po úspešnom vykonaní musí program niečo vrátiť.
  9. Koniec hlavného () funkčného tela.

Ukazovateľ NULL

Ak neexistuje presná adresa, ktorá má byť priradená, potom môže byť premennej ukazovateľ priradená NULL. Malo by sa to urobiť počas vyhlásenia. Takýto ukazovateľ je známy ako nulový ukazovateľ. Jeho hodnota je nula a je definovaná v mnohých štandardných knižniciach, ako je iostream.

Príklad 3:

#include using namespace std;int main() {int *ip = NULL;cout << "Value of ip is: " << ip;return 0;}

Výkon:

Tu je snímka obrazovky s kódom:

Vysvetlenie kódu:

  1. Deklarujte ukazovateľovú premennú ip a priraďte jej hodnotu NULL.
  2. Vypíše hodnotu premennej ukazovateľ ip popri niektorom texte na konzole.
  3. Po úspešnom dokončení musí program vrátiť hodnotu.
  4. Koniec tela hlavnej () funkcie.

Ukazovatele premenných

S C ++ môžete manipulovať s údajmi priamo z pamäte počítača.

Pamäťový priestor je možné podľa želania prideliť alebo znovu prideliť. Toto umožňujú ukazovatele Pointer.

Premenné ukazovateľa smerujú na konkrétnu adresu v pamäti počítača, na ktorú ukazuje iná premenná.

Môže byť vyhlásený takto:

int *p;

Alebo

int* p;

V tvojom príklade sme deklarovali premennú ukazovateľ p.

Bude obsahovať adresu v pamäti.

Hviezdička je operátor dereferencie, čo znamená ukazovateľ na.

Ukazovateľ p ukazuje na celočíselnú hodnotu v adrese pamäte.

Príklad 4:

#include using namespace std;int main() {int *p, x = 30;p = &x;cout << "Value of x is: " << *p;return 0;}

Výkon:

Tu je snímka obrazovky s kódom:

Vysvetlenie kódu:

  1. Deklarujte ukazovateľovú premennú p a premennú x s hodnotou 30.
  2. Priraďte adresu premennej x p.
  3. Vytlačte hodnotu premennej ukazovateľ p spolu s nejakým textom na konzole.
  4. Po úspešnom dokončení musí program vrátiť hodnotu.
  5. Koniec tela hlavnej () funkcie.

Aplikácia ukazovateľov

Funkcie v C ++ môžu vrátiť iba jednu hodnotu. Ďalej sú všetky premenné deklarované vo funkcii alokované v zásobníku volaní funkcií. Len čo sa funkcia vráti, všetky premenné zásobníka sa zničia.

Argumenty fungovania sa odovzdávajú podľa hodnoty a akákoľvek úprava vykonaná v premenných nezmení hodnotu skutočných premenných, ktoré sa odovzdajú. Nasledujúci príklad pomáha ilustrovať tento koncept: -

Príklad 5:

#include using namespace std;void test(int*, int*);int main() {int a = 5, b = 5;cout << "Before changing: << endl;cout << "a = " << a << endl;cout << "b = " << b << endl;test(&a, &b);cout << "\nAfter changing" << endl;cout << "a = " << a << endl;cout << "b = " << b << endl;return 0;}void test(int* n1, int* n2) {*n1 = 10;*n2 = 11;}

Výkon:

Tu je snímka obrazovky s kódom:

Vysvetlenie kódu:

  1. Vytvorte prototyp funkcie s názvom test, ktorá bude trvať dva celočíselné parametre.
  2. Zavolajte funkciu main (). Logiku programu pridáme do jeho tela.
  3. Deklarujte dve celočíselné premenné a a b, každú s hodnotou 5.
  4. Vytlačte nejaký text na konzolu. Endl (koncový riadok) posunie kurzor a začne tlačiť v ďalšom riadku.
  5. Vytlačte hodnotu premennej a na konzolu spolu s ďalším textom. Endl (koncový riadok) posunie kurzor a začne tlačiť v ďalšom riadku.
  6. Vytlačte hodnotu premennej b na konzolu spolu s ďalším textom. Endl (koncový riadok) posunie kurzor a začne tlačiť v ďalšom riadku.
  7. Vytvorte funkciu s názvom test (), ktorá ako parametre prevezme adresy premenných a a b.
  8. Vytlačte nejaký text na konzolu. \ N vytvorí nový prázdny riadok pred vytlačením textu. Endl (koncový riadok) posunie kurzor a začne tlačiť v nasledujúcom riadku po vytlačení textu.
  9. Vytlačte hodnotu premennej a na konzolu spolu s ďalším textom. Endl (koncový riadok) posunie kurzor a začne tlačiť v ďalšom riadku.
  10. Vytlačte hodnotu premennej b na konzolu spolu s ďalším textom. Endl (koncový riadok) posunie kurzor a začne tlačiť v ďalšom riadku.
  11. Po úspešnom dokončení musí program vrátiť hodnotu.
  12. Koniec tela hlavnej () funkcie.
  13. Definovanie funkčného testu (). Funkcia by mala mať dve premenné celočíselného ukazovateľa * n1 a * n2.
  14. Priradenie ukazovateľovej premennej * n1 k hodnote 10.
  15. Priradenie ukazovateľovej premennej * n2 k hodnote 11.
  16. Koniec tela funkčnej skúšky ().

Aj keď sa premenným a a b vo funkčnom teste priraďujú nové hodnoty, po dokončení volania funkcie sa to isté neodrazí od vonkajšej hlavnej funkcie.

Použitie ukazovateľov ako argumentov funkcie pomáha preniesť skutočnú adresu premennej do funkcie a všetky zmeny vykonané v premennej sa prejavia vo vonkajšej funkcii.

Vo vyššie uvedenom prípade má funkcia „test“ adresu premenných „a“ a „b“. Tieto dve premenné sú priamo prístupné z funkcie „test“, a preto sa akákoľvek zmena vykonaná v týchto premenných prejaví vo funkcii volajúceho „main“.

Výhody použitia ukazovateľov

Tu sú výhody a výhody použitia ukazovateľov

  • Ukazovatele sú premenné, ktoré ukladajú adresu ďalších premenných v jazyku C ++.
  • Viac ako jedna premenná môže byť upravená a vrátená funkciou pomocou ukazovateľov.
  • Pamäť môže byť dynamicky alokovaná a delokovaná pomocou ukazovateľov.
  • Ukazovatele pomáhajú zjednodušiť zložitosť programu.
  • Rýchlosť vykonávania programu sa zlepšuje pomocou ukazovateľov.

Zhrnutie:

  • Ukazovateľ označuje pridržiavaciu adresu premennej.
  • Každý ukazovateľ má platný dátový typ.
  • Ukazovateľ je symbolické znázornenie adresy pamäte.
  • Ukazovatele umožňujú programom simulovať call-by-reference a vytvárať a manipulovať s dynamickými dátovými štruktúrami.
  • Polia a ukazovatele používajú súvisiaci koncept.
  • Názov poľa označuje jeho základňu.
  • Ak chcete priradiť adresu poľa smerníku, nepoužívajte ampersand (&).
  • Ak neexistuje žiadna konkrétna adresa na priradenie ukazovateľovej premennej, priraďte jej hodnotu NULL.