logo

C Mutatók

A mutató a C nyelvben egy olyan változó, amely egy másik változó címét tárolja. Ez a változó lehet int, char, tömb, függvény vagy bármilyen más mutató típusú. A mutató mérete az architektúrától függ. A 32 bites architektúrában azonban a mutató mérete 2 bájt.

Tekintsük a következő példát egy egész szám címét tároló mutató meghatározásához.

 int n = 10; int* p = &n; // Variable p of type pointer is pointing to the address of the variable n of type integer. 

Mutató deklarálása

A c nyelvben a mutató a * (csillag szimbólum) használatával deklarálható. Indirekt mutatónak is nevezik, amelyet a mutató hivatkozásának megszüntetésére használnak.

 int *a;//pointer to int char *c;//pointer to char 

Mutató példa

Az alábbiakban látható egy példa a mutatók használatára a cím és az érték kinyomtatására.

mutató példa

Amint az a fenti ábrán látható, a mutatóváltozó a számváltozó címét tárolja, azaz az fff4. A számváltozó értéke 50. De a p mutatóváltozó címe aaa3.

* segítségével ( indirekt operátor ), kiírhatjuk a p mutatóváltozó értékét.

rendszer szoftver

Lássuk a mutatópéldát a fenti ábra szerint.

 #include int main(){ int number=50; int *p; p=&number;//stores the address of number variable printf('Address of p variable is %x 
',p); // p contains the address of the number therefore printing p gives the address of number. printf('Value of p variable is %d 
',*p); // As we know that * is used to dereference a pointer therefore if we print *p, we will get the value stored at the address contained by p. return 0; } 

Kimenet

 Address of number variable is fff4 Address of p variable is fff4 Value of p variable is 50 

Mutató a tömbre

 int arr[10]; int *p[10]=&arr; // Variable p of type pointer is pointing to the address of an integer array arr. 

Mutasson egy függvényre

 void show (int); void(*p)(int) = &display; // Pointer p is pointing to the address of a function 

Mutató a szerkezetre

 struct st { int i; float f; }ref; struct st *p = &ref; 
c mutatók

A mutató előnye

1) Mutató csökkenti a kódot és javítja a teljesítményt , karakterláncok, fák stb. lekérésére, valamint tömbökhöz, struktúrákhoz és függvényekhez használható.

2) Megtehetjük több értéket ad vissza egy függvényből a mutató segítségével.

3) Képessé tesz rá bármely memóriahely eléréséhez a számítógép memóriájában.

sql több tábla kiválasztása

A mutató használata

A mutatóknak számos alkalmazása létezik c nyelvben.

1) Dinamikus memóriafoglalás

A c nyelvben dinamikusan lefoglalhatunk memóriát malloc() és calloc() függvényekkel, ahol a mutatót használjuk.

2) Tömbök, függvények és struktúrák

A c nyelvű mutatókat széles körben használják tömbökben, függvényekben és struktúrákban. Csökkenti a kódot és javítja a teljesítményt.

Az üzemeltető (&) címe

Az '&' operátor címe egy változó címét adja vissza. De a %u-t kell használnunk egy változó címének megjelenítéséhez.

 #include int main(){ int number=50; printf('value of number is %d, address of number is %u',number,&number); return 0; } 

Kimenet

 value of number is 50, address of number is fff4 

NULL mutató

Az olyan mutató, amelyhez nincs hozzárendelve semmilyen érték, csak NULL, NULL mutatóként ismert. Ha a deklaráció időpontjában nincs megadandó cím a mutatóban, akkor NULL értéket rendelhet. Ez jobb megközelítést biztosít.

hány 0 egy milliárdban
 int *p=NULL; 

A legtöbb könyvtárban a mutató értéke 0 (nulla).

Mutatóprogram két szám felcseréléséhez a 3. változó használata nélkül.

 #include int main(){ int a=10,b=20,*p1=&a,*p2=&b; printf('Before swap: *p1=%d *p2=%d',*p1,*p2); *p1=*p1+*p2; *p2=*p1-*p2; *p1=*p1-*p2; printf('
After swap: *p1=%d *p2=%d',*p1,*p2); return 0; } 

Kimenet

 Before swap: *p1=10 *p2=20 After swap: *p1=20 *p2=10 

Összetett mutatók olvasása

Számos dolgot figyelembe kell venni a C-beli összetett mutatók olvasásakor. Nézzük meg a mutatóknál használt operátorok elsőbbségét és asszociativitását.

OperátorElsőbbségAz asszociativitás
(), []1Balról jobbra
*, azonosító2Jobbról balra
Adattípus3-

Itt észre kell vennünk,

  • (): Ez az operátor egy zárójeles operátor, amelyet a függvény deklarálására és meghatározására használnak.
  • []: Ez az operátor egy tömb alsóindex-operátora
  • * : Ez az operátor egy mutató operátor.
  • Azonosító: A mutató neve. A prioritás mindig ehhez lesz rendelve.
  • Adattípus: Az adattípus annak a változónak a típusa, amelyre a mutató mutatni kíván. Tartalmazza a módosítót is, például signed int, long stb.).

A mutató olvasása: int (*p)[10].

A mutató olvasásához látnunk kell, hogy () és [] egyenlő elsőbbséggel rendelkezik. Ezért itt az asszociativitását kell figyelembe venni. Az asszociativitás balról jobbra irányul, így a prioritás a ()-ra vonatkozik.

A zárójelben () a mutató operátorának * és a mutató nevének (azonosítójának) p ugyanaz az elsőbbsége. Ezért itt a jobbról balra álló asszociativitását kell figyelembe venni, tehát a prioritás p-re, a második prioritás pedig a *-ra kerül.

Rendelje hozzá a 3. prioritást a []-hez, mivel az adattípus elsőbbsége az utolsó. Ezért a mutató a következőképpen fog kinézni.

mikroszolgáltatások oktatóanyaga
  • char -> 4
  • * -> 2
  • p -> 1
  • [10] -> 3

A mutató úgy lesz beolvasva, hogy p egy 10-es méretű egész számok tömbje.

Példa

Hogyan kell elolvasni a következő mutatót?

 int (*p)(int (*)[2], int (*)void)) 

Magyarázat

Ez a mutató úgy lesz beolvasva, hogy p egy olyan függvényre mutató mutató, amely elfogadja az első paramétert mutatóként egy kettes méretű egész számokból álló egydimenziós tömbre, a második paramétert pedig egy olyan függvény mutatójaként, amelynek paramétere érvénytelen és visszatérési típusa az egész szám.