C++ Osutajad näidetega

Mis on osutid?

In C++, viitab osuti muutujale, mis sisaldab teise muutuja aadressi. Nagu tavalistel muutujatel, on osutitel andmetüüp. Näiteks täisarvu tüüpi kursor võib sisaldada täisarvu tüüpi muutuja aadressi. Märgi tüüpi kursor võib sisaldada märgitüüpi muutuja aadressi.

Peaksite nägema kursorit mäluaadressi sümboolse esitusena. Osutajate abil saavad programmid simuleerida kõne viitepõhiselt. Samuti saavad nad luua dünaamilisi andmestruktuure ja nendega manipuleerida. sisse C++, viitab osuti muutuja muutujale, mis osutab mälus olevale kindlale aadressile, millele osutab teine ​​muutuja.

Aadressid sisse C++

Aru saama C++ näpunäiteid, peate mõistma, kuidas arvutid andmeid salvestavad.

Kui loote oma C++ programmi, on sellele arvutimälus määratud ruumi. Selle muutuja väärtus salvestatakse määratud asukohta.

Et teada asukohta arvuti mälus, kuhu andmed salvestatakse, C++ pakub & (viite)operaator. Operaator tagastab muutuja hõivatud aadressi.

Näiteks kui x on muutuja, tagastab &x muutuja aadressi.

Osuti deklaratsiooni süntaks

Deklaratsioon C++ võtab järgmise süntaksi:

datatype *variable_name; 
  • Andmetüüp on kursori põhitüüp, mis peab olema kehtiv C++ andmetüüp.
  • Muutuja_nimi peaks olema kursori muutuja nimi.
  • Ülalpool kursori deklareerimiseks kasutatud tärn on sarnane korrutamistoimingu sooritamiseks kasutatava tärniga. See on tärn, mis tähistab muutujat kursorina.

Siin on näide kehtivatest osuti deklaratsioonidest C++:

int    *x;    // a pointer to integer
double *x;    // a pointer to double
float  *x;    // a pointer to float
char   *ch     // a pointer to a character

Võrdlusoperaator (&) ja deferentsioperaator (*)

Viiteoperaator (&) tagastab muutuja aadressi.

Viitamise operaator (*) aitab meil saada mäluaadressile salvestatud väärtust.

Näiteks:

Kui meil on muutuja nimega num, mis on salvestatud aadressile 0x234 ja salvestatakse väärtus 28.

Viiteoperaator (&) tagastab väärtuse 0x234.

Viiteoperaator (*) tagastab 5.

Näide 1:

#include <iostream>
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äljund:

Võrdlusoperaator (&) ja deferentsioperaator (*)

Kuidas see toimib:

Võrdlusoperaator (&) ja deferentsioperaator (*)

Siin on koodi ekraanipilt:

Võrdlusoperaator (&) ja deferentsioperaator (*)

Koodi selgitus:

  1. Importige iostreami päisefail. See võimaldab meil kasutada päisefailis määratletud funktsioone ilma vigadeta.
  2. Kaasake std-nimeruum, et kasutada selle klasse ilma seda kutsumata.
  3. Kutsuge välja funktsioon main(). Programmi loogika tuleks lisada selle funktsiooni kehasse. { tähistab funktsiooni keha algust.
  4. Deklareerige täisarvuline muutuja x ja määrake sellele väärtus 27.
  5. Deklareerige kursori muutuja *ip.
  6. Salvestage muutuja x aadress kursori muutujas.
  7. Printige konsoolile teksti.
  8. Printige ekraanile muutuja x väärtus.
  9. Printige konsoolile teksti.
  10. Printige muutuja x aadress. Aadressi väärtus salvestati muutujasse ip.
  11. Printige konsoolile teksti.
  12. Kursori aadressile salvestatud väärtuse printimine.
  13. Programm peaks eduka täitmise korral tagastama väärtuse.
  14. Funktsiooni main() keha lõpp.

Osutajad ja massiivid

Massiivid ja osutid töötavad seotud kontseptsiooni alusel. Osutitega massiividega töötamisel tuleb märkida erinevaid asju. Massiivi nimi ise tähistab massiivi baasaadressi. See tähendab, et massiivi aadressi määramiseks osutile ei tohiks kasutada ampersandi (&).

Näiteks:

p = arr;

Ülaltoodu on õige, kuna arr tähistab massiivi aadressi. Siin on veel üks näide:

p = &arr;

Ülaltoodu on vale.

Saame kaudselt teisendada massiivi osutiks. Näiteks:

int arr [20];
int * ip;

Allpool on kehtiv toiming:

ip = arr;

Pärast ülaltoodud deklaratsiooni on ip ja arr samaväärsed ning need jagavad atribuute. IP-le saab aga määrata erineva aadressi, kuid arr-ile ei saa me midagi määrata.

Näide 2:

See näide näitab, kuidas massiivi läbida osutite abil:

#include <iostream>
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äljund:

Osutajad ja massiivid

Siin on koodi ekraanipilt:

Osutajad ja massiivid

Koodi selgitus:

  1. Deklareerib täisarvu osuti muutuja ip.
  2. Deklareerige massiiv nimega arr ja salvestage sinna 6 täisarvu.
  3. Määra arr ip-le. IP ja arr muutuvad samaväärseteks.
  4. Loo silmuse jaoks. Silmusmuutuja x loodi massiivi elementide itereerimiseks indeksist 0 kuni 5.
  5. Printige kursori IP-aadressile salvestatud väärtused. Iga iteratsiooni kohta tagastatakse üks väärtus ja kokku tehakse 6 kordust. Endl on a C++ märksõna, mis tähendab lõpprida. See toiming võimaldab teil pärast iga väärtuse printimist viia kursori järgmisele reale. Iga väärtus trükitakse eraldi reale.
  6. Kursori liigutamiseks pärast iga iteratsiooni järgmisse sisekohta.
  7. Silmuse lõpp.
  8. Programm peab eduka täitmise korral midagi tagastama.
  9. Funktsiooni main() keha lõpp.

NULL osuti

Kui täpset aadressi ei ole, saab osuti muutujale määrata NULL. Seda tuleks teha deklaratsiooni ajal. Sellist osutit tuntakse nullosutina. Selle väärtus on null ja see on määratletud paljudes standardsetes teekides, näiteks iostream.

Näide 3:

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

Väljund:

NULL osuti

Siin on koodi ekraanipilt:

NULL osuti

Koodi selgitus:

  1. Deklareerige kursori muutuja ip ja määrake sellele väärtus NULL.
  2. Trüki kursori muutuja ip väärtus koos mõne tekstiga konsoolil.
  3. Programm peab pärast edukat lõpetamist tagastama väärtuse.
  4. Funktsiooni main() keha lõpp.

Muutujate osutid

koos C++, saate andmeid otse arvuti mälust töödelda.

Mäluruumi saab vastavalt soovile määrata või ümber määrata. See on võimalik tänu osuti muutujatele.

Osutimuutujad osutavad arvuti mälus olevale kindlale aadressile, millele osutab mõni muu muutuja.

Seda saab deklareerida järgmiselt:

int *p;

Või

int* p;

Teie näites oleme deklareerinud osuti muutuja p.

See hoiab mäluaadressi.

Tärn on viite tühistamise operaator, mis tähendab kursorit.

Osuti p osutab täisarvu väärtusele mäluaadressis.

Näide 4:

#include <iostream>

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

Väljund:

Muutujate osutid

Siin on koodi ekraanipilt:

Muutujate osutid

Koodi selgitus:

  1. Deklareerida osutimuutuja p ja muutuja x väärtusega 30.
  2. Määrake muutuja x aadress p-le.
  3. Printige kursori muutuja p väärtus konsoolil mõne teksti kõrvale.
  4. Programm peab pärast edukat lõpetamist tagastama väärtuse.
  5. Funktsiooni main() keha lõpp.

Osutite rakendamine

Funktsioonid sees C++ saab tagastada ainult ühe väärtuse. Lisaks eraldatakse kõik funktsioonis deklareeritud muutujad funktsioonikutse pinusse. Niipea kui funktsioon naaseb, hävitatakse kõik virna muutujad.

Funktsiooni argumendid edastatakse väärtuste alusel ja muutujates tehtud muudatused ei muuda tegelike edastatavate muutujate väärtust. Järgmine näide aitab seda kontseptsiooni illustreerida:

Näide 5:

#include <iostream>

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äljund:

Osutite rakendamine

Siin on koodi ekraanipilt:

Osutite rakendamine

Koodi selgitus:

  1. Looge funktsiooni prototüüp nimega test, mis võtab kaks täisarvu parameetrit.
  2. Kutsuge välja funktsioon main(). Lisame programmi loogika selle kehasse.
  3. Deklareerige kaks täisarvu muutujat a ja b, mõlema väärtusega 5.
  4. Printige konsoolile teksti. Endl (lõpurida) liigutab kursori, et alustada printimist järgmisel real.
  5. Trüki muutuja a väärtus konsoolil koos muu tekstiga. Endl (lõpus rida) liigutab kursori, et alustada printimist järgmisel real.
  6. Printige muutuja b väärtus konsoolil koos muu tekstiga. Endl (lõpurida) liigutab kursori, et alustada printimist järgmisel real.
  7. Looge funktsioon nimega test(), mis võtab parameetritena muutuja a ja b aadressid.
  8. Printige konsoolile teksti. \n loob enne teksti printimist uue tühja rea. Endl (lõpusarida) liigutab kursori, et alustada printimist järgmisel real pärast teksti printimist.
  9. Trüki muutuja a väärtus konsoolil koos muu tekstiga. Endl (lõpus rida) liigutab kursori, et alustada printimist järgmisel real.
  10. Printige muutuja b väärtus konsoolil koos muu tekstiga. Endl (lõpurida) liigutab kursori, et alustada printimist järgmisel real.
  11. Programm peab pärast edukat lõpetamist tagastama väärtuse.
  12. Funktsiooni main() keha lõpp.
  13. Funktsiooni test() määratlemine. Funktsioon peaks võtma kaks täisarv osuti muutujat *n1 ja *n2.
  14. Osutimuutujale *n1 väärtuse 10 määramine.
  15. Osutimuutujale *n2 väärtuse 11 määramine.
  16. Funktsioonitesti() keha lõpp.

Kuigi funktsioonitestis omistatakse muutujatele a ja b uued väärtused, ei kajastu see pärast funktsioonikutse lõppemist välise funktsiooni peamises.

Osutite kasutamine funktsiooni argumentidena aitab funktsioonis edastada muutuja tegelikku aadressi ja kõik muutujaga tehtud muudatused kajastuvad välisfunktsioonis.

Ülaltoodud juhul on funktsioonil "test" muutujate "a" ja "b" aadress. Need kaks muutujat on otse juurdepääsetavad funktsioonist "test" ja seega kajastuvad kõik nende muutujate muudatused helistaja funktsioonis "main".

Osutite kasutamise eelised

Siin on osutite kasutamise plussid/kasud

  • Osutajad on muutujad, mis salvestavad teise aadressi muutujad sisse C++.
  • Funktsioon saab osutite abil muuta ja tagastada rohkem kui ühte muutujat.
  • Mälu saab dünaamiliselt eraldada ja eraldada osutite abil.
  • Osutajad aitavad programmi keerukust lihtsustada.
  • Programmi täitmiskiirus paraneb osutite kasutamisega.

kokkuvõte

  • Osuti viitab teise muutuja muutuja hoidmisaadressile.
  • Igal kursoril on kehtiv andmetüüp.
  • Osuti on mäluaadressi sümboolne esitus.
  • Osutajad võimaldavad programmidel simuleerida kõne viitepõhiselt ning luua ja manipuleerida dünaamilisi andmestruktuure.
  • Massiraadid ja osutajad kasutavad seotud mõistet.
  • Massiivi nimi tähistab massiivi baasi.
  • Kui soovite määrata kursorile massiivi aadressi, ärge kasutage ampersandi (&).
  • Kui osuti muutuja määramiseks pole konkreetset aadressi, määrake sellele NULL.