C++ Osoittimet esimerkeillä

⚡ Älykäs yhteenveto

Osoitin sisään C++ on muuttuja, joka tallentaa toisen muuttujan muistiosoitteen. Tässä artikkelissa opit osoittimien toiminnan, niiden määrittelyn ja käytön, viittaus- ja viittauksen poisto-operaattorit, null-osoittimet ja niiden edut.

  • 📍 Mitä se on: Osoitin tallentaa toisen muuttujan muistiosoitteen.
  • 🔧 ilmoitus: Määrittele osoitin tähdellä, kuten int *ptr;.
  • 🔗 Operatorit: Käytä &-merkkiä osoitteen hakemiseen ja *-merkkiä sen arvon tarkastelemiseen.
  • 🚫 TYHJÄ: Null-osoitin osoittaa ei mihinkään ja sitä käytetään turvalliseen alustukseen.
  • 🤖 Tekoälyn apu: Tekoälytyökalut, kuten GitHub Copilot, kirjoittavat ja debuggaavat osoitinkoodia välittömästi.

C++ Osoittimet

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 (*)

Code 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

Code 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

Code 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

Code 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

Code 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.

UKK

Osoitin on muuttuja, joka tallentaa toisen muuttujan muistiosoitteen. Sen sijaan, että se tallentaisi arvon suoraan, se tallentaa sijainnin muistissa, jossa arvo säilytetään.

Määrittele osoitin sijoittamalla tähti tietotyypin ja nimen väliin, kuten int *ptr;. Tämä luo osoittimen, joka voi tallentaa kokonaisluvun osoitteen.

Viittausoperaattori & palauttaa muuttujan muistiosoitteen ja viittauksen poistooperaattori * käyttää osoittimen hallussa olevaan osoitteeseen tallennettua arvoa.

NULL-osoitin on osoitin, joka ei osoita mihinkään kelvolliseen muistipaikkaan. Sille annetaan NULL, jotta se olisi tyhjä ja jotta vältetään alustamattoman osoitteen käyttö.

Taulukon nimi toimii osoittimena sen ensimmäiseen elementtiin, joten voit käyttää osoittimen aritmetiikkaa liikkuaksesi taulukon elementtien välillä indeksinumeroiden sijaan.

Tekoälyavustajat, kuten GitHub Copilot, luovat osoittimien määrittelyjä, kirjoittavat osoittimien aritmetiikkaa ja merkitsevät roikkuvia tai null-osoittimen käyttöjä, jotka voivat kaataa ohjelman.

Kyllä. Tekoälyllä toimivat työkalut havaitsevat muistivuodot, roikkuvat osoittimet ja null-viittausten poistot ja ehdottavat älykkäitä osoittimia, kuten unique_ptr, turvallisempaa muistinhallintaa varten.

Osoittimet mahdollistavat suoran muistin käytön, tehokkaan taulukoiden ja merkkijonojen käsittelyn, dynaamisen muistin allokoinnin ja suurten tietomäärien välittämisen funktioille kopioimatta niitä.

Tiivistä tämä viesti seuraavasti: