Mi a mutató a C-ben?
A mutató a C-ben egy olyan változó, amely egy másik változó címét tárolja. A mutató egy másik mutatófunkcióra is hivatkozhat. A mutató növelhető / csökkenthető, vagyis a következő / előző memóriahelyre mutat. A mutató célja a memória megtakarítása és a gyorsabb végrehajtási idő elérése.
A mutatók használata a C
Ha egy int típusú v változót deklarálunk, akkor a v valóban értéket tárol.
v most nulla.
Mindazonáltal minden változónak, az értéken kívül, megvan a címe is (vagy egyszerűen megfogalmazva, ahol a memóriában található). A cím lekérhető úgy, hogy egy ampersandot (&) tesz a változó neve elé.
Ha kinyomtatja a változó címét a képernyőn, akkor az mint egy teljesen véletlenszerű szám (ráadásul futtatásonként eltérhet).
Próbáljuk ki ezt a gyakorlatban a C mutatóval példa
A program kimenete -480613588.
Most, mi az a mutató? Az érték tárolása helyett a mutató y eltárolja a változó címét.
Mutató változó
Int * y = & v;
VÁLTOZÓ |
POINTER |
Megnevezett tárhely / memória címben tárolt érték |
Változó, amely egy másik változó tárolási / memória címére mutat |
Mutató deklarálása
A változókhoz hasonlóan a C progra mutatói is Az mminget be kell jelenteni, mielőtt felhasználhatók lennének a programjában. A pointerek bármit megnevezhetnek, ameddig csak akarják, amíg betartják a C névadási szabályait. A mutató deklarációnak a következő formája van.
data_type * pointer_variable_name;
Itt,
- data_type a mutató “C” típusú változóinak alaptípusa, és jelzi annak a változónak a típusát, amelyre a mutató mutat.
- A csillag (*: ugyanaz a használt csillag szorzáshoz), amely indirection operátor, deklarál egy mutatót.
Lássunk néhány érvényes mutató deklarációt ebben a C pointerek oktatóanyagban:
Mutató inicializálása
A mutató deklarálása után inicializáljuk, mint a szokásos változókat változó címmel. Ha a C programozás mutatóit nem inicializálják és nem használják a programban, az eredmények kiszámíthatatlanok és potenciálisan katasztrofálisak.
Egy változó címének megszerzéséhez használjuk az ampersand (&) operátort, amely egy olyan változó neve elé kerül, amelynek a címére szükségünk van. A mutató inicializálása a következő szintaxissal történik.
Mutatószintaxis
pointer = &variable;
Egy egyszerű program a mutató ábrázolásához az alábbiakban található:
Kimenet:
Address stored in a variable p is:60ff08Value stored in a variable p is:10
Operátor | Jelentés |
* | 2 célt szolgál
|
& | Csak 1 célt szolgál
|
A C típusú mutatók típusai
Az alábbiakban bemutatjuk a C különböző típusú mutatóit:
Nullmutató
Null mutatót hozhatunk létre azzal, hogy null értéket rendelünk a mutató deklarálása során. Ez a módszer akkor hasznos, ha a mutatóhoz nincs hozzárendelve cím. A null mutató mindig 0 értéket tartalmaz.
A következő program bemutatja a null mutató használatát:
#include <stdio.h>int main(){int *p = NULL; //null pointerprintf("The value inside variable p is:\n%x”,p);return 0;}
Kimenet:
The value inside variable p is:0
Érvénytelen mutató
A C programozásban az érvénytelen mutatót általános mutatónak is hívják. Nincs szabványos adattípusa. A void kulcsszó használatával egy érvénytelen mutató jön létre. Bármely változó címének tárolására használható.
A következő program a void mutató használatát szemlélteti:
#include <stdio.h>int main(){void *p = NULL; //void pointerprintf("The size of pointer is:%d\n",sizeof(p));return 0;}
Kimenet:
The size of pointer is:4
Vadmutató
A mutató akkor vad jelző, ha nem inicializáljuk semmire. Az ilyen típusú C-mutatók nem hatékonyak, mert olyan ismeretlen memóriahelyekre utalhatnak, amelyek problémákat okozhatnak programunkban, és a program összeomlásához vezethetnek. Mindig óvatosnak kell lennie, amikor vad mutatókkal dolgozik.
A következő program szemlélteti a vad pointer használatát:
#include <stdio.h>int main(){int *p; //wild pointerprintf("\n%d",*p);return 0;}
Output
timeout: the monitored command dumped coresh: line 1: 95298 Segmentation fault timeout 10s main
A “c” más típusú mutatói a következők:
- mutató lógása
- összetett mutató
- közeli mutató
- Távoli mutató
- Hatalmas mutató
Közvetlen és közvetett hozzáférési mutatók
A C-ben két egyenértékű mód van változó tartalom elérése és kezelése
- Közvetlen hozzáférés: közvetlenül használjuk a változó nevét
- Közvetett hozzáférés: mutatót használunk a változóhoz
Értsük meg ezt az alábbi program segítségével.
A program hibátlan fordítása után az eredmény:
Direct access, var = 1Indirect access, var = 1The address of var = 4202496The address of var = 4202496Indirect access, var = 48
Mutatószámtan a C-ban
A mutatóműveleteket a következő ábra foglalja össze:
Elsőbbségi művelet (elsőbbség)
A C-mutatókkal való munkavégzés során meg kell figyelnünk a következő prioritási szabályok:
Ha egy P mutató egy X változóra mutat, akkor a * P mindenütt használható, ahol X beírható.
A következő kifejezések ekvivalensek:
Utóbbi esetben zárójelekre van szükség: mivel az * és ++ operátorokat jobbról balra értékelik, zárójelek nélkül a P mutatót növekszik, nem az az objektum, amelyre P mutat.
Az alábbi táblázat bemutatja a C-mutatók kezelésénél használható számtani és alapvető műveleteket
Művelet | Magyarázat |
Hozzárendelés | int * P1, * P2 P1 = P2; P1 és P2 ugyanazon egész változóra mutat |
Inkrementáció és dekrementáció | Int * P1; P1 ++; P1–; |
Offszet hozzáadása (állandó) | Ez lehetővé teszi, hogy a mutató N elemet mozgasson egy táblában. A mutató a változó típusának bájtjainak N-szeresével növekszik vagy csökken. P1 + 5; |
C Mutatók & Tömbök példákkal
Hagyományosan az index segítségével érheti el a tömb elemeit, de ez a módszer kiküszöbölhető mutatók használatával. A mutatók megkönnyítik az egyes tömb elemek elérését.
Kimenet
12345
Egy adott szám hozzáadása egy mutatóhoz a mutató helyét az összeadási művelettel kapott értékhez mozgatja. Tegyük fel, hogy p olyan mutató, amely jelenleg a 0 memóriahelyre mutat, ha elvégezzük az összeadási műveletet, p + 1, akkor a következő módon fog végrehajtani:
Mivel p jelenleg 1 hozzáadása után a 0 helyre mutat, az érték 1 lesz, így a mutató az 1. memóriahelyre mutat.
C Mutatók és karakterláncok példákkal
A karakterlánc egy char objektum tömb, amelynek null karaktere “\ 0”. A karakterláncokat mutatók segítségével manipulálhatjuk. Ez a C példában található mutató elmagyarázza ezt a szakaszt.
Kimenet
First character is:HNext character is:ePrinting all the characters in a stringHelloGuru99!
A karakterláncok kezelésének másik módja a mutató tömbje, mint az alábbiakban program:
Kimenet:
Please remember these materials:ironcoppergold
A C-ben lévő mutatók előnyei
- A mutatók hasznosak a hozzáféréshez memóriahelyek.
- A mutatók hatékony módot kínálnak a tömbstruktúra elemeinek elérésére.
- A mutatókat a dinamikus memóriaelosztáshoz, valamint az üzletkötéshez használják.
- A mutatók komplex adatstruktúrák, például összekapcsolt lista, grafikon, fa stb. Kialakítására szolgálnak.
A mutatók hátrányai a C-ben
- A mutatók kissé összetettek megérteni.
- A mutatók különféle hibákhoz vezethetnek, például szegmentálási hibákhoz, vagy hozzáférhetnek egy olyan memóriahelyhez, amelyre egyáltalán nincs szükség.
- Ha egy mutató nem megfelelő értéket ad meg, memóriasérülést okozhat.
- A mutatók felelősek a memória szivárgásáért is.
- A mutatók viszonylag lassabbak, mint a változóké.
- A programozóknak nagyon nehéz dolgozniuk a mutatókkal; ezért a programozó felelőssége, hogy gondosan manipuláljon egy mutatót.
Összegzés
- A mutató nem más, mint egy memóriahely, ahol az adatokat tárolják.
- A memória helyének elérésére mutatót használnak.
- Különböző típusú mutatók léteznek, például null mutató, vad mutató, érvénytelen mutató és más típusú mutatók.
- A mutatókat tömbökkel és karakterláncokkal lehet hatékonyabban elérni.
- Funkciómutatókat hozhatunk létre egy függvény dinamikus meghívására.
- Az aritmetikai műveletek elvégezhetők egy mutatón, amelyet pointer aritmetikának neveznek.
- A mutatók olyan funkcióra is rámutathatnak, amely megkönnyíti a különböző függvények meghívását abban az esetben, ha meghatároz egy mutatótömböt.
- Ha különböző változó adattípussal kíván foglalkozni, akkor használjon typecast void mutatót.