Mõlemad näpunäited ja viited on C ja C ++ kõige võimsamad funktsioonid, mis võimaldavad programmeerijatel mälu aadressiga otse mälu haldamiseks hallata..
Mõlemad on muutujad, mida kasutatakse kaudseks viitamiseks teistele objektidele ja neil on pinnal mõned ühised jooned. Kuigi neil on palju ühiseid võimalusi, on neid ka väga keeruline mõista.
Osuti on muutuja, mis hoiab teise muutuja mäluaadressi, samas kui viide on nagu osuti, mida saab kasutada kaudseks viitamiseks teisele muutujale.
Tundub, et enamikul programmeerijatest on teada mõistmist, millal viiteid kasutada ja millal viiteid kasutada, kuid sageli puutuvad nad kokku probleemidega, mille lahendus tundub ebaselge..
Nii et filosoofia paremaks mõistmiseks mõistame nende kahe erinevust.
Iga muutuja on mälu asukoht, mis määratletakse aadressi järgi ja on seotud identifikaatoriga, mis sisaldab väärtust, mida võib programmi käigus muuta. Lihtsamalt öeldes on muutuja sümbol, mis tähistab kogust.
Kursor on muutuja, mis sisaldab mõne muu muutuja mäluaadressi. Osuti pole midagi muud kui aadress ja kursorit talletavat muutujat nimetatakse osuti muutujaks.
Idee on kasutada numbriliste aadresside asemel tunnuseid (või nimesid), et leevendada programmeerimise koormust, vähendades sellega programmide keerukust. Kuna need aadressid viitavad tegelikele asukohtadele arvutimälus, saab viiteid kasutada mällu salvestatud sisule juurdepääsuks ja sellega manipuleerimiseks.
Nagu iga muutuv või konstant, tuleb ka viited nende tüüpide kohta deklareerida. Kuna osutid sisaldavad eraldi andmetüübile kuuluvaid mäluaadresse, tuleb need enne nendega töötamist osutiga osutada. Osuti deklaratsiooni üldvorm on:
Data_type * var-name;
Siin on osuti põhitüübiks “Data_type” ja osutimuutujaks “var-name”. Tärni (*) kasutatakse siin osuti deklareerimiseks, mis tähistab muutujat „var-name” osutimuutujana.
int * p; // täisarv osuti
ujuk * x; // ujuki osuti
Muutuja „p” osutab siin täisarvutüübile, mida deklareeritakse kui „int”, mis viitab muutuja andmetüübile. Samamoodi viitab teises näites “hõljumine” muutuja “x” andmetüübile, mida tegelikult nimetatakse ujukoma muutuja osutiks.
Viide on nagu osuti, millel on kaudne juurdepääs muutujale. See on nagu teise muutuja varjunimi, mis tähendab, et see on lihtsalt juba olemasoleva muutuja teine nimi.
See võimaldab programmeerijatel luua muutujale teise nime, mida nad saavad kasutada muutuja salvestatud sisuga manipuleerimiseks. See on entiteet, mis on teise muutuja varjunimi ja sellel on sama aadress, mis algsel muutujal. See toetab funktsiooni formaalsete parameetritena toimivat möödasõitu ja kui see on määratletud muutujale viitamiseks, ei saa seda uuesti asetada, mis tähendab, et sellele ei saa viidata teisele muutujale.
Erinevalt osutitest ei vaja nad väärtusele juurdepääsu saamiseks deferentide eemaldamist; tegelikult saab neid kasutada nagu tavalisi muutujaid.
int i;
int & ri = i;
“Ri” on siin täisarv, mis on initsialiseeritud arvuga “i”. See kuulutab ri-i tüübiks „viide int-le”. Viidet saab hõlpsalt segi ajada osutiga, mis on iseseisev muutuja, mille aadressi väärtusi ei saa pärast loomist uuesti määrata.
- Mõlemad pakuvad kasutatavuse osas peaaegu sarnaseid võimalusi ja eristamine võib olla keeruline. Osuti on lihtsalt muutuja, mis salvestab mõne muu muutuja mäluaadressi, samas kui viide on nagu juba olemasoleva muutuja varjunimi. See loob muutujale teise nime, mida saab kasutada muutujasse salvestatud sisu muutmiseks.
- Osuti on nagu iga teine muutuja, mis salvestab tükikese andmeid. Erinevalt teistest muutujatest salvestavad osutimuutujad väärtuste asemel mäluaadressid. Osuti eemaldamine toimub, kasutades sisselõikeoperaatorit *, et pääseda juurde muutuja mälukohale, millele see osutab. Viide seevastu ei vaja väärtuse juurde pääsemiseks ühtegi operatsiooni lõpetamise operaatorit.
- Erinevalt osutitest, mida saab igal ajal initsialiseerida, tuleb initsialiseerimisel määrata viited. Osutitele pääseb otse juurde, viidetele aga otse juurde ei pääse.
- Osuti muutujal on mälus oma asukoht, mis tähendab, et osuti kuulutamisel peate määrama asukoha, mis on mäluaadress, mis on määratud igale mäluühikule. Osuti muutujal on sama aadress, kuhu see mällu salvestatakse. Viitemuutuja seevastu on teise muutuja varjunimi, võttes sellega võrdlusmuutuja aadressi.
- NULL tähistab loendi lõppu, mis tähendab, et väärtus on teadmata ja täpsustatakse, et muutujal puudub kehtiv aadressiruum. NULL-i väärtuse saab osutada muutujale otse, mis viitab sellele, et see ei osuta kuhugi, samas kui NULL-i ei saa omistada võrdlusmuutujale.
Osutused on alati olnud C / C ++ programmeerijate lemmikteemade hulgas, kuni viited pildile jõudsid. Viited on mõneti sarnased osutitega, kuid nende plusside ja miinuste osakaal on võrdluses õiglane. Ehkki mõlemat saab kasutada ühe funktsiooni lokaalsete muutujate muutmiseks teises funktsioonis, on neil erinevused. Mõlemad on C ja C ++ võimsad funktsioonid, mis võimaldavad teil vaid mõne erandiga mälu otse käsitseda. Osuti hoiab muutuja mäluaadressi, samas kui viide on lihtsalt teise muutuja varjunimi.