Pointerul în limbajul C este o variabilă care stochează adresa altei variabile. Această variabilă poate fi de tip int, char, array, function sau orice alt pointer. Mărimea indicatorului depinde de arhitectură. Cu toate acestea, în arhitectura pe 32 de biți, dimensiunea unui pointer este de 2 octeți.
Luați în considerare următorul exemplu pentru a defini un pointer care stochează adresa unui număr întreg.
int n = 10; int* p = &n; // Variable p of type pointer is pointing to the address of the variable n of type integer.
Declararea unui pointer
Pointerul în limbajul c poate fi declarat folosind * (simbolul asterisc). Este, de asemenea, cunoscut sub numele de pointer indirect folosit pentru a dereferenta un pointer.
int *a;//pointer to int char *c;//pointer to char
Exemplu de indicator
Mai jos este dat un exemplu de folosire a indicatorilor pentru a imprima adresa și valoarea.
După cum puteți vedea în figura de mai sus, variabila pointer stochează adresa variabilei numerice, adică fff4. Valoarea variabilei număr este 50. Dar adresa variabilei indicator p este aaa3.
Cu ajutorul lui * ( operator indirect ), putem tipări valoarea variabilei pointer p.
hopa
Să vedem exemplul de indicator așa cum este explicat pentru figura de mai sus.
#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; }
Ieșire
Address of number variable is fff4 Address of p variable is fff4 Value of p variable is 50
Pointer către matrice
int arr[10]; int *p[10]=&arr; // Variable p of type pointer is pointing to the address of an integer array arr.
Indicator către o funcție
void show (int); void(*p)(int) = &display; // Pointer p is pointing to the address of a function
Indicator către structură
struct st { int i; float f; }ref; struct st *p = &ref;
Avantajul indicatorului
1) Indicator reduce codul și îmbunătățește performanța , este folosit pentru a prelua șiruri de caractere, arbori etc. și este folosit cu matrice, structuri și funcții.
2) Putem returnează mai multe valori dintr-o funcție folosind indicatorul.
3) Te face capabil accesați orice locație de memorie în memoria computerului.
Utilizarea indicatorului
Există multe aplicații de pointeri în limbajul c.
ce este o interfață
1) Alocarea dinamică a memoriei
În limbajul c, putem aloca memorie în mod dinamic folosind funcțiile malloc() și calloc() unde este folosit pointerul.
2) Matrice, Funcții și Structuri
fișier .tif
Pointerii în limbajul c sunt folosiți pe scară largă în tablouri, funcții și structuri. Reduce codul și îmbunătățește performanța.
Adresa (&) operatorului
Adresa operatorului „&” returnează adresa unei variabile. Dar, trebuie să folosim %u pentru a afișa adresa unei variabile.
#include int main(){ int number=50; printf('value of number is %d, address of number is %u',number,&number); return 0; }
Ieșire
value of number is 50, address of number is fff4
Pointer NULL
Un pointer căruia nu i se atribuie nicio valoare, dar NULL este cunoscut sub numele de pointer NULL. Dacă nu aveți nicio adresă care să fie specificată în pointer în momentul declarării, puteți atribui o valoare NULL. Va oferi o abordare mai bună.
int *p=NULL;
În cele mai multe biblioteci, valoarea indicatorului este 0 (zero).
Program Pointer pentru a schimba două numere fără a utiliza a treia variabilă.
#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; }
Ieșire
Before swap: *p1=10 *p2=20 After swap: *p1=20 *p2=10
Citirea indicatoarelor complexe
Există mai multe lucruri care trebuie luate în considerare atunci când citiți pointerii complexi din C. Să vedem precedența și asociativitatea operatorilor care sunt utilizați în ceea ce privește pointerii.
Operator | Precedenta | Asociativitatea |
---|---|---|
(), [] | 1 | De la stânga la dreapta |
*, identificator | 2 | De la dreapta la stanga |
Tip de date | 3 | - |
Aici, trebuie să observăm că,
- (): Acest operator este un operator paranteză utilizat pentru a declara și defini funcția.
- []: Acest operator este un operator subindice de matrice
- * : Acest operator este un operator pointer.
- Identificator: este numele indicatorului. Prioritatea va fi întotdeauna atribuită acestui lucru.
- Tip de date: tipul de date este tipul de variabilă către care indicatorul este destinat să indice. Include, de asemenea, modificatorul cum ar fi semned int, long etc).
Cum se citește indicatorul: int (*p)[10].
Pentru a citi indicatorul, trebuie să vedem că () și [] au prioritate egală. Prin urmare, asociativitatea lor trebuie luată în considerare aici. Asociativitatea este de la stânga la dreapta, deci prioritatea merge la ().
primavara si primavara mvc
În paranteză (), operatorul indicator * și numele indicatorului (identificatorul) p au aceeași prioritate. Prin urmare, asociativitatea lor trebuie luată în considerare aici care este de la dreapta la stânga, deci prioritatea merge la p, iar a doua prioritate merge la *.
Atribuiți a treia prioritate la [] deoarece tipul de date are ultima prioritate. Prin urmare, indicatorul va arăta ca următorul.
- char -> 4
- * -> 2
- p -> 1
- [10] -> 3
Indicatorul va fi citit ca p este un indicator către o matrice de numere întregi de dimensiunea 10.
Exemplu
Cum să citești următorul indicator?
int (*p)(int (*)[2], int (*)void))
Explicaţie
Acest pointer va fi citit ca p este un pointer către o astfel de funcție care acceptă primul parametru ca indicator către o matrice unidimensională de numere întregi de dimensiunea doi și al doilea parametru ca indicator către o funcție a cărui parametru este nulă și tipul returnat este numărul întreg.