Nizovi pokazivača se koriste u slučajevima gde treba napraviti uštede u memoriji koja je nepotrebno zauzeta statičkim rezervisanjem prostora višedimenzionalnog niza.

Na primer ukoliko želimo da procesiramo string, njega možemo smestiti u dvodimenzionalni niz, čiji je broj kolona dovoljno veliki da se u svaku pojedinačnu vrstu može smestiti najduži string koji se može javiti:

#define ARRAY_LEN 100
#define STRLEN_MAX 256

char myStrings[ARRAY_LEN][STRLEN_MAX] =

{ // Several corollaries of Murphy's Law:

"If anything can go wrong, it will.","Nothing is foolproof, because fools are so ingenious.","Every solution breeds new problems."};

Međutim, ovakav način definicije u stvari nepotrebno troši veliki deo memorije, jer se samo mali deo od ukupno 25,600 bajtova koliko je inicijalno zauzeto pri deklaraciji niza koristi. Prosto rešenje u ovakvim  i  sličnim slučajevima je da se koristi niz pokazivača na objekte (u ovom slučaju pokazivač na stringove) i da se alocira (zauzme) memorija samo za one objekte (tekstove) koji u stvari postoje. Nekorišćeni elementi niza će u tom slučaju biti nul pokazivači.

#define ARRAY_LEN 100
char *myStrPtr[ARRAY_LEN] = // Array of pointers to char
{ // Several corollaries of Murphy's Law:"If anything can go wrong, it will.","Nothing is foolproof, because fools are so ingenious.","Every solution breeds new problems."};


Razmotrimo razliku izmedu dvodimenzionalnog niza i niza pokazivača:

Ako su date deklaracije

int a[10][20];

int *b[10];

i a[3][4] i b[3][4] su sintaksno ispravna referisanja na pojedinačni int. Ali a je pravi dvodimenzioni niz: 200 lokacija za podatak tipa int je rezervisano i uobičajena računica 20 * v + k se koristi da bi se pristupilo elementu a[v][k].

Za niz b, međutim, deklaracija alocira samo 10 pokazivača i ne inicijalizuje ih - inicijalizacija se mora izvršiti eksplicitno, bilo statički (navođenjem inicijalizatora) ili dinamički (tokom izvršavanja programa). Pod pretpostavkom da svaki element niza b zaista pokazuje na niz od 20 elemenata, u memoriji će biti 200 lokacija za podataka tipa int i još dodatno 10 lokacija za pokazivače. Ključna prednost niza pokazivača nad dvodimenzionalnim nizom je činjenica da vrste na koje pokazuju ovi pokazivači mogu biti različite dužine.

Tako, svaki element niza b ne mora da pokazuje na 20-to elementni niz - neki mogu da pokazuju na 2-elementni niz, neki na 50-elementi niz, a neki mogu da budu NULL i da ne pokazuju nigde.

Razmotrimo primer niza koji treba da sadrži imena meseci. Jedno rešenje je zasnovano na dvodimenzionalnom nizu (u koji se, prilikom inicijalizacije upisuju imena meseci):

 char meseci[][9] = { "Greska", "Januar", "Februar", "Mart", "April", "Maj", "Jun", "Jul", "Avgust", "Septembar", "Oktobar", "Novembar", "Decembar"}; 

Pošto meseci imaju imena različite dužine, bolje rešenje je napraviti niz pokazivača na karaktere i inicijalizovati ga da pokazuje na konstantne niske smeštene u segmentu podataka (primetimo da nije potrebno navesti broj elemenata niza pošto je izvršena inicijalizacija):

char *meseci[] = { "Greska", "Januar", "Februar", "Mart", "April", "Maj", "Jun", "Jul", "Avgust", "Septembar", "Oktobar", "Novembar", "Decembar"};
Last modified: Thursday, 28 March 2019, 5:49 PM