Ebben az oktatóanyagban megismerheti a mutatókat; mik a mutatók, hogyan használja azokat és a gyakori hibákat, amelyekkel példa segítségével szembesülhet, amikor velük dolgozik.
A mutató a C és a C ++ programozás hatékony jellemzője. Mielőtt megtanulnánk a mutatókat, ismerkedjünk meg a C programozás címeivel.
Cím a C-ben
Ha a programban van egy változó var, &var
akkor megadja a címét a memóriában.
Számos alkalommal használtuk a címet a scanf()
funkció használata közben .
scanf("%d", &var);
Itt a felhasználó által beírt érték a var változó címében tárolódik. Vegyünk egy működő példát.
#include int main() ( int var = 5; printf("var: %d", var); // Notice the use of & before var printf("address of var: %p", &var); return 0; )
Kimenet
var: 5 címe: var: 2686778
Megjegyzés: A fenti kód futtatásakor valószínűleg más címet kap.
C Mutatók
A mutatók (mutatóváltozók) speciális változók, amelyeket a címek és az értékek tárolására használnak.
Mutatószintaxis
Így deklarálhatjuk a mutatókat.
int* p;
Itt deklaráltunk egy p int
típusú mutatót .
Ilyen módon deklarálhatja a mutatókat is.
int *p1; int * p2;
Vegyünk egy másik példát a mutatók deklarálására.
int* p1, p2;
Itt deklaráltunk egy p1 mutatót és egy normális p2 változót.
Címek hozzárendelése a mutatókhoz
Vegyünk egy példát.
int* pc, c; c = 5; pc = &c;
Itt 5 van hozzárendelve a c változóhoz. És a c címet a pc mutatóhoz rendeljük.
Get Point of Point által mutatott érték
Ahhoz, hogy megkapjuk a mutatók által mutatott dolog értékét, az *
operátort használjuk . Például:
int* pc, c; c = 5; pc = &c; printf("%d", *pc); // Output: 5
Itt a címet c
a pc mutatóhoz rendelik. A címben tárolt érték eléréséhez a * pc-t használtuk.
Megjegyzés: A fenti példában a pc nem mutató, hanem mutató *pc
. Nem tehet és nem is tehet ilyesmit *pc = &c
;
By the way, *
hívják a dereference operátornak (amikor a mutatóval dolgoznak). Mutatón működik, és megadja az abban a mutatóban tárolt értéket.
Mutatók által mutatott változó érték
Vegyünk egy példát.
int* pc, c; c = 5; pc = &c; c = 1; printf("%d", c); // Output: 1 printf("%d", *pc); // Ouptut: 1
Rendeltük a c mutatót a pc mutatóhoz.
Ezután megváltoztattuk c értékét 1-re. Mivel pc és c címe megegyezik, *pc
1-et kapunk.
Vegyünk egy másik példát.
int* pc, c; c = 5; pc = &c; *pc = 1; printf("%d", *pc); // Ouptut: 1 printf("%d", c); // Output: 1
Rendeltük a c mutatót a pc mutatóhoz.
Ezután *pc
1-re váltottunk a használatával *pc = 1;
. Mivel pc és c címe megegyezik, c egyenlő lesz 1-vel.
Vegyünk még egy példát.
int* pc, c, d; c = 5; d = -15; pc = &c; printf("%d", *pc); // Output: 5 pc = &d; printf("%d", *pc); // Ouptut: -15
Kezdetben a c címet a pc mutatóhoz rendeljük pc = &c;
. Mivel c értéke 5, akkor 5-t *pc
kapunk.
Ezután a d címet a pc mutatóhoz rendeljük pc = &d;
. Mivel d értéke -15, *pc
ad -15-et.
Példa: Mutatók működése
Vegyünk egy működő példát.
#include int main() ( int* pc, c; c = 22; printf("Address of c: %p", &c); printf("Value of c: %d", c); // 22 pc = &c; printf("Address of pointer pc: %p", pc); printf("Content of pointer pc: %d", *pc); // 22 c = 11; printf("Address of pointer pc: %p", pc); printf("Content of pointer pc: %d", *pc); // 11 *pc = 2; printf("Address of c: %p", &c); printf("Value of c: %d", c); // 2 return 0; )
Kimenet
C címe: 2686784 c értéke: 22 mutató pc címe: 2686784 mutató pc tartalma: 22 mutató pc címe: 26 mutató mutató pc: 2686784 mutató pc tartalma: 11 c címe: 2686784 c értéke: 2
A program magyarázata
int* pc, c;
Here, a pointer pc and a normal variable c, both of typeint
, is created.
Since pc and c are not initialized at initially, pointer pc points to either no address or a random address. And, variable c has an address but contains random garbage value.c = 22;
This assigns 22 to the variable c. That is, 22 is stored in the memory location of variable c.pc = &c;
This assigns the address of variable c to the pointer pc.c = 11;
This assigns 11 to variable c.*pc = 2;
This change the value at the memory location pointed by the pointer pc to 2.
Common mistakes when working with pointers
Suppose, you want pointer pc to point to the address of c. Then,
int c, *pc; // pc is address but c is not pc = c; // Error // &c is address but *pc is not *pc = &c; // Error // both &c and pc are addresses pc = &c; // both c and *pc values *pc = c;
Here's an example of pointer syntax beginners often find confusing.
#include int main() ( int c = 5; int *p = &c; printf("%d", *p); // 5 return 0; )
Why didn't we get an error when using int *p = &c;
?
It's because
int *p = &c;
is equivalent to
int *p: p = &c;
Mindkét esetben létrehozunk egy mutatót p
(nem *p
), és hozzárendelünk &c
hozzá.
A zűrzavar elkerülése érdekében a következő állítást használhatjuk:
int* p = &c;
Most már tudja, hogy melyek a mutatók, a következő oktatóanyagban megtudhatja, hogyan kapcsolódnak a mutatók a tömbökhöz.