You are on page 1of 17

Programiranje 2

Rad s pokazivačima

Sadržaj
 Pokazivači na osnovne tipove podataka

 Pokazivači kao argumenti funkcije

 Pokazivači na nizove

 Inkrement i dekrement pokazivača

 Zbrajanje, oduzimanje i usporedba pokazivača

 Pokazivači na strukture

 Kako se još mogu koristiti pokazivači?

Programiranje 2 2

Pokazivači 1
Pokazivači
 Pokazivači (eng. "pointer") su varijable koje umjesto vrijednosti
određenog tipa podataka sadrže adresu varijable tog tipa podataka.

 Sintaksa:
tip_podataka * ime_pok_var;

 tip podataka – označava tip podataka (char, int, float, …) čiju


adresu sadrži pokazivača;
 * - označava da se ne radi o običnoj varijabli nego o pokazivaču;
 ime_pok_var – naziv pokazivačke varijable.

 Pokazivači osiguravaju indirektan pristup podacima (varijablama) preko


njihovih adresa.

Programiranje 2 3

Pokazivači
 Pri radu s pokazivačima koriste se dva operatora:
 & - adresni operator – unarni operator koji se koristi se za pristup
adresi varijable.

 * - operator indirekcije - unarni operator koji se koristi za:


 deklaraciju pokazivača
 pristup vrijednosti varijable na adresi pohranjenoj u
pokazivaču.

Programiranje 2 4

Pokazivači 2
Primjer
main()
{
//deklaracija
Ime Mem. Mem.
int x; varijable adresa sadržaj
int *p; x 1000 ? 256 45

//inicijalizacija
p 1500 ? 1000
x = 256;
p = &x;

*p = 45;
printf(“ x = %d\n\n”, x);
}

Programiranje 2 5

Inicijalizacija pokazivača
 Kod deklaracije pokazivača, pokazivačkoj varijabli se dodjeljuje
neodređena vrijednost.

 Greška ukoliko se pristupa toj adresi.

Programiranje 2 6

Pokazivači 3
Inicijalizacija pokazivača
 Ukoliko želimo da pokazivač ne pokazuje na ništa treba mu dodijeliti
vrijednost NULL.

Programiranje 2 7

Primjer – znak i pokazivači


 Što radi program?

main()
{
char c = 'A';
char *pok_c = &c;

printf("\n %x => %c ", pok_c, c);

c = 'B';
 Koje su sve kombinacije
printf("\n %x => %c ", pok_c, *pok_c);
varijabli c i pok_c s
operatorima * i &
*pok_c = 'C'; moguće? Kad se koja
printf("\n %x => %c\n\n", &c, c); koristi?
}

Programiranje 2 8

Pokazivači 4
Primjer:
 Što radi program?

 Zašto je potrebno navesti tip varijable kod deklaracije pokazivača?

Programiranje 2 9

Primjer
 Napisati program koji zbraja, oduzima i množi 2 broja, ali se svim
varijablama smije pristupati samo preko pokazivača.

 Napisati program koji zbraja, oduzima i množi 2 broja na način da se


sva tri rezultata računaju u istoj funkciji.

Programiranje 2 10

Pokazivači 5
Pokazivači kao argumenti f-je
 Pokazivači se često koriste kao argumenti f-je, jer je na taj način moguće
mijenjati vrijednosti varijabli koje nisu globalne, ni deklarirane u funkciji.
 Što je rezultat programa?

 Prenošenjem adrese varijable u funkciju, na indirektan način pristupamo


varijablama deklariranim van funkcije i možemo mijenjati njihove vrijednosti.

Programiranje 2 11

Nadopuni funkciju …

Programiranje 2 12

Pokazivači 6
Primjer
 Napisati funkciju koja za niz od N elemenata traži minimalnu i
maksimalnu vrijednost. Obije vrijednosti je potrebno ispisati u
glavnom programu.

Programiranje 2 13

Pokazivači i nizovi
 Ime niza je adresa (pokazivač) prvog elementa niza.

 Primjer:
int x[10];
int *pok_x;

pok_x = x;

for(int i = 0; i<10 ; i++)


pok_x[i] = i*10;

for(int i = 0; i<10 ; i++)


printf(" x[%d] = %d\n", i, x[i]);

 U čemu je razlika između imena niza i pokazivača?

Programiranje 2 14

Pokazivači 7
Pokazivači i stringovi
 Ime niza(stringa) je adresa (pokazivač) prvog elementa niza.

 Primjer:

 U čemu je razlika između varijabli:


 znam_1 i znam_2;
 znam_2 i char znam_3[20] = "0123456789"?
Programiranje 2 15

Pokazivači i stringovi
 Što će raditi program?

 Znak se u funkciju prenosi u ' '


 String se u funkciju prenosi u " "

Programiranje 2 16

Pokazivači 8
Inkrement i dekrement pokazivača
 C omogućava inkrement i dekrement pokazivača pri čemu se vrijednost
pokazivača uvećava ili umanjuje ovisno o tipu podataka.

 Sintaksa:
tip_podataka * p; // p se treba inicijalizirati na neku adresu
// odgovarajućeg tipa pod.

p++; // uvećava adresu p za onoliko bajtova koliko zauzima


// tip_podataka

p--; // umanjuje adresu p za onoliko bajtova koliko zauzima


// tip_podataka

Programiranje 2 17

Što radi program?

*(str2++) = *(str1++);

Programiranje 2 18

Pokazivači 9
Primjer:
 Napisati program koji unosi string s tastature i zatim na kraj stringa
dodaje ***.

 Što radi program?

Programiranje 2 19

Primjer:
 Što radi program?

 U slučajevima kad se niz u funkciju


prenosi preko pokazivača, a
funkcija ne bi trebala mijenjati
originalne vrijednosti elemenata
koristi se ključna riječ const.
void ispis2 (const int *x, int N)

 Primjer:

Programiranje 2 20

Pokazivači 10
Prioritet operatora
 Što je rezultat programa?

 Operator indirekcije * ima manji prioritet od unarnih operatora ++ i --.

Programiranje 2 21

Preostale operacije s pokazivačima


 Moguće je uvećavati ili umanjivati pokazivače za neku vrijednost.

 Moguće je oduzimati pokazivače.

 Moguće je uspoređivati pokazivače (ima smisla samo ako se radi o


elementima istog niza) ==, !=, >, <, >=, <=
 Niži elementi niza uvijek imaju niže adrese

Programiranje 2 22

Pokazivači 11
Primjer
 Što radi program?

 A program …

Programiranje 2 23

Primjer
 Napisati funkciju koja pronalazi provo pojavljivanje nekog znaka u
stringu. U funkciju se pronosi pokazivač na string, vrijednost znaka i
funkcija vrača poziciju tog znaka u stringu. Funkcija ne smije koristiti
niti jednu cjelobrojnu varijablu (niti pokazivač na cijeli broj).

Programiranje 2 24

Pokazivači 12
Pokazivači na strukture
 Kod pristupa strukturi preko pokazivača koristi se ili operator indirekcije (*) u
kombinaciji s . ili ->

 Primjer:
struct datum {
int dan, mj, god;
} x, *p;

main() {
p = &x;

(*p).dan = 30;
p->mj = 6;
(*p).god = 2000;
printf(" Datum je: %d.%d.%d\n", x.dan, x.mj, x.god);
}

Programiranje 2 25

Što radi program?

Programiranje 2 26

Pokazivači 13
Kako se još mogu koristiti pokazivači
 Pokazivači kao povratna vrijednost funkcije

 Pokazivači na pokazivače
 Pokazivači na pokazivače na pokazivače
 …

 Nizovi pokazivača

 Pokazivači na višedimenzionalne nizove

 Pokazivači na funkcije

 …

Programiranje 2 27

Zadaci za vježbe
39. Napisati program koji prvo unosi, a zatim ispisuje elemente nekog polja
brojeva i polja znakova zajedno s adresom svakog elementa. Sve unose
i ispise je potrebno napraviti preko pokazivača i ne smiju se koristiti
[].

40. Napisati program koji u jednoj funkciji računa sumu, produkt i razliku
dva broja, a svi se rezultati ispisuju u glavnom programu.

41. Zadatak s računanjem dana prije i poslije riješiti preko funkcija na


način da se sva tri datuma deklariraju u mainu, a unos, i proračun dana
prije i poslije u f-ji. Rezultate je potrebno ispisati u mainu, a ne u f-ji.

42. Napisati program koji za zadani string traži koliko se puta podstring
pojavljuje u stringu. Podstring je potrebno unijeti u f-ji. F-ja za
pretraživanje treba vratiti broj ponavljanja. U funkciji za
pretraživanje se može koristiti f-ja strncmp iz string.h.

Programiranje 2 28

Pokazivači 14
Dodatni zadatak
 Napisati program koji za niz struktura (definirati proizvoljnu
strukturu) računa adresu i-tog elementa (i – je proizvoljan broj između
0 i broj_elemenata_niza -1).
Kao početna adresa od koje se računa se može uzeti adresa prvog
elementa niza.

 39. zadatku dodati:


 funkciju min_maks koja traži najmanji i najveći element niza,
 funkciju koja sortira elemente niza i pri tome koristi funkciju
zamjeni.

 Napisati funkciju my_strlen, koja računa koliko ima znakova u stringu,


a da se pri tome ne koriste [].

Programiranje 2 29

Dodatni zadatak za 5+ ☺
 Napisati program koji korištenjem naredbe gets uzima s tastature 1
rečenicu (maks. 10 riječi). Rečenicu je potrebno razbiti na riječi i na
kraju te riječi ispisati u obrnutom redoslijedu.
Npr. rečenicu: "Programiranje u C-u je jako zabavno." treba ispisati:
"zabavno. jako je C-u u Programiranje"
U rješavanju zadatka mogu pomoći funkcije: strchr(), strncpy(),
strlen(), …

Programiranje 2 30

Pokazivači 15
Dodatni zadatak za 5+ ☺

Programiranje 2 31

Dodatni zadatak za 5+ ☺ - Pokazivači na pokazivače


 Što radi primjer?

Programiranje 2 32

Pokazivači 16
Dodatni zadatak za 5+ ☺ - Pokazivači na pokazivače

 U primjeru se sortira niz pokazivača prema vrijednostima na koje oni


pokazuju. Originalni niz ostaje nepromijenjen.

Programiranje 2 33

Rad s pokazivačima

KRAJ!!!

Pokazivači 17

You might also like