Mis on näpunäited?
C ++ keeles osutab osuti muutujale, mis hoiab teise muutuja aadressi. Nagu tavalistel muutujatel, on ka osutitel andmetüüp. Näiteks võib tüübi täisarv osuti sisaldada muutuja tüüpi täisarvu aadressi. Märgitüübi osuti võib sisaldada märgitüübi muutuja aadressi.
Sa peaksid nägema kursorit kui mälu aadressi sümboolset kujutist. Osutite abil saavad programmid modelleerida viitekutseid. Samuti saavad nad luua ja manipuleerida dünaamiliste andmestruktuuridega. C ++ puhul osutab osuti muutuja muutujale, mis osutab konkreetse aadressi mälus, millele osutab teine muutuja.
Selles C ++ õpetuses saate teada:
- Mis on näpunäited?
- Aadressid tähtedega C ++
- Kursori deklaratsiooni süntaks
- Viiteoperaator (&) ja viideoperaator (*)
- Osutajad ja massiivid
- NULL Pointer
- Muutujate kursorid
- Näidikute rakendamine
- Näidikute kasutamise eelised
Aadressid tähtedega C ++
C ++ osutite mõistmiseks peate mõistma, kuidas arvutid andmeid salvestavad.
Kui loote muutuja oma C ++ programmis, antakse sellele arvuti mällu ruumi. Selle muutuja väärtus salvestatakse määratud asukohta.
Et teada saada arvuti mälus asuvat asukohta, kuhu C ++ annab & (viide) operaatori. Operaator tagastab aadressi, mille muutuja kasutab.
Näiteks kui x on muutuja, tagastab & x muutuja aadressi.
Kursori deklaratsiooni süntaks
C ++ deklaratsioonil on järgmine süntaks:
datatype *variable_name;
- Andmetüüp on osuti põhitüüp, mis peab olema kehtiv C ++ andmetüüp.
- Muutuja_nimi on peaks olema kursori muutuja nimi.
- Eespool kursori deklareerimiseks kasutatud tärn on sarnane tärniga, mida kasutatakse korrutamistoimingu tegemiseks. Tärn tähistab muutujat kursorina.
Siin on näide kehtivatest kursori deklaratsioonidest C ++ keeles:
int *x; // a pointer to integerdouble *x; // a pointer to doublefloat *x; // a pointer to floatchar *ch // a pointer to a character
Viiteoperaator (&) ja viideoperaator (*)
Viideoperaator (&) tagastab muutuja aadressi.
Dereferentoperaator (*) aitab meil saada mäluaadressile salvestatud väärtuse.
Näiteks:
Kui meil on muutuja nimega number, on see salvestatud aadressile 0x234 ja salvestatud väärtus 28.
Viideoperaator (&) tagastab 0x234.
Dereferent (*) tagastab 5.
Näide 1:
#includeusing 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äljund:
Kuidas see töötab:
Siin on ekraanipilt koodist:
Koodi selgitus:
- Importige iostreami päisefail. See võimaldab meil kasutada päisefailis määratletud funktsioone vigu hankimata.
- Kaasa standardne nimeruum, et kasutada selle klasse ilma seda kutsumata.
- Helistage funktsioonile main (). Selle funktsiooni kehasse tuleks lisada programmiloogika. {Tähistab funktsiooni keha algust.
- Deklareerige täisarvu muutuja x ja määrake sellele väärtus 27.
- Deklareerige kursori muutuja * ip.
- Salvestage muutuja x aadress osuti muutujasse.
- Printige konsoolile tekst.
- Trükkige ekraanile muutuja x väärtus.
- Printige konsoolile tekst.
- Printige muutuja x aadress. Aadressi väärtus salvestati muutujasse ip.
- Printige konsoolile tekst.
- Kursori aadressil salvestatud väärtuse printimine.
- Programm peaks edukal käivitamisel tagastama väärtuse.
- Põhifunktsiooni () keha lõpp.
Osutajad ja massiivid
Massiivid ja osutid töötavad seotud kontseptsiooni alusel. Märkmetega massiividega töötamisel tuleb arvestada erinevatega. Massiivi nimi ise tähistab massiivi põhiaadressi. See tähendab, et massiivile aadressi määramiseks kursorile ei tohiks kasutada ampersandi (&).
Näiteks:
p = arr;
Eeltoodu on õige, kuna arr tähistab massiivi aadressi. Siin on veel üks näide:
p = &arr;
Eeltoodu on vale.
Saame massiivi kaudselt teisendada osuti. Näiteks:
int arr [20];int * ip;
Allpool on kehtiv toiming:
ip = arr;
Pärast ülaltoodud deklaratsiooni on ip ja arr samaväärsed ning nad jagavad omadusi. Siiski saab ip-le määrata erineva aadressi, kuid me ei saa arr-ile midagi määrata.
Näide 2:
Selles näites on näidatud, kuidas massiivi abil osutite abil liikuda:
#includeusing 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äljund:
Siin on ekraanipilt koodist:
Koodi selgitus:
- Deklareerige täisarvu kursori muutuja ip.
- Deklareerige massiiv nimega arr ja salvestage sinna 6 täisarvu.
- Määra arr ip-le. IP ja arr muutuvad samaväärseteks.
- Looge silmuse jaoks a. Silmusmuutuja x loodi massiivi elementide kordamiseks indeksist 0 kuni 5.
- Printige kursori IP-aadressile salvestatud väärtused. Ühe korduse korral tagastatakse üks väärtus ja kokku tehakse 6 kordust. Endl on C ++ märksõna, mis tähendab lõppjoont. See toiming võimaldab teil pärast iga väärtuse printimist viia kursori järgmisele reale. Iga väärtus trükitakse eraldi real.
- Kursori liigutamine järgmisele int-positsioonile pärast iga iteratsiooni.
- Silmuse lõppu.
- Programm peab edukal käivitamisel midagi tagastama.
- Põhifunktsiooni () keha lõpp.
NULL Pointer
Kui täpset aadressi ei määrata, saab kursori muutujale määrata NULL. Seda tuleks teha deklaratsiooni ajal. Sellist kursorit tuntakse nullkursorina. Selle väärtus on null ja see on määratletud paljudes tavapärastes raamatukogudes, nagu iostream.
Näide 3:
#includeusing namespace std;int main() {int *ip = NULL;cout << "Value of ip is: " << ip;return 0;}
Väljund:
Siin on ekraanipilt koodist:
Koodi selgitus:
- Deklareerige kursori muutuja ip ja määrake sellele väärtus NULL.
- Kursori muutuja ip väärtuse printimine konsooli mõne teksti kõrvale.
- Eduka lõpetamise korral peab programm tagastama väärtuse.
- Põhifunktsiooni () keha lõpp.
Muutujate kursorid
C ++ abil saate manipuleerida andmetega otse arvuti mälust.
Mäluruumi saab määrata või ümber määrata vastavalt soovile. Selle võimaldavad kursori muutujad.
Kursori muutujad osutavad kindlale aadressile arvuti mälus, millele osutab teine muutuja.
Seda saab kuulutada järgmiselt:
int *p;
Või
int* p;
Teie näites oleme deklareerinud kursori muutuja p.
Sellel on mäluaadress.
Tärn on diferentsiaaloperaator, mis tähendab kursorit.
Kursor p osutab mälu aadressi täisarvule.
Näide 4:
#includeusing namespace std;int main() {int *p, x = 30;p = &x;cout << "Value of x is: " << *p;return 0;}
Väljund:
Siin on ekraanipilt koodist:
Koodi selgitus:
- Deklareerige kursori muutuja p ja muutuja x väärtusega 30.
- Määrake muutuja x aadress p-le.
- Trükkige osuti muutuja p väärtus konsooli mõne teksti kõrvale.
- Eduka lõpetamise korral peab programm tagastama väärtuse.
- Põhifunktsiooni () keha lõpp.
Näidikute rakendamine
Funktsioonid C ++ keeles tagastavad ainult ühe väärtuse. Edasi eraldatakse kõik funktsioonis deklareeritud muutujad funktsiooni kõne virnas. Niipea kui funktsioon naaseb, hävitatakse kõik virna muutujad.
Funktsiooni argumendid edastatakse väärtuse järgi ja muutujatega tehtud muudatused ei muuda edastatud tegelike muutujate väärtust. Järgmine näide aitab seda mõistet illustreerida:
Näide 5:
#includeusing 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äljund:
Siin on ekraanipilt koodist:
Koodi selgitus:
- Looge funktsiooni test prototüüp, mis võtab kaks täisarvuparameetrit.
- Helistage funktsioonile main (). Lisame programmi loogika selle keha sisse.
- Deklareerige kaks täisarvu muutujat a ja b, kumbagi väärtusega 5.
- Printige konsoolile tekst. Endl (lõpurida) liigutab kursori järgmisel real printimise alustamiseks.
- Trükkige konsoolile muutuja a väärtus muu teksti kõrvale. Endl (lõpurida) liigutab kursori järgmisel real printimise alustamiseks.
- Trükkige konsoolile muutuja b väärtus muu teksti kõrvale. Endl (lõpurida) liigutab kursori järgmisel real printimise alustamiseks.
- Looge funktsioon nimega test (), mis võtab parameetriteks muutuja a ja b aadressi.
- Printige konsoolile tekst. \ N loob enne teksti printimist uue tühja rea. Endl (lõpurida) liigutab kursori printimise alustamiseks järgmisel real pärast teksti printimist.
- Trükkige konsoolile muutuja a väärtus muu teksti kõrvale. Endl (lõpurida) liigutab kursori järgmisel real printimise alustamiseks.
- Trükkige konsoolile muutuja b väärtus muu teksti kõrvale. Endl (lõpurida) liigutab kursori järgmisel real printimise alustamiseks.
- Eduka lõpetamise korral peab programm tagastama väärtuse.
- Põhifunktsiooni () keha lõpp.
- Funktsioonitesti () määratlemine. Funktsioon peaks võtma kaks täisarvu kursori muutujat * n1 ja * n2.
- Määra kursori muutujale * n1 väärtus 10.
- Määra kursori muutujale * n2 väärtus 11.
- Funktsioonikatse keha lõpp ().
Isegi kui funktsiooni testi sees määratakse muutujatele a ja b uued väärtused, ei kajastu funktsioonikõne lõppedes sama funktsioon välimine funktsioon.
Kursorite kasutamine funktsiooniargumentidena aitab muuta funktsiooni muutuja tegeliku aadressi ja kõik muutujas tehtud muudatused kajastuvad välises funktsioonis.
Ülaltoodud juhul on funktsioonil 'test' muutujate 'a' ja 'b' aadress. Need kaks muutujat on funktsiooni 'test' kaudu otse ligipääsetavad ja seega kajastatakse nende muutujate mis tahes muudatusi helistajafunktsioonis 'main'.
Näidikute kasutamise eelised
Siin on näpunäidete kasutamise plussid / eelised
- Kursorid on muutujad, mis salvestavad teiste muutujate aadressi C ++.
- Funktsioonide abil saab osutite abil muuta ja tagastada rohkem kui ühte muutujat.
- Mälu saab osuti abil dünaamiliselt eraldada ja eraldada.
- Näpunäited aitavad programmi keerukust lihtsustada.
- Programmi täitmiskiirus paraneb osutite abil.
Kokkuvõte:
- Kursor viitab muutuja hoidmisaadressile.
- Igal osutil on kehtiv andmetüüp.
- Kursor on mäluaadressi sümboolne esitus.
- Osutajad võimaldavad programmidel simuleerida kõnesidet viitena ning luua ja manipuleerida dünaamiliste andmestruktuuridega.
- Massiivid ja osutid kasutavad seotud mõistet.
- Massiivi nimi tähistab massiivi alust.
- Kui soovite osutada massiivile aadressi, ärge kasutage tähemärki (&).
- Kui osuti muutuja määramiseks pole konkreetset aadressi, määrake sellele NULL.