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:
#includeusing 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:
- 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.
- Tartsa be az std névteret, hogy az osztályait hívás nélkül használhassa.
- 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.
- Nyújtsa be az x egész változót, és rendeljen hozzá 27 értéket.
- Nyújtson be egy mutatóváltozót * ip.
- Tárolja az x változó címét a mutató változóba.
- Nyomtasson ki egy kis szöveget a konzolra.
- Nyomtassa ki az x változó értékét a képernyőn.
- Nyomtasson ki egy kis szöveget a konzolra.
- Nyomtassa ki az x változó címét. A cím értékét az ip változóban tároltuk.
- Nyomtasson ki egy kis szöveget a konzolra.
- A mutató címén tárolt érték nyomtatása.
- A programnak vissza kell térnie az értékre a sikeres végrehajtás után.
- 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:
#includeusing 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:
- Nyújtson be egy egész mutató változót ip.
- Nyújtsa be az arr nevű tömböt, és tároljon benne 6 egész számot.
- Rendelje az arr-t az ip-hez. Az ip és arr egyenértékűvé válik.
- 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.
- 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.
- A mutató áthelyezése a következő int pozícióba minden iteráció után.
- A ciklus vége.
- A programnak valamit vissza kell adnia a sikeres végrehajtás után.
- 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:
#includeusing 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:
- Nyújtsa be az ip mutatóváltozót, és rendeljen hozzá NULL értéket.
- Az ip mutatóváltozó értéke a konzolon lévő szöveg mellett.
- A programnak a sikeres befejezés után vissza kell térnie az értékre.
- 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:
#includeusing 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:
- Deklaráljuk a p mutatóváltozót és az x változót 30 értékkel.
- Rendelje az x változó címét p-hez.
- Nyomtassa ki a p mutatóváltozó értékét a konzolon lévő szöveg mellé.
- A programnak a sikeres befejezés után vissza kell térnie az értékre.
- 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:
#includeusing 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:
- Hozzon létre egy teszt nevű függvény prototípusát, amely két egész paramétert vesz fel.
- Hívja meg a main () függvényt. Hozzáadjuk a program logikáját a testébe.
- Nyújtsunk be két egész változót, a és b, mindegyik értéke 5.
- 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.
- 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.
- 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.
- Hozzon létre egy test () nevű függvényt, amely paraméterként felveszi az a és b változó címeit.
- 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.
- 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.
- 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.
- A programnak a sikeres befejezés után vissza kell térnie az értékre.
- A fő () függvény törzsének vége.
- A funkció teszt () meghatározása. A függvénynek két egész mutatóváltozót kell tartalmaznia * n1 és * n2.
- A * n1 mutatóváltozó hozzárendelése 10-hez.
- A * n2 mutatóváltozóhoz 11 értéket rendelünk.
- 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.