C++ Osoittimet esimerkeillä

Mitä osoittimet ovat?

In C++, osoitin viittaa muuttujaan, joka sisältää toisen muuttujan osoitteen. Kuten tavallisilla muuttujilla, osoittimilla on tietotyyppi. Esimerkiksi kokonaislukutyyppinen osoitin voi sisältää kokonaislukutyyppisen muuttujan osoitteen. Merkkityyppinen osoitin voi sisältää merkkityypin muuttujan osoitteen.

Sinun pitäisi nähdä osoitin muistiosoitteen symbolisena esityksenä. Osoittimien avulla ohjelmat voivat simuloida puhelun viittaukselta. He voivat myös luoda ja käsitellä dynaamisia tietorakenteita. sisään C++, osoitinmuuttuja viittaa muuttujaan, joka osoittaa tiettyyn osoitteeseen muistissa, johon toinen muuttuja osoittaa.

Osoitteet sisään C++

Ymmärtää C++ osoittimia, sinun on ymmärrettävä, kuinka tietokoneet tallentavat tietoja.

Kun luot muuttujan omaan C++ ohjelma, sille on varattu tilaa tietokoneen muistiin. Tämän muuttujan arvo tallennetaan määritettyyn paikkaan.

Tietääksesi sijainnin tietokoneen muistissa, johon tiedot on tallennettu, C++ tarjoaa & (viite)operaattori. Operaattori palauttaa muuttujan käyttämän osoitteen.

Jos esimerkiksi x on muuttuja, &x palauttaa muuttujan osoitteen.

Osoittimen ilmoituksen syntaksi

Ilmoitus C++ ottaa seuraavan syntaksin:

datatype *variable_name; 
  • Tietotyyppi on osoittimen perustyyppi, jonka on oltava kelvollinen C++ tietotyyppi.
  • Muuttujan_nimi tulee olla osoitinmuuttujan nimi.
  • Yllä osoittimen määrittämiseen käytetty tähti on samanlainen kuin kertolaskuoperaation suorittamiseen käytetty tähti. Se on tähti, joka merkitsee muuttujan osoittimeksi.

Tässä on esimerkki kelvollisista osoitinmäärityksistä 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

Viiteoperaattori (&) ja deference-operaattori (*)

Viiteoperaattori (&) palauttaa muuttujan osoitteen.

Viittauksenpoistooperaattori (*) auttaa saamaan arvon, joka on tallennettu muistiosoitteeseen.

Esimerkiksi:

Jos meillä on muuttuja, jolle on annettu nimi num, tallennettu osoitteeseen 0x234 ja tallennettu arvo 28.

Viiteoperaattori (&) palauttaa arvon 0x234.

Viittauksen poistooperaattori (*) palauttaa 5.

Esimerkki 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;
}

lähtö:

Viiteoperaattori (&) ja deference-operaattori (*)

Kuinka tämä toimii:

Viiteoperaattori (&) ja deference-operaattori (*)

Tässä on kuvakaappaus koodista:

Viiteoperaattori (&) ja deference-operaattori (*)

Koodin selitys:

  1. Tuo iostream-otsikkotiedosto. Näin voimme käyttää otsikkotiedostossa määritettyjä toimintoja ilman virheitä.
  2. Sisällytä std-nimiavaruus, jotta voit käyttää sen luokkia kutsumatta sitä.
  3. Kutsu main()-funktiota. Ohjelmalogiikka tulisi lisätä tämän funktion runkoon. { merkitsee funktion rungon alkua.
  4. Ilmoita kokonaislukumuuttuja x ja anna sille arvo 27.
  5. Ilmoita osoitinmuuttuja *ip.
  6. Tallenna muuttujan x osoite osoitinmuuttujaan.
  7. Tulosta tekstiä konsoliin.
  8. Tulosta muuttujan x arvo näytölle.
  9. Tulosta tekstiä konsoliin.
  10. Tulosta muuttujan x osoite. Osoitteen arvo tallennettiin muuttujaan ip.
  11. Tulosta tekstiä konsoliin.
  12. Tulosta osoittimen osoitteeseen tallennettu arvo.
  13. Ohjelman pitäisi palauttaa arvo onnistuneen suorituksen jälkeen.
  14. Main()-funktion rungon loppu.

Osoittimet ja taulukot

Taulukot ja osoittimet toimivat niihin liittyvän konseptin pohjalta. On eri asioita huomioitava, kun työskentelet taulukoiden kanssa, joissa on osoittimia. Itse taulukon nimi ilmaisee taulukon perusosoitteen. Tämä tarkoittaa, että jos haluat määrittää taulukon osoitteen osoittimelle, sinun ei pitäisi käyttää et-merkkiä (&).

Esimerkiksi:

p = arr;

Yllä oleva pitää paikkansa, koska arr edustaa taulukoiden osoitetta. Tässä on toinen esimerkki:

p = &arr;

Yllä oleva on väärin.

Voimme implisiittisesti muuntaa taulukon osoittimeksi. Esimerkiksi:

int arr [20];
int * ip;

Alla on kelvollinen operaatio:

ip = arr;

Yllä olevan ilmoituksen jälkeen ip ja arr ovat samat, ja niillä on yhteiset ominaisuudet. IP:lle voidaan kuitenkin määrittää eri osoite, mutta emme voi määrittää mitään osoitteelle arr.

Esimerkki 2:

Tämä esimerkki näyttää, kuinka taulukko kulkee osoittimien avulla:

#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;
}

lähtö:

Osoittimet ja taulukot

Tässä on kuvakaappaus koodista:

Osoittimet ja taulukot

Koodin selitys:

  1. Ilmoita kokonaisluku osoitinmuuttuja ip.
  2. Ilmoita taulukko nimeltä arr ja tallenna siihen 6 kokonaislukua.
  3. Määritä arr osoitteeseen ip. ip ja arr tulevat vastaaviksi.
  4. Luo silmukalle. Silmukkamuuttuja x luotiin iteroimaan taulukon elementtejä indeksistä 0–5.
  5. Tulosta osoittimen IP-osoitteeseen tallennetut arvot. Yksi arvo palautetaan per iteraatio, ja yhteensä 6 toistoa tehdään. Loppu on a C++ avainsana, joka tarkoittaa loppuriviä. Tämän toiminnon avulla voit siirtää kohdistimen seuraavalle riville jokaisen arvon tulostuksen jälkeen. Jokainen arvo tulostetaan yksittäiselle riville.
  6. Osoittimen siirtäminen seuraavaan int-kohtaan jokaisen iteraation jälkeen.
  7. For-silmukan loppu.
  8. Ohjelman on palautettava jotain onnistuneen suorituksen jälkeen.
  9. Main()-funktion rungon loppu.

NULL-osoitin

Jos osoitettavaa tarkkaa osoitetta ei ole, osoitinmuuttujalle voidaan antaa NULL. Se tulee tehdä ilmoituksen yhteydessä. Tällainen osoitin tunnetaan nollaosoittimena. Sen arvo on nolla ja se on määritelty monissa vakiokirjastoissa, kuten iostream.

Esimerkki 3:

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

lähtö:

NULL-osoitin

Tässä on kuvakaappaus koodista:

NULL-osoitin

Koodin selitys:

  1. Ilmoita osoitinmuuttuja ip ja anna sille arvo NULL.
  2. Tulosta osoitinmuuttujan ip arvo jonkin tekstin rinnalle konsolissa.
  3. Ohjelman on palautettava arvo, kun se on suoritettu onnistuneesti.
  4. Main()-funktion rungon loppu.

Muuttujien osoittimet

Kanssa C++, voit käsitellä tietoja suoraan tietokoneen muistista.

Muistitilaa voidaan osoittaa tai määrittää uudelleen haluamallasi tavalla. Tämä on mahdollista osoitinmuuttujien ansiosta.

Osoitinmuuttujat osoittavat tiettyyn osoitteeseen tietokoneen muistissa, johon toinen muuttuja osoittaa.

Se voidaan ilmoittaa seuraavasti:

int *p;

Tai,

int* p;

Esimerkissä you, olemme ilmoittaneet osoitinmuuttujan p.

Siinä on muistiosoite.

Asteriski on viittauksen poistooperaattori, joka tarkoittaa osoitinta.

Osoitin p osoittaa kokonaislukuarvoon muistiosoitteessa.

Esimerkki 4:

#include <iostream>

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

lähtö:

Muuttujien osoittimet

Tässä on kuvakaappaus koodista:

Muuttujien osoittimet

Koodin selitys:

  1. Ilmoita osoitinmuuttuja p ja muuttuja x, joiden arvo on 30.
  2. Anna muuttujan x osoite p:lle.
  3. Tulosta osoitinmuuttujan p arvo jonkin tekstin viereen konsoliin.
  4. Ohjelman on palautettava arvo, kun se on suoritettu onnistuneesti.
  5. Main()-funktion rungon loppu.

Osoittimien soveltaminen

Toiminnot C++ voi palauttaa vain yhden arvon. Lisäksi kaikki funktiossa ilmoitetut muuttujat allokoidaan funktiokutsupinoon. Heti kun funktio palaa, kaikki pinon muuttujat tuhoutuvat.

Toiminnon argumentit välitetään arvon mukaan, eivätkä muuttujiin tehdyt muutokset muuta todellisten välitettyjen muuttujien arvoa. Seuraava esimerkki auttaa havainnollistamaan tätä käsitettä: -

Esimerkki 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;
}

lähtö:

Osoittimien soveltaminen

Tässä on kuvakaappaus koodista:

Osoittimien soveltaminen

Koodin selitys:

  1. Luo prototyyppi funktiosta nimeltä testi, joka ottaa kaksi kokonaislukuparametria.
  2. Kutsu main()-funktiota. Lisäämme ohjelmalogiikan sen runkoon.
  3. Määritä kaksi kokonaislukumuuttujaa a ja b, joiden kummankin arvo on 5.
  4. Tulosta tekstiä konsoliin. Endl (loppurivi) siirtää kohdistimen aloittamaan tulostuksen seuraavalta riviltä.
  5. Tulosta muuttujan a arvo konsoliin muun tekstin rinnalle. Endl (loppurivi) siirtää kohdistimen aloittamaan tulostuksen seuraavalta riviltä.
  6. Tulosta muuttujan b arvo konsoliin muun tekstin viereen. Endl (loppurivi) siirtää kohdistimen aloittamaan tulostuksen seuraavalta riviltä.
  7. Luo funktio nimeltä test(), joka ottaa muuttujien a ja b osoitteet parametreiksi.
  8. Tulosta tekstiä konsoliin. \n luo uuden tyhjän rivin ennen kuin teksti tulostetaan. Endl (loppurivi) siirtää kohdistimen aloittamaan tulostuksen seuraavalla rivillä tekstin tulostuksen jälkeen.
  9. Tulosta muuttujan a arvo konsoliin muun tekstin rinnalle. Endl (loppurivi) siirtää kohdistimen aloittamaan tulostuksen seuraavalta riviltä.
  10. Tulosta muuttujan b arvo konsoliin muun tekstin viereen. Endl (loppurivi) siirtää kohdistimen aloittamaan tulostuksen seuraavalta riviltä.
  11. Ohjelman on palautettava arvo, kun se on suoritettu onnistuneesti.
  12. Main()-funktion rungon loppu.
  13. Funktion test() määrittäminen. Funktiolle tulee ottaa kaksi kokonaislukuosoittimen muuttujaa *n1 ja *n2.
  14. Osoitinmuuttujalle *n1 annetaan arvo 10.
  15. Osoitinmuuttujalle *n2 annetaan arvo 11.
  16. Toimintatestin().

Vaikka funktiotestin sisällä muuttujalle a ja b annetaan uudet arvot, funktiokutsun päätyttyä sama ei heijastu ulkoiseen funktion main.

Osoittimien käyttäminen funktion argumentteina auttaa välittämään muuttujan todellisen osoitteen funktiossa, ja kaikki muuttujaan tehdyt muutokset näkyvät ulkofunktiossa.

Yllä olevassa tapauksessa funktiolla "test" on muuttujien "a" ja "b" osoite. Näihin kahteen muuttujaan pääsee suoraan funktiosta "test", joten kaikki näihin muuttujiin tehdyt muutokset näkyvät kutsujan funktiossa "main".

Osoittimien käytön edut

Tässä on osoittimien käytön edut/edut

  • Osoittimet ovat muuttujia, jotka tallentavat muiden osoitteen muuttujat sisään C++.
  • Useampaa kuin yhtä muuttujaa voidaan muokata ja palauttaa funktiolla osoittimien avulla.
  • Muistia voidaan varata dynaamisesti ja purkaa osoittimien avulla.
  • Osoittimet auttavat yksinkertaistamaan ohjelman monimutkaisuutta.
  • Ohjelman suoritusnopeus paranee käyttämällä osoittimia.

Yhteenveto

  • Osoitin viittaa toisen muuttujan muuttujan pito-osoitteeseen.
  • Jokaisella osoittimella on kelvollinen tietotyyppi.
  • Osoitin on symbolinen esitys muistiosoitteesta.
  • Osoittimet sallivat ohjelmien simuloida puhelun viittaukselta sekä luoda ja käsitellä dynaamisia tietorakenteita.
  • taulukot ja osoittimet käyttävät asiaan liittyvää käsitettä.
  • Taulukon nimi ilmaisee taulukon kantaa.
  • Jos haluat määrittää taulukon osoitteen osoittimelle, älä käytä et-merkkiä (&).
  • Jos osoitinmuuttujalle ei ole määritetty osoitetta, määritä sille NULL.