Professional Documents
Culture Documents
Pokazivaèi - Za Web
Pokazivaèi - Za Web
Pokazivači
Osnove programiranja © ZN 1
Uvod
• izvršenjem naredbe za deklaraciju varijable:
• za varijablu de biti rezervirana potrebna količina memorijskog prostora ovisno o
tipu varijable
• rezerviranom memorijskom prostoru bit de dodijeljeno ime
• deklaracijom varijable prevoditelj je povezao ime varijable sa adresom
prvog bajta prostora memorije rezerviranog za varijablu
• dodjeljivanjem imenâ varijablama:
• omogudava se jednostavnije zapisivanje naredbî programa
• povedava se čitljivost i razumljivost programa
• olakšava se pronalaženje i otklanjanje grešaka u programu
• olakšava se održavanje programa i mijenjanje njegovih karakteristikâ
2
Osnove programiranja © ZN
1
20.12.2015.
Uvod (nast.)
• za izvršavanje određenih zadataka nužno je poznavati i adrese varijablî
• za pohranjivanje adresâ varijablî, u naredbama programa koriste se
varijable posebnog tipa - pokazivači
• upotrebom pokazivača programski jezik C omoguduje:
• slanje pozivatelju više od jedne vrijednosti iz funkcije
• obrada nizova u funkcijama
• kreiranje složenih strukturâ podataka (npr. povezane liste, stabla, redovi, itd.)
• dinamičko dodjeljivanje memorije u skladu sa potrebama programa
• brže pristupanje elementima nizova, itd.
3
Osnove programiranja © ZN
Pokazivači
• Zadatak: Učitati dva prirodna broja i izračunati njihov količnik.
❹ if (*pokDjelitelj == 0) {
printf("\nDjelitelj je jednak nuli!");
} else {
❹ kolicnik = (float)(*pokDjeljenik)/(*pokDjelitelj);
printf("\nKolicnik: %f\n", kolicnik);
}
return 0;
}
4
Osnove programiranja © ZN
2
20.12.2015.
Pokazivači
• pokazivači su varijable koje mogu sadržavati samo adrese drugih varijablî
• za upotrebu pokazivača potrebno je:
• deklarirati pokazivač
• inicijalizirati pokazivač adresom varijable
• izvršiti operacije nad vrijednošću varijable upotrebom adrese varijable
pohranjenje u pokazivaču
5
Osnove programiranja © ZN
Deklaracija pokazivača
• u naredbi za deklaraciju pokazivača zapisuje se:
• tip varijable čiju de adresu sadržavati pokazivač
• informacija procesoru koliko de byta pročitati počevši od adrese koja je u pokazivaču
• operator '*' koji označava da je varijabla čije je ime zapisano neposredno iza
operatora pokazivačka varijabla
• operator je potrebno zapisati prije svake pokazivačke varijable
• ime pokazivača
Osnove programiranja © ZN
3
20.12.2015.
Inicijalizacija pokazivača
• vrijednost neinicijaliziranog pokazivača nije određena i kao takva je
neupotrebljiva
• run-time error zbog neinicijaliziranog pokazivača
• inicijalizacija pokazivača je postupak kojim se pokazivaču dodjeljuje adresa
varijable
• adresu varijable nalazi operator '&'
• varijabla čija se adresa nalazi zapisuje se neposredno iza operatora
inicijalizacija pokazivača
adresom 0
8
Osnove programiranja © ZN
4
20.12.2015.
int djeljenik;
int *pokDjeljenik = & djeljenik;
printf("\npokDjeljenik = %p\n", pokDjeljenik);
9
Osnove programiranja © ZN
10
Osnove programiranja © ZN
5
20.12.2015.
11
Osnove programiranja © ZN
Prioriteti operacijâ
• poredak operatorâ po prioritetu:
• zagrade
• operatori za rad sa pokazivačima
• operatori za prilagodbu tipova podataka
• predznaci
• povedavanje ili smanjivanje vrijednosti varijable za 1
• množenje, dijeljenje, ostatak cjelobrojnog dijeljenja
• zbrajanje i oduzimanje
• usporedba: manje, manje od ili jednako, vede i
vede od ili jednako
• usporedba: jednako, različito
• logička operacija I
• logička operacija ILI
• operator za dodjeljivanje
12
Osnove programiranja © ZN
6
20.12.2015.
int broj[UK_BROJEVA], i;
int *pokBroj;
pokBroj = broj;
14
Osnove programiranja © ZN
7
20.12.2015.
Aritmetika pokazivača
• dodavanjem vrijednosti i (0, 1, 2... ) adresi u pokazivaču, adresa de se
povedati za i*n, gdje je:
• n = broj byta koje zauzima varijabla čiju adresu sadrži pokazivač
• npr.:
• za nizove cjelobrojnog tipa, adresa u pokazivaču povećava se za 4
• za nizove znakovnog tipa, adresa u pokazivaču povećava se za 1
• itd.
#define UK_BROJEVA 5
...
int broj[UK_BROJEVA], i;
int *pokBroj = broj;
15
Osnove programiranja © ZN
#define UK_BROJEVA 5
...
int broj[UK_BROJEVA], i;
int *pokBroj = broj;
16
Osnove programiranja © ZN
8
20.12.2015.
#define UK_BROJEVA 5
...
int broj[UK_BROJEVA], i;
int *pokBroj = broj;
17
Osnove programiranja © ZN
Pokazivači i funkcije
• Zadatak: Učitati 5 znakova u niz i u funkciji ispisati elemente niza.
#include<stdio.h>
#define ZNAKOVA 5
void ispis (char * pokNizZnakovaf, int n);
int main() {
❶ deklaracija pokazivača char nizZnakova [ZNAKOVA];
na niz ❶ char * pokNizZnakova;
int i;
❷ inicijalizacija pokazivača ❷ pokNizZnakova = nizZnakova;
adresom niza for (i = 0; i < ZNAKOVA; i++) {
printf ("Upisi %d. znak: ", i + 1);
❸ učitavanje podataka u niz ❸ scanf (" %c", pokNizZnakova + i);
upotrebom pokazivača }
❹ ispis ( pokNizZnakova, ZNAKOVA ) ;
❹ poziv funkcije za obradu return 0;
}
elemenata niza
❺ void ispis (char * pokNizZnakovaf, int n) {
int j;
❺ zaglavlje funkcije za obradu printf ("\nUpisani su znakovi: ");
elemenata niza for (j = 0; j < n; j++) {
❻ printf ("%c ", * ( pokNizZnakovaf + j ) );
❻ ispsivanje elemenata niza u }
funkciji return;
}
18
Osnove programiranja © ZN
9
20.12.2015.
19
Osnove programiranja © ZN
20
Osnove programiranja © ZN
10
20.12.2015.
#define ZNAKOVA 5
...
char nizZnakova [ZNAKOVA];
char * pokNizZnakova;
pokNizZnakova = nizZnakova;
...
ispis (pokNizZnakova, ZNAKOVA);
21
Osnove programiranja © ZN
#define ZNAKOVA 4
...
char nizZnakova [ZNAKOVA];
char * pokNizZnakova;
pokNizZnakova = nizZnakova; deklaracija pokazivača
... za prihvat adrese iz
ispis (pokNizZnakova, ZNAKOVA); poziva funkcije
...
adresa prvog elementa niza
void ispis (char * pokNizZnakovaf, int n) {
...
22
Osnove programiranja © ZN
11
20.12.2015.
...
ispis (pokNizZnakova, ZNAKOVA);
...
void ispis (char *pokNizZnakovaf, int n) {
int j;
printf ("\nUpisani su znakovi: ");
for (j = 0; j < n; j++) {
printf ("%c ", * (pokNizZnakovaf + j));
}
return;
}
23
Osnove programiranja © ZN
24
Osnove programiranja © ZN
12
20.12.2015.
PITANJA?
25
13