În acest tutorial, veți afla despre indicii; ce indicații sunt, cum le folosești și greșelile obișnuite cu care te-ai putea confrunta atunci când lucrezi cu ele cu ajutorul exemplelor.
Pointerele sunt caracteristici puternice ale programării C și C ++. Înainte de a învăța indicii, să învățăm despre adresele din programarea C.
Adresa în C
Dacă aveți o variabilă var în program, vă &var
va da adresa acesteia în memorie.
Am folosit adresa de mai multe ori în timp ce foloseam scanf()
funcția.
scanf("%d", &var);
Aici, valoarea introdusă de utilizator este stocată în adresa variabilei var. Să luăm un exemplu de lucru.
#include int main() ( int var = 5; printf("var: %d", var); // Notice the use of & before var printf("address of var: %p", &var); return 0; )
Ieșire
var: 5 adresa var: 2686778
Notă: probabil că veți obține o adresă diferită atunci când rulați codul de mai sus.
C Pointeri
Pointerele (variabilele pointer) sunt variabile speciale care sunt folosite pentru a stoca adrese mai degrabă decât valori.
Sintaxa indicatorului
Iată cum putem declara indicii.
int* p;
Aici, am declarat un indicator p de int
tip.
De asemenea, puteți declara indicii în aceste moduri.
int *p1; int * p2;
Să luăm un alt exemplu de declarare a indicilor.
int* p1, p2;
Aici, am declarat un pointer p1 și o variabilă normală p2.
Atribuirea adreselor către indicatori
Să luăm un exemplu.
int* pc, c; c = 5; pc = &c;
Aici, 5 este atribuit variabilei c. Și, adresa lui c este atribuită indicatorului PC.
Obțineți valoarea lucrului indicat de indicatori
Pentru a obține valoarea lucrului indicat de indicatori, folosim *
operatorul. De exemplu:
int* pc, c; c = 5; pc = &c; printf("%d", *pc); // Output: 5
Aici, adresa lui c
este atribuită indicatorului PC. Pentru a obține valoarea stocată în acea adresă, am folosit * pc.
Notă: În exemplul de mai sus, pc nu este un pointer *pc
. Nu poți și nu trebuie să faci ceva de genul *pc = &c
;
Apropo, *
se numește operator de dereferență (atunci când se lucrează cu pointeri). Funcționează pe un pointer și oferă valoarea stocată în acel pointer.
Modificarea valorii indicată de indicatori
Să luăm un exemplu.
int* pc, c; c = 5; pc = &c; c = 1; printf("%d", c); // Output: 1 printf("%d", *pc); // Ouptut: 1
Am atribuit adresa lui c pointerului computerului.
Apoi, am schimbat valoarea lui c la 1. Deoarece pc și adresa lui c sunt aceleași, *pc
ne dă 1.
Să luăm un alt exemplu.
int* pc, c; c = 5; pc = &c; *pc = 1; printf("%d", *pc); // Ouptut: 1 printf("%d", c); // Output: 1
Am atribuit adresa lui c pointerului computerului.
Apoi, am trecut *pc
la 1 folosind *pc = 1;
. Deoarece pc și adresa lui c sunt aceleași, c va fi egal cu 1.
Să luăm încă un exemplu.
int* pc, c, d; c = 5; d = -15; pc = &c; printf("%d", *pc); // Output: 5 pc = &d; printf("%d", *pc); // Ouptut: -15
Inițial, adresa lui c este atribuită indicatorului PC folosind pc = &c;
. Deoarece c este 5, *pc
ne dă 5.
Apoi, adresa lui d este atribuită indicatorului PC folosind pc = &d;
. Deoarece d este -15, *pc
ne dă -15.
Exemplu: Lucrul indicatoarelor
Să luăm un exemplu de lucru.
#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; )
Ieșire
Adresa c: 2686784 Valoarea c: 22 Adresa computerului pointer: 2686784 Conținutul computerului pointer: 22 Adresa computerului pointer: 2686784 Conținutul computerului pointer: 11 Adresa c: 2686784 Valoarea c: 2
Explicația programului
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;
În ambele cazuri, creăm un pointer p
(nu *p
) și îi atribuim &c
.
Pentru a evita această confuzie, putem folosi afirmația astfel:
int* p = &c;
Acum știți ce sunt indicatoarele, veți afla cum sunt asociate indicatoarele cu matricele în următorul tutorial.