V C je niz kazalcev homogena zbirka indeksiranih spremenljivk kazalcev, ki se sklicujejo na pomnilniško lokacijo. Običajno se uporablja v programiranju C, ko želimo pokazati na več pomnilniških lokacij podobne vrste podatkov v našem programu C. Do podatkov lahko dostopamo tako, da dereferenciramo kazalec, ki kaže nanje.
Sintaksa:
pointer_type *array_name [array_size];>
tukaj,
- pointer_type: vrsta podatkov, na katere kaže kazalec. ime_matrike: Ime matrike kazalcev. array_size: Velikost niza kazalcev.
Opomba: Pomembno je imeti v mislih prednost operatorja in asociativnost v nizu deklaracij kazalcev različnih vrst, saj bo ena sama sprememba pomenila povsem drugo stvar. Na primer, če *ime_matrike zaprete v oklepaj, bo to pomenilo, da je ime_matrike kazalec na matriko.
primer:
C
primerljiv seznam
// 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;> }> |
>
>Izhod
Value of var1: 10 Address: 0x7fff1ac82484 Value of var2: 20 Address: 0x7fff1ac82488 Value of var3: 30 Address: 0x7fff1ac8248c>
Pojasnilo:
Kot je prikazano v zgornjem primeru, je vsak element matrike kazalec, ki kaže na celo število. Do vrednosti teh celih števil lahko dostopamo tako, da najprej izberemo element matrike in ga nato dereferenciramo, da dobimo vrednost.
Niz kazalcev na znak
Ena od glavnih aplikacij niza kazalcev je shranjevanje več nizov kot niza kazalcev na znake. Tu je vsak kazalec v matriki kazalec znakov, ki kaže na prvi znak niza.
Sintaksa:
char *array_name [array_size];>
Po tem lahko tem kazalcem dodelimo niz poljubne dolžine.
hashset java
primer:
C
char>* arr[5]> >= {>'gfg'>,>'geek'>,>'Geek'>,>'Geeks'>,>'techcodeview.com'> }> |
>
>
Ta način shranjevanja nizov ima prednost tradicionalnega niza nizov. Razmislite o naslednjih dveh primerih:
Primer 1:
C
za vsak tipkopis
// 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;> }> |
>
>Izhod
String array Elements are: Geek Geeks Geekfor>
V zgornjem programu smo deklarirali 3 vrstice in 10 stolpcev naše matrike nizov. Toda zaradi vnaprej določene velikosti niza nizov se poraba prostora programa poveča, če pomnilnik ni pravilno uporabljen ali ostane neizkoriščen. Zdaj pa poskusimo shraniti iste nize v matriko kazalcev.
Primer 2:
C
vrsta tipkopisnega datuma
// 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;> }> |
>
>Izhod
geek Geeks Geeksfor>
Tukaj je skupni uporabljeni pomnilnik pomnilnik, ki je potreben za shranjevanje nizov in kazalcev, ne da bi pri tem zapustili prazen prostor, kar prihrani veliko zapravljenega prostora. To lahko razumemo s pomočjo spodnje slike.
Prostor, ki ga zaseda niz kazalcev na znake, je prikazan s polnimi zelenimi bloki brez pomnilnika, potrebnega za shranjevanje kazalca, medtem ko prostor, ki ga zaseda niz nizov, vključuje polne in svetlo zelene bloke.
Niz kazalcev na različne vrste
Ne samo, da lahko definiramo matriko kazalcev za osnovne tipe podatkov, kot so int, char, float itd., ampak jih lahko definiramo tudi za izpeljane in uporabniško definirane tipe podatkov, kot so matrike, strukture itd. Oglejmo si spodnji primer, kjer ustvarimo niz kazalcev, ki kažejo na funkcijo za izvajanje različnih operacij.
primer:
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;> }> |
>
spremenljivka javascript global
>Izhod
Sum : 55 Difference : 45 Product : 250 Quotient : 10>
Uporaba niza kazalcev
Niz kazalcev je uporaben v številnih primerih. Nekatere od teh aplikacij so navedene spodaj:
- Najpogosteje se uporablja za shranjevanje več nizov.
- Uporablja se tudi za implementacijo LinkedHashMap v C in tudi v tehniki Chaining za reševanje trkov v Hashing.
- Uporablja se v algoritmih za razvrščanje, kot je sortiranje po vedru.
- Uporablja se lahko s katero koli vrsto kazalca, zato je uporaben, ko imamo ločene deklaracije več entitet in jih želimo shraniti na enem mestu.
Slabosti niza kazalcev
Niz kazalcev ima tudi precejšen delež pomanjkljivosti in ga je treba uporabiti, ko prednosti prevladajo nad pomanjkljivostmi. Nekatere slabosti niza kazalcev so:
- Večja poraba pomnilnika: Niz kazalcev zahteva več pomnilnika v primerjavi z navadnimi nizi zaradi dodatnega prostora, potrebnega za shranjevanje kazalcev. Kompleksnost: Niz kazalcev je lahko zapleten za uporabo v primerjavi s preprostim nizom. Nagnjenost k hroščem: Ker uporabljamo kazalce, pridejo zraven tudi vsi hrošči, povezani s kazalci, zato moramo z njimi ravnati previdno.
Sorodni članek: Kazalec na matriko | Kazalec polja