Matrice de pointeri în C
În C, o matrice de pointeri este o colecție omogenă de variabile pointer indexate care sunt referințe la o locație de memorie. Este folosit în general în programarea C atunci când dorim să indicăm mai multe locații de memorie de un tip de date similar în programul nostru C. Putem accesa datele prin dereferențierea indicatorului care indică spre ele.
Sintaxă:
pointer_type *array_name [array_size];
Aici,
- pointer_type: tipul de date către care indică pointerul. array_name: Numele matricei de pointeri. array_size: dimensiunea matricei de pointeri.
Notă: Este important să ținem cont de precedența operatorului și asociativitatea în matricea de declarații de pointeri de tip diferit, deoarece o singură schimbare va însemna cu totul altceva. De exemplu, includerea *array_name în paranteză va însemna că array_name este un pointer către o matrice.
Exemplu:
C
// C program to demonstrate the use of array of pointers> #include> int> main()> {> > // declaring some temp variables> > int> var1 = 10;> > int> var2 = 20;> > int> var3 = 30;> > // array of pointers to integers> > int> * ptr_arr[3] = { &var1, &var2, &var3 };> > // traversing using loop> > for> (> int> i = 0; i <3; i++) {> > printf> (> 'Value of var%d: %d Address: %p
'> , i + 1, *ptr_arr[i], ptr_arr[i]);> > }> > return> 0;> }> |
Ieșire
Value of var1: 10 Address: 0x7fff1ac82484 Value of var2: 20 Address: 0x7fff1ac82488 Value of var3: 30 Address: 0x7fff1ac8248c
Explicaţie:
După cum se arată în exemplul de mai sus, fiecare element al matricei este un pointer care indică un număr întreg. Putem accesa valoarea acestor numere întregi selectând mai întâi elementul de matrice și apoi dereferențându-l pentru a obține valoarea.
Matrice de pointeri către caracter
Una dintre principalele aplicații ale matricei de pointeri este stocarea mai multor șiruri de caractere ca o matrice de pointeri către caractere. Aici, fiecare indicator din matrice este un indicator de caracter care indică primul caracter al șirului.
Sintaxă:
char *array_name [array_size];
După aceea, putem aloca un șir de orice lungime acestor indicatori.
Exemplu:
C
char> * arr[5]> > = {> 'gfg'> ,> 'geek'> ,> 'Geek'> ,> 'Geeks'> ,> 'techcodeview.com'> }> |
Această metodă de stocare a șirurilor are avantajul matricei tradiționale de șiruri. Luați în considerare următoarele două exemple:
Exemplul 1:
C
// C Program to print Array of strings without array of pointers> #include> int> main()> {> > char> str[3][10] = {> 'Geek'> ,> 'Geeks'> ,> 'Geekfor'> };> > printf> (> 'String array Elements are:
'> );> > for> (> int> i = 0; i <3; i++) {> > printf> (> '%s
'> , str[i]);> > }> > return> 0;> }> |
Ieșire
String array Elements are: Geek Geeks Geekfor
În programul de mai sus, am declarat cele 3 rânduri și 10 coloane ale matricei noastre de șiruri. Dar din cauza predefinirii dimensiunii matricei de șiruri de caractere, consumul de spațiu al programului crește dacă memoria nu este utilizată corespunzător sau este lăsată nefolosită. Acum să încercăm să stocăm aceleași șiruri de caractere într-o matrice de pointeri.
Exemplul 2:
C
// C program to illustrate the use of array of pointers to> // characters> #include> int> main()> {> > char> * arr[3] = {> 'geek'> ,> 'Geeks'> ,> 'Geeksfor'> };> > for> (> int> i = 0; i <3; i++) {> > printf> (> '%s
'> , arr[i]);> > }> > return> 0;> }> |
Ieșire
geek Geeks Geeksfor
Aici, memoria totală utilizată este memoria necesară pentru stocarea șirurilor și a indicatorilor fără a lăsa spațiu gol, prin urmare, economisind mult spațiu irosit. Putem înțelege acest lucru folosind imaginea de mai jos.
Spațiul ocupat de matricea de pointeri către caractere este afișat prin blocuri verzi solide, excluzând memoria necesară pentru stocarea pointerului, în timp ce spațiul ocupat de matricea de șiruri include atât blocuri solide, cât și blocuri de culoare verde deschis.
Matrice de pointeri către diferite tipuri
Nu numai că putem defini matricea de pointeri pentru tipuri de date de bază precum int, char, float etc., dar le putem defini și pentru tipuri de date derivate și definite de utilizator, cum ar fi matrice, structuri etc. Să luăm în considerare exemplul de mai jos în care creăm o matrice de pointeri care indică către o funcție pentru efectuarea diferitelor operații.
Exemplu:
C
// C program to illustrate the use of array of pointers to> // function> #include> // some basic arithmetic operations> void> add(> int> a,> int> b) {> > printf> (> 'Sum : %d
'> , a + b);> }> void> subtract(> int> a,> int> b) {> > printf> (> 'Difference : %d
'> , a - b);> }> void> multiply(> int> a,> int> b) {> > printf> (> 'Product : %d
'> , a * b);> }> void> divide(> int> a,> int> b) {> > printf> (> 'Quotient : %d'> , a / b);> }> int> main() {> > int> x = 50, y = 5;> > // array of pointers to function of return type int> > void> (*arr[4])(> int> ,> int> )> > = { &add, &subtract, &multiply, ÷ };> > for> (> int> i = 0; i <4; i++) {> > arr[i](x, y);> > }> > return> 0;> }> |
Ieșire
Sum : 55 Difference : 45 Product : 250 Quotient : 10
Aplicarea Array of Pointers
O serie de indicatori este utilă într-o gamă largă de cazuri. Unele dintre aceste aplicații sunt enumerate mai jos:
- Este cel mai frecvent folosit pentru a stoca mai multe șiruri.
- De asemenea, este folosit pentru a implementa LinkedHashMap în C și, de asemenea, în tehnica Chaining de rezolvare a coliziunilor în Hashing.
- Este folosit în algoritmi de sortare cum ar fi sortarea găleților.
- Poate fi folosit cu orice tip de pointer, deci este util atunci când avem declarații separate de mai multe entități și dorim să le stocăm într-un singur loc.
Dezavantajele Array of Pointers
Gama de indicatoare are, de asemenea, o parte echitabilă de dezavantaje și ar trebui folosită atunci când avantajele depășesc dezavantajele. Unele dintre dezavantajele matricei de pointeri sunt:
- Consum mai mare de memorie: o matrice de pointeri necesită mai multă memorie în comparație cu matricele simple, din cauza spațiului suplimentar necesar pentru stocarea pointerii. Complexitate: o matrice de pointeri poate fi complex de utilizat în comparație cu o matrice simplă. Predispus la erori: pe măsură ce folosim indicatori, toate erorile asociate cu indicatori vin cu el, așa că trebuie să le gestionăm cu atenție.
Articol înrudit: Pointer către o matrice | Pointer de matrice