Pole ukazovateľov v C
V jazyku C je pole ukazovateľov homogénna zbierka indexovaných premenných ukazovateľov, ktoré sú odkazmi na pamäťové miesto. Vo všeobecnosti sa používa v programovaní C, keď chceme v našom programe C ukázať na viacero pamäťových miest podobného typu údajov. K údajom môžeme pristupovať dereferencovaním ukazovateľa, ktorý na ne ukazuje.
Syntax:
pointer_type *array_name [array_size];
Tu,
- pointer_type: Typ údajov, na ktoré ukazovateľ ukazuje. pole_name: Názov poľa ukazovateľov. array_size: Veľkosť poľa ukazovateľov.
Poznámka: Je dôležité mať na pamäti prioritu a asociatívnosť operátorov v poli deklarácií ukazovateľov rôzneho typu, pretože jedna zmena bude znamenať úplne inú vec. Napríklad uzavretie *názov_pola do zátvorky bude znamenať, že názov_pola je ukazovateľ na pole.
Príklad:
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;> }> |
Výkon
Value of var1: 10 Address: 0x7fff1ac82484 Value of var2: 20 Address: 0x7fff1ac82488 Value of var3: 30 Address: 0x7fff1ac8248c
Vysvetlenie:
Ako je znázornené vo vyššie uvedenom príklade, každý prvok poľa je ukazovateľ ukazujúci na celé číslo. K hodnote týchto celých čísel môžeme pristupovať tak, že najprv vyberieme prvok poľa a potom ho dereferencujeme, aby sme získali hodnotu.
Pole ukazovateľov na charakter
Jednou z hlavných aplikácií poľa ukazovateľov je ukladanie viacerých reťazcov ako poľa ukazovateľov na znaky. Tu je každý ukazovateľ v poli ukazovateľom na znak, ktorý ukazuje na prvý znak reťazca.
Syntax:
char *array_name [array_size];
Potom môžeme týmto ukazovateľom priradiť reťazec ľubovoľnej dĺžky.
Príklad:
C
char> * arr[5]> > = {> 'gfg'> ,> 'geek'> ,> 'Geek'> ,> 'Geeks'> ,> 'techcodeview.com'> }> |
Tento spôsob ukladania reťazcov má výhodu tradičného poľa reťazcov. Zvážte nasledujúce dva príklady:
Príklad 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;> }> |
Výkon
String array Elements are: Geek Geeks Geekfor
Vo vyššie uvedenom programe sme deklarovali 3 riadky a 10 stĺpcov nášho poľa reťazcov. Ale kvôli preddefinovaniu veľkosti poľa reťazcov sa spotreba miesta programu zvyšuje, ak sa pamäť nevyužíva správne alebo sa nevyužíva. Teraz sa pokúsime uložiť rovnaké reťazce do poľa ukazovateľov.
Príklad 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;> }> |
Výkon
geek Geeks Geeksfor
Celková použitá pamäť je pamäť potrebná na ukladanie reťazcov a ukazovateľov bez toho, aby zostalo prázdne miesto, čím sa ušetrí veľa zbytočného miesta. Môžeme to pochopiť pomocou obrázka nižšie.
Priestor, ktorý zaberá pole ukazovateľov na znaky, je znázornený plnými zelenými blokmi s výnimkou pamäte potrebnej na uloženie ukazovateľa, zatiaľ čo priestor, ktorý zaberá pole reťazcov, zahŕňa plné aj svetlozelené bloky.
Pole ukazovateľov na rôzne typy
Nielenže môžeme definovať pole ukazovateľov pre základné dátové typy ako int, char, float atď., ale môžeme ich definovať aj pre odvodené a užívateľom definované dátové typy, ako sú polia, štruktúry atď. Uvažujme nižšie uvedený príklad, kde vytvoríme pole ukazovateľov ukazujúcich na funkciu na vykonávanie rôznych operácií.
Príklad:
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;> }> |
Výkon
Sum : 55 Difference : 45 Product : 250 Quotient : 10
Aplikácia poľa ukazovateľov
Rad ukazovateľov je užitočný v širokej škále prípadov. Niektoré z týchto aplikácií sú uvedené nižšie:
- Najčastejšie sa používa na ukladanie viacerých reťazcov.
- Používa sa tiež na implementáciu LinkedHashMap v jazyku C a tiež v technike Chaining riešenia kolízií v hashovaní.
- Používa sa v triediacich algoritmoch, ako je triedenie v bucket sort.
- Môže byť použitý s akýmkoľvek typom ukazovateľa, takže je užitočný, keď máme oddelené deklarácie viacerých entít a chceme ich uložiť na jedno miesto.
Nevýhody Array of Pointers
Pole ukazovateľov má tiež svoj spravodlivý podiel na nevýhodách a mali by sa používať, keď výhody prevažujú nad nevýhodami. Niektoré z nevýhod radu ukazovateľov sú:
- Vyššia spotreba pamäte: Pole ukazovateľov vyžaduje viac pamäte v porovnaní s obyčajnými poľami z dôvodu dodatočného priestoru potrebného na ukladanie ukazovateľov. Zložitosť: Použitie poľa ukazovateľov môže byť zložité v porovnaní s jednoduchým poľom. Náchylnosť na chyby: Keď používame ukazovatele, všetky chyby súvisiace s ukazovateľmi prichádzajú s ním, takže s nimi musíme zaobchádzať opatrne.
Súvisiaci článok: Ukazovateľ na pole | Ukazovateľ poľa