Šta je pokazivač?

Pokazivač je promenljiva koja sadrži adresu u memoriji neke druge promenljive. Možemo imati pokazivač na bilo koji tip promenljive.

  • Unarni operator & daje „adresu promenljive“, tj.vraća adresu promenljive ispred koje je napisan. Nazivamo ga i operator referenciranja.
  • Indirektni operator * daje „sadržaj objekta na koji pokazuje pokazivač“, tj.određuje vrednost promenljive na koji pokazuje neka pokaziavačka promenljiva. Nazivamo ga i operator dereferenciranja.


1. Deklaracija pokazivača

Da biste deklarisali pokazivač, morate staviti znak * ispred njegovog imena.

<tip> *<ime>; 
<tip> - tip podatka na koji ukazuje pokazivačka promenljiva,
<ime> - ime pokazivačke promenljive.

Evo primera kako se deklariše pokazivač na celobrojni tip i pokazivač koji nema tip:

int main()
{
    int *p;
    void *up;

    return 0;
}

1.1. Generički pokazivači (pokazivači tipa void)

Tip pokazivača se određuje na osnovu tipa na koji pokazuje. Ovo znači da pokazivači čuvaju informaciju o tipu onoga na što ukazuju, sa izuzetkom pokazivača tipa void koji nema informaciju o tipu podatka na koji ukazuje. Ovaj tip pokazivača je zgodan zbog toga što mu se u toku rada može promeniti tip na koji pokazuje, što otvara mnogo mogućnosti u programiranju.

Pokazivač na tip void može da primi adresu bilo kog objekta, tj. direktno mu se može dodeliti vrednost pokazivača na bilo koji tip. To je "pokazivač na nešto u memoriji".

Primeri:

int i=0;

int *pi1=&i, *pi2;

void *pv; //pokazivac na bilo koji tip

pv=pi1; //pv ukazuje na i

pi2=pv; //nemoguca dodela, greska

pi2=(int*)pv; //ovakva dodela je korektna, izvršena je konverzija tipa


2. Inicijalizacija

Treba znati da je pokazivače pre upotrebe potrebno inicijalizovati, što zapravo znači da im se dodeljuju vrednosti adrese memorijskog objekta. Pri inicijalizaciji, tip pokazivača mora biti jednak tipu memorijskog objekta.

Pre korišćenja potrebno je izvršiti inicijalizaciju pokazivača, tj. dodeliti mu neku adresu ili NULL vrednost, oznaku da ne ukazuje ni na šta. NULL je simbolička konstanta definisana u fajlu stdio.h i njena vrednost je 0. Uobičajeno je da se pokazivačima dodeljuje NULL, a ne 0, da bi se jasno istaklo da se radi o pokazivačkoj promenljivoj.


2.2. Dodela adrese pokazivaču

Možete dodeliti adresu neke celobrojne promenljive pokazivaču na celobrojnu promenljivu, koristeći operator & da biste dobili adresu tog broja:

int main()
{
    int i;
    int *p;
    i = 5;
    p = &i;

    printf("Varijabla 'i' zivi na sledecoj memorijskog adresi: %d\n", &i);
    return 0;
}

3. Menjanje vrednosti na koju pokazuje pokazivač

Možete pristupiti vrednosti promenljive na koju se pokazuje, koristeći pokazivač. Za to koristimo znak *. Menjanje vrednosti na koju pokazuje pokazivač, će promeniti vrednost te promenljive.

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i, j;
    int *p;
    i = 5;
    p = &i;
    j = *p;
    *p = 7;

    printf("i = %d, j = %d\n", i, j);
    return 0;
}

Korišćenje pokazivača na gornji način je samo dugačak način da kažemo j = i. Naučićete mnogo korisnije načine da koristite pokazivače kasnije, ali za sada je jedino važno da steknete predstavu o tome kako oni rade.

Inače, gornji program daje sledeći izlaz:

i = 7, j = 5

Vežba

Napišite program koji učitava tri broja i, koristeći pokazivače, rotira njihove vrednosti. Na primer:

Ulaz: a=1, b=2, c=3
Izlaz: a=3, b=1, c=2

Možda će vam pomoći da pogledate VIDEO o pokazivačima onako kako se to objašnjava u osnovnoj školi ( profesor koristi Visual Studio za ilustraciju primera):

Last modified: Monday, 1 October 2018, 10:56 PM