Pokazivai i strukture Pokazivai na strukture Pokazivai u

  • Slides: 26
Download presentation
Pokazivači i strukture Pokazivači na strukture Pokazivači u strukturama Samoreferisane strukture

Pokazivači i strukture Pokazivači na strukture Pokazivači u strukturama Samoreferisane strukture

Pokazivači (Ukazatelji) na strukture struct datum { int dan; int mesec; int godina; }

Pokazivači (Ukazatelji) na strukture struct datum { int dan; int mesec; int godina; } Struktuirana promenljiva deklarise se iskazom struct datum prodaja; Pokazivač na strukturu datum deklarise se iskazom struct datum *ukaz_datum;

struct datum *ukaz_datum; ukaz datum = &prodaja; Posle ovakvog postavljanja pokazivačka promenljive ukaz_datum, struktuiranoj

struct datum *ukaz_datum; ukaz datum = &prodaja; Posle ovakvog postavljanja pokazivačka promenljive ukaz_datum, struktuiranoj promenljivoj prodaja se moze pristupiti indirektno, posredstvom pokazivača ukaz_datum. Selekcija člana godina u struktuiranoj promenijivoj na koju ukazuje ukaz_datum je (*ukaz datum). godina = 1987; Zagrade '(' i ')' su neophodne, jer je operator. viseg prioriteta u odnosu na operator *

 prodaja. godina = 1987; iskaz kojim se član godina promenljive prodaja postavlja na

prodaja. godina = 1987; iskaz kojim se član godina promenljive prodaja postavlja na vrednost 1987 Indirektno (*ukaz_datum). godina = 1987; (*ukaz_datum). godina upotrebe zagrada, = 1987 je glomazan zbog

 U C jeziku postoji specijalni operator za in direktnu selekciju članova strukture. To

U C jeziku postoji specijalni operator za in direktnu selekciju članova strukture. To je operator ->. Prethodni iskaz (*ukaz_datum). godina = 1987 je ekvinalentan iskazu ukaz_datum-> godina = 1987;

 Operator -> je operator selekcije članova strukture pokazivačem na strukturu. Sas toji se

Operator -> je operator selekcije članova strukture pokazivačem na strukturu. Sas toji se od dva karaktera '- i ' >', koji se ne smeju razdvajati. -> Ima najviši prioritet medu operatorima C jezika, u rangu je sa operatorima pozivanja funkcije, selekcije elementa vektora i selekcije člana strukture imenom strukture. Asocijativnosti ovog operatora je sa lava na desno.

 Program primer ilustruje primenu pokazivača na strukture. Pokazivačka promenljiva ukaz_datum postavija se na

Program primer ilustruje primenu pokazivača na strukture. Pokazivačka promenljiva ukaz_datum postavija se na adresu promenijive prodaja. Članovi dan, mesec i godina, korišćenjem pokazivača i operatora -> postavijaju se na vrednosti 28, 6 i 1987, respek tivno, a funkcija printf stampa njihove vrednosti.

Primer main() { struct { int dan; int mesec; int godina; } prodaja, *

Primer main() { struct { int dan; int mesec; int godina; } prodaja, * ukaz_prodaja = &prodaja; Ukaz_prodaja->dan = 28; Ukaz_prodaja->mesec = 6; Ukaz_prodaja->godina = 1987; printf ("Datum prodaje je%d-%02 d-’%dn”, (*ukaz_prodaja). dan, (*ukaz_prodaja)mesec, (*ukaz_ prodaja). godina%100); }

Pokazivači u strukturama Pokazivači mogu biti članovi strukture. U iskazu struct int_ukaz { int

Pokazivači u strukturama Pokazivači mogu biti članovi strukture. U iskazu struct int_ukaz { int *u 1; int *u 2; }; definise se struktura int_ukaz sa dva pokazivača na tip int, u 1 i u 2. Koristeci gore definisanu strukturu, može se deklarisati struktuirana (ne pokazivačka) promenijiva ukaz struct int_ukaz; Promenljiva ukaz moze biti korišćena kao normalna struktura, saglasno tipu svojih članova. Sledeći primer ilustruje primenu strukture struct int_ukaz

/* Program za ilustraciju struktura sa pokazivačima*/ main() { int i 1, i 2

/* Program za ilustraciju struktura sa pokazivačima*/ main() { int i 1, i 2 ; struct { int *u 1; int *u 2; } ukaz; ukaz. u 1 = @i 1; ukaz. u 2 = @i 2; *ukaz. u 1=111; *ukaz. u 2 = 222; printf("i 1 = %d *ukaz. u 1 = %dn", i 1, *ukaz. u 1); } printf("12 = %d *ukaz. u 2 = %dn", i 2, *ukaz, u 2);

Samoreferisane strukture Koncept pokazivača na strukture i struktura sa pokazivačima mogu se objediniti sa

Samoreferisane strukture Koncept pokazivača na strukture i struktura sa pokazivačima mogu se objediniti sa strukturom sa pokazivačima na istu strukturu - samoreferisanu strukturu

Struktura struct element { char v 1; double v 2; int v 3; struct

Struktura struct element { char v 1; double v 2; int v 3; struct element *sled; } je samoreferisana jer sadrži član koji je pokazivač na struct element *sled

C prevodilac tretira član struct element *sled kao i ostale članove strukture saglasno njegovom

C prevodilac tretira član struct element *sled kao i ostale članove strukture saglasno njegovom tipu.

Samoreferisane strukture Deklaracija promenljive x tipa struct element je struct element x Pokazivač sled

Samoreferisane strukture Deklaracija promenljive x tipa struct element je struct element x Pokazivač sled u promenljivoj x se može postaviti u adresu promenljive x x. sled = @x Program ISS ilustruje korišćenje samoreferisanih struktura

Ilustracija samoreferisanih struktura ISS main() { struct element { char v 1; double v

Ilustracija samoreferisanih struktura ISS main() { struct element { char v 1; double v 2; int v 3; struct element *sled; } x;

 x. sled = @x x. sled->v 1 = ‘w'; x. sled->v 2 =

x. sled = @x x. sled->v 1 = ‘w'; x. sled->v 2 = 12. 5; x. sled->v 3 = 10 printf("v 1= %c v 2= %c v 3= %cn”, x. sled->v 1, x. sled->v 2, x. sled->v 3, ); }

Ilustracija povezivanja linearnih lista IPLL main() { struct element { char v 1; double

Ilustracija povezivanja linearnih lista IPLL main() { struct element { char v 1; double v 2; int v 3; struct element *sled; } x 1, x 2, x 3;

 x 1. v 1 = 'a'; x 2. v 1= 'b'; x 3.

x 1. v 1 = 'a'; x 2. v 1= 'b'; x 3. v 1= 'c'; x 1. sled = @x 2; x 2. sled = @x 3; x 3. sled = 0; printf("x 1. v 1= %c x 2. v 1= %c x 3. v 1= %cn”, x 1. v 1, x 1. sled->sled- >v 1); }

struct element x 1, x 2. x 3; izrazima x 1. sled = @x

struct element x 1, x 2. x 3; izrazima x 1. sled = @x 2; x 2. sled = @x 3; x 3. sled = 0; tri struktuirane promenljive se povezuju u jednu listu Program IPLL deklari. Se tri promenijive x 1, x 2 i x 3 i povezuje ih u Iistu navedenim skupom iskaza.

Izrazi x 1. sled->v 1 i x 1. sled- > V 1 zahtevaju kratko

Izrazi x 1. sled->v 1 i x 1. sled- > V 1 zahtevaju kratko objasnjenje. Izraz x 1. v 1 selektuje član v 1 na uobicajen način koristeći operator. (tacka). lzraz x 1. sled->v 1 selektuje član v 1, ali u promenljivoj x 2, jer je x 1. sled postavijen na adresu promenljve x 2. x 1. sled = @x 2;

Slično, Izraz x 1. sled->sled- >v 1 selektuje član v 1 u promenljivoj x

Slično, Izraz x 1. sled->sled- >v 1 selektuje član v 1 u promenljivoj x 3, koristeći dvostruku indirekciju, jer x 1. sled ukazuje na x 2, a x 2. sled na x 3. Clan x 2. sled selektuje se izrazom x 1. sled-> sled, sto je legalno u C jeziku. Operator -> se primenjuje s leva na desno, takode i kombinacija operatora

Prioritet Operator tačka (. ) odvaja ime promenljive i ime člana strukture. Spada u

Prioritet Operator tačka (. ) odvaja ime promenljive i ime člana strukture. Spada u najvišu prioritetnu grupu. Zbog najvišeg prioriteta tačka operatora, izraz ++promenljiva. clan; je ekvivalentan sa ++(promenljiva. clan); Isto tako &promenljiva. clan je ekvivalentan sa @(promenljiva. clan)

Prioritet Kada struktura sadrži niz kao član strukture, onda se članovi polja dosežu izrazom

Prioritet Kada struktura sadrži niz kao član strukture, onda se članovi polja dosežu izrazom promenljiva. clan[izraz] Na primer, ako je kupac promenljiva tipa struct racun, onda osmi znak u imenu kupca mozemo dobiti izrazom kupac. ime[7]. Ako pak imamo niz struktura, onda pojedini član elementa polja dosežemo izrazom polje[izraz]. clan Na primer, ako je promenljiva kupci niz tipa struct racun, onda broj računa osmog kupca dosežemo izrazom kupci[7]. broj_racuna.

Prioritet U poslednja dva primera dolazi do izrazaja asocijativnost, jer su uglaste zagrade i

Prioritet U poslednja dva primera dolazi do izrazaja asocijativnost, jer su uglaste zagrade i operator tačka istog prioriteta. Njihova asocijativnost je sleva na desno, tako da se operandi grupišu prvo oko levog operatora

Prioritet Struktura moze sadržati članove koji su pokazivači (to već znamo). Budući da. i

Prioritet Struktura moze sadržati članove koji su pokazivači (to već znamo). Budući da. i -> operatori imaju viši prioritet od * operatora, vrednost na koju član pokazuje možemo dohvatiti pomoću *var. clan ili *ptvar->clan Slično, zbog najvišeg prioriteta koji imaju operatori. i -> izrazi poput ++ptvar->clan i ++ptvar->clan. podclan ekvivalentni su sa izrazima ++(ptvar->clan) i ++(ptvar->clan. podclan)

Prioritet Izraz (++ptvar)->clan povećaće pokazivač na strukturu pre nego što se dohvati član strukture.

Prioritet Izraz (++ptvar)->clan povećaće pokazivač na strukturu pre nego što se dohvati član strukture. Pri tome se adresa koju sadrži ptvar poveća za onoliko bajtova koliko iznosi veličina strukture. Evo jos nekoliko primera izraza sa -> i. ; neka je struct pravougaonik r, *pr=@r; Tada su sledeći izrazi ekvivalentni: r. pt 1. x pr->pt 1. x (r. pt 1). x (pr->pt 1). x Tu se koristi asocijativnost operatora. i ->, koja je sleva na desno.