5. Pokazivači

Podeli svoje utiske o poglavlju na anketi OVDE.

Preduslovi za rad:

Adresni operator u programskom jeziku C, &.
Poznavanje rada sa nizovima.

5.1. Osnove

Svaka promenljiva, osim imena i tipa ima i svoju jedinstvenu adresu u memoriji. U pitanju je celobrojna vrednost, koja jednoznačno određuje gde se ta promenljiva nalazi u memoriji. Pokazivač ili pokazivačka promenljiva sadrži adresu promenljive.

Primer deklaracije pokazivačke promenljive:

    int *pbroj;

Pokazivačka promenljiva mora obavezno sadržati karakter * na početku svog imena. Iako su adrese celobrojne vrednosti, ona takođe ima svoj tip, pošto se koriste da posredstvom njih se dođe do sadržaja promenljive čiju adresu sadrže.

Dat je primer kako se u pokazivačku promenljivu smešta adresa druge promenljive:

    int broj = 5;
    pbroj = &broj;

Ovo omogućuje čitanje i promenu vrednosti promenljive broj posredstvom pokazivačke promenljive pbroj:

 1#include <stdio.h>
 2
 3int main()
 4{
 5    int broj = 5;
 6    int *pbroj;
 7
 8    pbroj = &broj;
 9
10    printf("Vrednost broja posredstvom pokazivaca: %d\n", *pbroj);
11    *pbroj = 6;
12    printf("Vrednost broja: %d\n", broj);
13
14    return 0;
15}

Ispis ovog programa je:

Vrednost broja posredstvom pokazivaca: 5
Vrednost broja: 6

5.2. Povezanost sa nizovima

Umesto indeksiranja, za navigaciju kroz niz je moguće koristiti pokazivače. Ovo je moguće iz dva razloga:

  1. Ako se napiše samo ime niza, dobiće se njegova početna adresa

  2. Elementi niza su poređani u memoriji jedan do drugog, stoga je moguće relativno se pozicionirati u odnosu na adresu početka niza

Primer urađen preko nizova:

 1#include <stdio.h>
 2
 3#define MAX_SIZE 10
 4
 5int main()
 6{
 7    int i, niz[MAX_SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
 8
 9    for(i = 0;i < MAX_SIZE;i += 2)
10    {
11        printf("%d ", niz[i]);
12    }
13
14    return 0;
15}

Bi se mogao uraditi preko pokazivača na sledeći način:

 1#include <stdio.h>
 2
 3#define MAX_SIZE 10
 4
 5int main()
 6{
 7    int niz[MAX_SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
 8    int *pniz;
 9
10    pniz = niz;
11
12    while(pniz - niz < MAX_SIZE)
13    {
14        printf("%d ", *pniz);
15        pniz += 2;
16    }
17
18    return 0;
19}

U oba slučaja ispis je isti:

1 3 5 7 9 

Napomena:

Svi zadaci koji u sebi koriste nizove se mogu uraditi preko pokazivača.
Razlog leži u vezi između nizova i pokazivača, koja je prikazana kroz primere iznad.

Treba imati na umu da ova veza važi samo u jednom smeru, odnosno, 
putem pokazivača se mogu uraditi dodatne stvari koje se ne mogu preko nizova.