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.
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;
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átor | Elsőbbség | Az asszociativitás |
---|---|---|
(), [] | 1 | Balról jobbra |
*, azonosító | 2 | Jobbról balra |
Adattípus | 3 | - |
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.