Mutatók a C programozásban: Mi az a mutató, típusok és példák

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

  1. Mutató deklarálása
  2. Visszaadja a hivatkozott változó értékét
& Csak 1 célt szolgál

  • Vissza változó címe

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:

Mutatóműveletek

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:

Mutató hozzáadása / növelése

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.

Write a Comment

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük