11
5/8/2011 1 Strukturne promenljive i pokazivači Ako je definisana pokazivačka promenljiva osoba: struct licnost *osoba; elementima strukture na koju ova promenljiva pokazuje može se pristupiti korišćenjem operatora tačka (*osoba).ime (*osoba).adresa (*osoba).starost Radi jednostavnijeg pristupa elementima strukturne promenljive na koju pokazuje pokazivačka promenljiva, uveden je operator “strelica u desno” (->) osoba->ime osoba->adresa osoba->starost

Op 11 24

Embed Size (px)

DESCRIPTION

Tradicionalni način programiranja je u osnovi proceduralan, zasnovan na funkcionalnoj dekompoziciji korisničkog, a zatim i programskog zahteva. Pri tome, podaci (atributi) koji se obrađuju i operacije nad njima nisu grupisani zajedno u objektima kao što je to slučaj kod OBJEKTNO ORJENTISANOG PROGRAMIRANJA, već su razbacani po programu.Osnovna ideja objektno orjentisanog programiranja je da sve te podatke (atribute ) izvučemo iz navedenih struktura i grupišemo po klasama zajedno sa relevantnim operacijama (funkcijama). Klase zatim struktuiramo hijerarhijski, formirajući hijerarhijsko stablo klasa, vodeći računa da atributi i operacije koji su zajednički za sve klase budu na višim hijerarhijama, kako bi ih niže hijerarhije mogle koristiti preko mehanizma nasleđivanja

Citation preview

5/8/2011 1

Strukturne promenljive i pokazivači

• Ako je definisana pokazivačka promenljiva osoba:struct licnost *osoba;elementima strukture na koju ova promenljiva pokazuje može se pristupiti korišćenjem operatora tačka(*osoba).ime(*osoba).adresa(*osoba).starost

• Radi jednostavnijeg pristupa elementima strukturne promenljive nakoju pokazuje pokazivačka promenljiva, uveden je operator “strelica u desno” (->)osoba->imeosoba->adresaosoba->starost

5/8/2011 2

Strukture koje sadrže pokazivače

• Dva niza znakova u ovoj strukturi zauzimaju prostor fiksne veličine . Pošto su članovi strukture ime i adresa nizovi, oni zauzimaju podjednako veliki memorijski prostor bez obzira šta je u njih upisano.

• Efikasniji način organizovanja podataka je korišćenje pokazivača kao članova strukture i njihovo usmeravanje na efikasnije i ekonomičnije smeštanje znakovnih nizova.

5/8/2011 3

Strukture koje sadrže pokazivače

• Nova deklaracija šablona strukture struct licnost {char *ime;char *adresa ;unsigned starost; };

• Dva niza znakova zamenjena su pokazivačima na znak, pri čemu svaki zauzima onoliko mesta koliko je potrebno za pokazivač.

5/8/2011 4

Prioritet

• Pojedini član strukture može se putem pokazivača dosegnuti izrazom (*pp1).x i (*pp1).y. Uočimo da su zagrade nužne jer operator tačka ima viši prioritet od operatora zvezda. Izraz *pp1.xje ekvivalentan sa *(pp1.x), sto nije korektno formiran izraz.

• 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.clanje ekvivalentan sa &(promenljiva.clan)

5/8/2011 5

• Kada struktura sadrži niz kao član strukture, onda se članovi polja dosežu izrazompromenljiva.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 izrazompolje[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

5/8/2011 6

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šuprvo oko levog operatora

5/8/2011 7

Prioritet

• Struktura moze sadržati članove koji su pokazivači. 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.podclanekvivalentni su sa izrazima++(ptvar->clan) i ++(ptvar->clan.podclan)

5/8/2011 8

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.pt1.xpr->pt1.x(r.pt1).x(pr->pt1).x

• Tu se koristi asocijativnost operatora . i ->, koja je sleva na desno.

5/8/2011 9

Primer• Napisati program kojim se učitavaju podaci za dve osobe i

ispisuju podaci o starijoj

#include<stdio.h>#define MAXIME 31#define MAXADRESA 41struct licnost{char ime[MAXIME];char adresa[MAXADRESA];unsigned starost;};

5/8/2011 10

void citaj(struct licnost * osoba){printf(“Unesite ime osobe:”);gets(osoba->ime);printf(“Unesite adresu osobe:”);gets(osoba->adresa);printf(“Unesite starost osobe:”);scanf(“%u”,&osoba->starost);while(getchar()!=’\n’); /*ocistiti ulazni string iz scanf jer je ”nova linija” separator;

scanf() ignorise znake praznine i nove linije */}

5/8/2011 11

main(){struct licnost osoba1,osoba2,*stariji;printf(“Unesi podatke za prvu osobu:\n”);citaj(&osoba1);printf(“Unesi podatke za drugu osobu:\n”);citaj(&osoba2);if (osoba1.starost>osoba2.starost)

stariji=&osoba1;else stariji=&osoba2;printf(“Stariji je:”);printf(“%s,star:%u.\n”,stariji->adresa,stariji->starost);}