C ++ mutatók példákkal

Tartalomjegyzék:

Anonim

Mik azok a mutatók?

A C ++ nyelvben a mutató egy olyan változóra utal, amely egy másik változó címét tartalmazza. A normál változókhoz hasonlóan a mutatóknak is van adattípusuk. Például egy egész típusú mutató tartalmazhatja az egész típusú változó címét. Egy karakter típusú mutató tartalmazhatja egy karakter típusú változó címét.

A mutatót a memóriacím szimbolikus ábrázolásaként kell látnia. Mutatókkal a programok szimulálhatják a hívás-referenciát. Dinamikus adatszerkezeteket is létrehozhatnak és manipulálhatnak. A C ++ - ban a mutató változó egy olyan változóra utal, amely egy másik változó által mutatott memóriában egy adott címre mutat.

Ebben a C ++ oktatóanyagban megtudhatja:

  • Mik azok a mutatók?
  • Címek C ++ nyelven
  • Mutatói nyilatkozat szintaxisa
  • Referencia operátor (&) és referencia operátor (*)
  • Mutatók és tömbök
  • NULL Pointer
  • Változók mutatói
  • A mutatók alkalmazása
  • A mutatók használatának előnyei

Címek C ++ nyelven

A C ++ mutatók megértéséhez meg kell értenie, hogy a számítógépek hogyan tárolják az adatokat.

Amikor létrehoz egy változót a C ++ programban, akkor a számítógép memóriájának van helye. Ennek a változónak az értéke a kijelölt helyen tárolódik.

A számítógép memóriájában az adatok tárolásának helyének megismeréséhez a C ++ megadja az & (referencia) operátort. Az operátor visszaadja a változó által elfoglalt címet.

Például, ha x változó, az & x adja a változó címét.

Mutatói nyilatkozat szintaxisa

A C ++ deklarációja a következő szintaxist veszi fel:

datatype *variable_name;
  • Az adattípus a mutató alaptípusa, amelynek érvényes C ++ adattípusnak kell lennie.
  • A változó_nevének a mutató változónak kell lennie.
  • A fenti mutató deklarálásához használt csillag hasonló a szorzási művelethez használt csillaghoz. A csillag jelöli a változót mutatóként.

Íme egy példa az érvényes mutató deklarációkra a C ++ nyelven:

int *x; // a pointer to integerdouble *x; // a pointer to doublefloat *x; // a pointer to floatchar *ch // a pointer to a character

Referencia operátor (&) és referencia operátor (*)

A referencia operátor (&) visszaadja a változó címét.

A dereference operátor (*) segít abban, hogy megszerezzük a memória címben tárolt értéket.

Például:

Ha van egy változónk, amelynek megadjuk a num nevet, a 0x234 címben tároljuk és a 28 értéket tároljuk.

A referencia operátor (&) 0x234 értéket ad vissza.

A dereference operátor (*) 5-öt ad vissza.

1. példa:

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

Kimenet:

Hogyan működik ez:

Itt van egy képernyőkép a kódról:

Kód Magyarázat:

  1. Importálja az iostream fejlécfájlt. Ez lehetővé teszi számunkra, hogy a fejlécfájlban definiált funkciókat hibák nélkül használjuk.
  2. Tartsa be az std névteret, hogy az osztályait hívás nélkül használhassa.
  3. Hívja meg a main () függvényt. A program logikát hozzá kell adni ennek a függvénynek a törzséhez. A {a függvény testének kezdetét jelöli.
  4. Nyújtsa be az x egész változót, és rendeljen hozzá 27 értéket.
  5. Nyújtson be egy mutatóváltozót * ip.
  6. Tárolja az x változó címét a mutató változóba.
  7. Nyomtasson ki egy kis szöveget a konzolra.
  8. Nyomtassa ki az x változó értékét a képernyőn.
  9. Nyomtasson ki egy kis szöveget a konzolra.
  10. Nyomtassa ki az x változó címét. A cím értékét az ip változóban tároltuk.
  11. Nyomtasson ki egy kis szöveget a konzolra.
  12. A mutató címén tárolt érték nyomtatása.
  13. A programnak vissza kell térnie az értékre a sikeres végrehajtás után.
  14. A fő () függvény törzsének vége.

Mutatók és tömbök

A tömbök és mutatók egy kapcsolódó koncepció alapján működnek. Különböző dolgokat kell figyelembe venni, ha mutatós tömbökkel dolgozunk. A tömb neve maga a tömb alapcímét jelöli. Ez azt jelenti, hogy egy tömb címének a mutatóhoz való hozzárendeléséhez ne használjon ampersandot (&).

Például:

p = arr;

A fentiek helyesek, mivel az arr a tömbök címét jelenti. Itt van egy másik példa:

p = &arr;

A fentiek helytelenek.

Implicit módon átalakíthatunk egy tömböt mutatóvá. Például:

int arr [20];int * ip;

Az alábbiakban érvényes művelet található:

ip = arr;

A fenti deklaráció után az ip és az arr ekvivalens lesz, és megosztják a tulajdonságokat. Az ip-hez azonban más címet is rendelhetünk, de az arr-hoz nem rendelhetünk semmit.

2. példa:

Ez a példa bemutatja, hogyan lehet egy tömböt végigvinni mutatók segítségével:

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

Kimenet:

Itt van egy képernyőkép a kódról:

Kód Magyarázat:

  1. Nyújtson be egy egész mutató változót ip.
  2. Nyújtsa be az arr nevű tömböt, és tároljon benne 6 egész számot.
  3. Rendelje az arr-t az ip-hez. Az ip és arr egyenértékűvé válik.
  4. Hozzon létre egy ciklust. Az x hurokváltozó azért jött létre, hogy a 0-tól 5-ig terjedő tömbelemeken ismétlődjön.
  5. Nyomtassa ki a mutató IP címén tárolt értékeket. Iterációnként egy értéket adunk vissza, és összesen 6 ismétlést hajtunk végre. Az endl egy C ++ kulcsszó, amely a végvonalat jelenti. Ez a művelet lehetővé teszi a kurzor áthelyezését a következő sorra minden érték kinyomtatása után. Minden érték külön sorban kerül kinyomtatásra.
  6. A mutató áthelyezése a következő int pozícióba minden iteráció után.
  7. A ciklus vége.
  8. A programnak valamit vissza kell adnia a sikeres végrehajtás után.
  9. A fő () függvénytest vége.

NULL Pointer

Ha nincs pontos cím, amelyet hozzá kell rendelni, akkor a mutató változóhoz NULL is rendelhető. A nyilatkozat során kell megtenni. Egy ilyen mutatót null pointerként ismerünk. Értéke nulla, és számos szabványos könyvtárban, például az iostreamben van meghatározva.

3. példa:

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

Kimenet:

Itt van egy képernyőkép a kódról:

Kód Magyarázat:

  1. Nyújtsa be az ip mutatóváltozót, és rendeljen hozzá NULL értéket.
  2. Az ip mutatóváltozó értéke a konzolon lévő szöveg mellett.
  3. A programnak a sikeres befejezés után vissza kell térnie az értékre.
  4. A fő () függvény törzsének vége.

Változók mutatói

A C ++ segítségével manipulálhatja az adatokat közvetlenül a számítógép memóriájából.

A memóriaterület tetszés szerint hozzárendelhető vagy átadható. Ezt a Pointer változók teszik lehetővé.

A mutatóváltozók a számítógép memóriájában egy adott címre mutatnak, amelyet egy másik változó mutat.

A következőképpen deklarálható:

int *p;

Vagy,

int* p;

A te példában deklaráltuk a p mutatóváltozót.

Memóriacímet fog tartalmazni.

A csillag a dereference operátor, amely a mutatót jelenti.

A p mutató a memóriacímben egy egész értékre mutat.

4. példa:

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

Kimenet:

Itt van egy képernyőkép a kódról:

Kód Magyarázat:

  1. Deklaráljuk a p mutatóváltozót és az x változót 30 értékkel.
  2. Rendelje az x változó címét p-hez.
  3. Nyomtassa ki a p mutatóváltozó értékét a konzolon lévő szöveg mellé.
  4. A programnak a sikeres befejezés után vissza kell térnie az értékre.
  5. A fő () függvény törzsének vége.

A mutatók alkalmazása

A C ++ funkciók csak egy értéket adhatnak vissza. Ezenkívül az összes függvényben deklarált változó lefoglalásra kerül a függvényhívási veremben. Amint a függvény visszatér, az összes veremváltozó megsemmisül.

A függvény argumentumai érték szerint kerülnek átadásra, és a változókon végzett bármilyen módosítás nem változtatja meg a tényleges átadott változók értékét. A következő példa segít szemléltetni ezt a koncepciót: -

5. példa:

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

Kimenet:

Itt van egy képernyőkép a kódról:

Kód Magyarázat:

  1. Hozzon létre egy teszt nevű függvény prototípusát, amely két egész paramétert vesz fel.
  2. Hívja meg a main () függvényt. Hozzáadjuk a program logikáját a testébe.
  3. Nyújtsunk be két egész változót, a és b, mindegyik értéke 5.
  4. Nyomtasson ki egy kis szöveget a konzolra. Az endl (végsor) mozgatja a kurzort a nyomtatás megkezdéséhez a következő sorban.
  5. Az a változó értékét nyomtassa ki a konzolra más szöveg mellé. Az endl (végvonal) mozgatja a kurzort a nyomtatás megkezdéséhez a következő sorban.
  6. Nyomtassa ki a b változó értékét a konzolra más szöveg mellé. Az endl (végvonal) mozgatja a kurzort a nyomtatás megkezdéséhez a következő sorban.
  7. Hozzon létre egy test () nevű függvényt, amely paraméterként felveszi az a és b változó címeit.
  8. Nyomtasson ki egy kis szöveget a konzolra. A \ n új üres sort hoz létre a szöveg nyomtatása előtt. Az endl (végsor) mozgatja a kurzort a nyomtatás megkezdéséhez a következő sorban, miután a szöveget kinyomtatták.
  9. Az a változó értékét nyomtassa ki a konzolra más szöveg mellé. Az endl (végvonal) mozgatja a kurzort a nyomtatás megkezdéséhez a következő sorban.
  10. Nyomtassa ki a b változó értékét a konzolra más szöveg mellé. Az endl (végvonal) mozgatja a kurzort a nyomtatás megkezdéséhez a következő sorban.
  11. A programnak a sikeres befejezés után vissza kell térnie az értékre.
  12. A fő () függvény törzsének vége.
  13. A funkció teszt () meghatározása. A függvénynek két egész mutatóváltozót kell tartalmaznia * n1 és * n2.
  14. A * n1 mutatóváltozó hozzárendelése 10-hez.
  15. A * n2 mutatóváltozóhoz 11 értéket rendelünk.
  16. A funkcióteszt törzsének vége ().

Még akkor is, ha a funkcióteszten belül új értékeket rendelünk az a és b változóhoz, a függvényhívás befejezése után ugyanez nem tükröződik a külső fő funkcióban.

A mutatók függvényargumentumként való használata segít átadni a változó tényleges címét a függvényben, és a változón végrehajtott összes változás a külső függvényben is megjelenik.

A fenti esetben a „test” függvény az „a” és „b” változók címével rendelkezik. Ez a két változó közvetlenül hozzáférhető a „teszt” függvényből, és ezért az ezeken a változókon végrehajtott bármilyen változás megjelenik a „main” hívó függvényben.

A mutatók használatának előnyei

Itt vannak a mutatók használatának előnyei / előnyei

  • A mutatók olyan változók, amelyek a C ++ - ban tárolják a többi változó címét.
  • Több változó módosítható és visszaadható a függvény segítségével a mutatók segítségével.
  • A memória dinamikusan lefoglalható és kiosztható mutatók segítségével.
  • A mutatók segítenek a program összetettségének egyszerűsítésében.
  • Mutatók használatával javul a program végrehajtási sebessége.

Összegzés:

  • A mutató egy másik változó változótartó címére utal.
  • Minden mutatónak érvényes adattípusa van.
  • A mutató a memóriacím szimbolikus ábrázolása.
  • A mutatók lehetővé teszik a programok számára a hívás-referencia szimulálását, valamint dinamikus adatstruktúrák létrehozását és manipulálását.
  • A tömbök és mutatók kapcsolódó fogalmat használnak.
  • A tömb neve a tömb alapját jelöli.
  • Ha egy tömb címét szeretné hozzárendelni egy mutatóhoz, ne használjon jelet (&).
  • Ha nincs külön cím a mutatóváltozó hozzárendeléséhez, rendeljen hozzá NULL értéket.