STRUKTURE PODATAKA I ALGORITMI 1 Pokazivai i nizovi







![Sada linija x = *p; dodeljuje promenljivoj x vrednost elementa a[0]. Ukoliko pokazivač Sada linija x = *p; dodeljuje promenljivoj x vrednost elementa a[0]. Ukoliko pokazivač](https://slidetodoc.com/presentation_image/03cec64fc9b6eaaa9bcda7eccd43c7ad/image-8.jpg)





![#define ALLOCSIZE 10000 /* size of available space */ static char allocbuf[ALLOCSIZE]; /* storage #define ALLOCSIZE 10000 /* size of available space */ static char allocbuf[ALLOCSIZE]; /* storage](https://slidetodoc.com/presentation_image/03cec64fc9b6eaaa9bcda7eccd43c7ad/image-14.jpg)









![/* writelines: ispisivanje linija teksta */ void writelines(char *lineptr[], int nlines) { int i; /* writelines: ispisivanje linija teksta */ void writelines(char *lineptr[], int nlines) { int i;](https://slidetodoc.com/presentation_image/03cec64fc9b6eaaa9bcda7eccd43c7ad/image-24.jpg)
![/* sort: sortira niz v u rastucem redosledu */ void sort(char *v[], int nlines) /* sort: sortira niz v u rastucem redosledu */ void sort(char *v[], int nlines)](https://slidetodoc.com/presentation_image/03cec64fc9b6eaaa9bcda7eccd43c7ad/image-25.jpg)


![Pisanje indeksa daytab[i][j] /* ispravno */ daytab[i, j] /* pogresno */ Prenošenje višedimenzionalnih Pisanje indeksa daytab[i][j] /* ispravno */ daytab[i, j] /* pogresno */ Prenošenje višedimenzionalnih](https://slidetodoc.com/presentation_image/03cec64fc9b6eaaa9bcda7eccd43c7ad/image-28.jpg)

![POKAZIVAČI ILI VIŠEDIMENZIONALNI NIZOVI? int a[10][20]; int *b[10]; char *name[] = { "Illegal month", POKAZIVAČI ILI VIŠEDIMENZIONALNI NIZOVI? int a[10][20]; int *b[10]; char *name[] = { "Illegal month",](https://slidetodoc.com/presentation_image/03cec64fc9b6eaaa9bcda7eccd43c7ad/image-30.jpg)
- Slides: 30
STRUKTURE PODATAKA I ALGORITMI 1 Pokazivači i nizovi
POKAZIVAČI I ADRESE Dobijanje adrese nekog objekta (operator &) p = &c; /* p pokazuje na c */ Operator & se primenjuje samo na objekte u memoriji Pristupanje objektu na koji pokazivač pokazuje (operator *, operator dereferenciranja) int x = 1, y = 2, z[10]; int *ip; /* ip je pokazivac na int */ ip = &x; y = *ip; *ip = 0; ip = &z[3]; /* /* ip sada pokazuje na x */ y je sada 1 */ x je sada 0 */ ip sada pokazuje na z[3] */
Deklaracija pokazivača int *ip; double *dp, atof(char *); Ako ip pokazuje na celobrojnu promenljivu, onda se *ip može koristiti u svakom kontekstu u kome se koristi ceo broj *ip = *ip + 10; Unarni operatori & i * imaju viši prioritet od aritmetičkih operatora y = *ip + 1; *ip += 1; ++*ip; (*ip)++; Pokazivači su takođe promenljive, pa se mogu koristiti i bez dereferenciranja q = p; *q=*p;
POKAZIVAČI I ARGUMENTI FUNKCIJA Pozvana funkcija ne može direktno da promeni promenljivu u funkciji koja je poziva Primer: Funkcija koja menja mesta dvema promenljivama swap(x, y); . . . void swap(int a, int b) /* POGRESNO*/ { int temp; temp = a; a = b; b = temp; }
Promena se može postići slanjem pokazivača na promenljive koje treba promeniti swap(&x, &y); . . . void swap(int *pa, int *pb) /* zamena *pa i *pb */ { int temp; temp = *pa; *pa = *pb; *pb = temp; } Shematski prikaz prosleđivanja pokazivača funkciji
POKAZIVAČI I NIZOVI U C-u postoji jaka veza između pokazivača i nizova Deklaracija int a[10]; definiše niz a veličine 10, odnosno niz od 10 uzastopnih celih brojeva а[0], a[1], . . . , a[9]. Shematski prikaz niza a u memoriji računara. Notacija a[i] ukazuje na i-ti element niza.
Ukoliko je p pokazivač na ceo broj, deklarisan kao int *p; onda linija p = &a[0]; postavlja pokazivač p da pokazuje na nulti element niza a (indeksi nizova u C-u počinju od nule), ili drugačije rečeno pokazivač p sadrži adresu elementa a[0]. Pokazivač p pokazuje na nulti element niza a
Sada linija x = *p; dodeljuje promenljivoj x vrednost elementa a[0]. Ukoliko pokazivač p pokazuje na određeni element niza, po definiciji p+1 pokazuje na sledeći element, p+i pokazuje na i-ti element iza p, a p-i pokazuje na i-ti element ispred p. Tako, ukoliko p pokazuje na a[0], onda *(p+1) predstavlja sadržaj elementa a[1], a *(p+i) sadržaj elementa a[i]. Pristupanje elementima niza pomoću pokazivača
Indeksiranje nizova i aritmetika pointera su veoma bliski. Po definiciji, naziv niza je upravo adresa nultog elementa niza. Zbog toga nakon izvršenja linije p = &a[0]; p i a imaju jednake vrednosti, tako da prethodna linija može biti napisana i kao p = a; a[i] se može napisati kao *(a+i) Ukoliko primenimo operator & na oba ova oblika, dobijamo da je &a[i] isto što i a+i, tj. adresa i-tog elementa niza. Slično važi i za pokazivač p, pa je p[i] isto što i *(p+i). Postoji razlika između pokazivača i nizova p=a a=p i i p++ a++ je dozvoljeno nije dozvoljeno
Kada se funkciji prosleđuje naziv niza, ono što se zapravo šalje je adresa nultog elementa. Unutar pozvane funkcije ovaj argument je lokalna promenljiva, a parametar koji predstavlja niz je pokazivač, odnosno promenljiva koja sadrži adresu nultog elementa niza. Posmatrajmo funkciju za određivanje dužine stringa (niza karaktera): /* duzina: vraca duzinu stringa s */ int duzina(char *s) { int n; for(n = 0; *s != '