logo

C Indicatori

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.

exemplu de indicator

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; 
c indicatori

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.

OperatorPrecedentaAsociativitatea
(), []1De la stânga la dreapta
*, identificator2De la dreapta la stanga
Tip de date3-

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.