14
08/24/22 1 Pokazivačke promenljive, • Pokazivačka promenljiva je promenljiva koja “pokazuje “ na drugu promenljivu, odnosno sadrži adresu memorijske lokacije u kojoj se čuva ta promenljiva Deklariše se tako što se u specifikaciji zada tip promenljive na koju ukazuje pokazivačka promenljiva. Ispred imena promenljive piše se * int *pi /*pokazivač na celobrojnu promenljivu */ char *pc /*pokazivač na znakovnu promenljivu */ float *pf1, *pf2 /*pokazivač na float promenljive */ j = *pi dodeljuje promenljivoj j celobrojnu vrednost koja se nalazi na adresi sadržanoj u promenljivoj pi.

Op 10 1920

Embed Size (px)

DESCRIPTION

Za razliku od znaka, koji nastaje i mimo čovekove volje, svaki simbol je uvek ljudska tvorevina. Već je rečeno da se univerzum otkriva kroz nepregledno mnoštvo znakova u kojima čovek pronalazi određena značenja. Samo se po sebi razume da čulima, kojima ostvaruje prvi kontakt i upija znak iz okruženja, čovek ne može dosegnuti značenje znaka. U proces poimanja znaka uključuju se, gotovo trenutno posle čulne percepcije, razum i emocije. To je trenutak u procesu preobražaja znaka u simbol.Sliku sveta, u prostorno vremenskom beskraju, čovek sagledava i stiče mnoštvom znakova ili signala. • Znak se, budući da ukazuje na nešto, uvek ispoljava kroz jedinstvo dva svoja strukturna elementa - oznaku i označeno. Najčešće su oznaka i označeno posebni entiteti: • Slovo A je oznaka za glas A • Ime označava ličnost • Suza u oku radost ili tugu Za razliku od znaka, koji nastaje i mimo čovekove volje, svaki simbol je uvek ljudska tvorevina. Već je rečeno da se univerzum otkriva kroz nepregledno mnoštvo znakova u kojima čovek pronalazi određena značenja. Samo se po sebi razume da čulima, kojima ostvaruje prvi kontakt i upija znak iz okruženja, čovek ne može dosegnuti značenje znaka. U proces poimanja znaka uključuju se, gotovo trenutno posle čulne percepcije, razum i emocije. To je trenutak u procesu preobražaja znaka u simbol.

Citation preview

Page 1: Op 10 1920

04/10/23 1

Pokazivačke promenljive, • Pokazivačka promenljiva je promenljiva koja “pokazuje “

na drugu promenljivu, odnosno sadrži adresu memorijske lokacije u kojoj se čuva ta promenljiva

• Deklariše se tako što se u specifikaciji zada tip promenljive na koju ukazuje pokazivačka promenljiva. Ispred imena promenljive piše se *

• int *pi /*pokazivač na celobrojnu promenljivu */• char *pc /*pokazivač na znakovnu promenljivu */• float *pf1, *pf2 /*pokazivač na float promenljive */• j = *pi dodeljuje promenljivoj j celobrojnu vrednost

koja se nalazi na adresi sadržanoj u promenljivoj pi.

Page 2: Op 10 1920

04/10/23 2

Pretpostavimo da postoji sledeća deklaracija i inicijalizacija promenljive prom:

int prom= 0 ;

Deklaracija int * ukaz_prom; nam omogućava da indirektno pristupimo vrednosti promenljive prom.

Za promenljive prom i ukaz_prom možemo pisati iskaz:

ukaz_prom = &prom; koji promenljivoj ukaz_prom dodeljuje adresu promenljive prom.

Ako je promenljiva x deklarisana kao int, tada se iskazom

x = *ukaz_prom; dodeljuje vrednost promenljive na koju pointer ukaz_prom ukazuje. Pošto je promenljiva ukaz_prom

u ranijem iskazu postavljena na vrednost &prom efekat prethodnog iskaza dodeljivanje promenljivoj x vrednost promenljive prom.

Operatori & i * su unarni istog prioriteta i inverzni su međusobno.

Page 3: Op 10 1920

04/10/23 3

Pretpostavimo da imamo deklaraciju

Int x,y,*uTada su iskazi

u = &xY= *u;Ekvivalentni iskazu

Y = *&xKoji je opet ekvivalentan iskazu

Y = x Operatori dodeljivanja pi = &i j = *piImaju isti efekat kao j = i

Page 4: Op 10 1920

04/10/23 4

Pokazivaci

• Int x=1, y=2;• Int *ip

• ip=&x x y ip» 100 200 1000»

• y= *ip x y ip» 100 200 1000

• x=ip x x y ip» 100 200 1000

• *ip=3 x y ip» 100 200 1000

1 2 100

3 2 100

100 2 100

1 1 100

Page 5: Op 10 1920

04/10/23 5

Pointeri opet ali, malo drugačije

• Pokazivač se definiše kao i ostale promenljive. Razlika je što se nazivu promenljive dodaje unarni operator simbol (*) ispred identifikatora određene promenljive. Zvezdica (*) je simbol za indirektno adresiranje pa se zato i sam operator (*) naziva i operatorom indirektnog adresiranja.

• Kada se operator indirekcije (*) primeni na neki pokazivač, njime se pristupa objektu na koji pokazivač pokazuje.

• int *p1;           /* pokazivač na integer promenljivu • char *p2;                /* pokazivač na char promenljivu• long double *p4;        /* pokazivač na long double

promenljivu

Page 6: Op 10 1920

04/10/23 6

• Pokazivač je dakle promenljiva koja sadrži adresu objekta tj. neke promenljive na koji pokazuje. Kada je sadržaj pokazivača adresa nekog objekta tada je pokazivač inicijalizovan.

• Adresa nekog objekta u memoriji koji je predstavljen svojim identifikatorom, može da se dobije pomođu prefiksnog unarnog operator (&), odnosno adresa neke promenljive dobija se korišćenjem ovog adresnog operatora.

• .

Page 7: Op 10 1920

04/10/23 7

Jedan poučan primer

• int broj;     /* promenljiva tipa int • int *pok;    /* pokazivač na int tip • broj = 10;    /* inicijalizacija promenljive broj na 10 • pok = &broj;    /* inicijalizacija pokazivač tako da

pokazuje na promenljivu broj • *pok = 100;    /* promena sadržaja promenljive broj

na 100 preko pokazivača . umesto promena sadržaja promenljive broj

• broj = 100;

Page 8: Op 10 1920

04/10/23 8

DEKLARACIJA POKAZIVAČA

Pokazivač omogućava indirektan način pristupa vrednosti određenog podatka, i to pomoću adresa podatka u memoriji računara. Kako to funkcioniše na najjednostavnem primeru:

• int broj = 10, *pok;

Page 9: Op 10 1920

04/10/23 9

• Da bi se uspostavila veza između promenljivih broj i pok, koristi se operator (&) koji daje adresu odgovarajuće promenljive.

• pok = &broj

• Ovim je pridružena memorijska adresa promenljive broj pokazivaču pok, tj. sadržaj promenljive pok je adresa promenljive broj

Page 10: Op 10 1920

04/10/23 10

Vrednost promenljive broj pridružuje se nekoj drugoj promenljivoj npr x upotrebom promenljive pok, koristeći operator (*).

• x = *pok;

• ima isto značenje kao i:• x = broj;• tj. u jednom i drugom slučaju vrednost

promenljive x je 10.

Page 11: Op 10 1920

04/10/23 11

Veza između funkcija korišćenjem pokazivača

• Funkcija kvadrat_kub () koja je definisana iza glavne funkcije main() u primeru No14 ima četiri parametra m, n, kv i kub. Prva dva parametra su ulazni podaci koje ne želimo menjati u toku izvršetka funkcije i nazivaju se vrednosni parametri. Pre izvršavanja funkcije tim parametrima se dodeljuju vrednosti stvarnih parametara.

• Pri pozivu funkcije kvadrat_kub(2,4,&p,&q); • predaju se adrese promenljivih p i q što znači da će formalni parametri kv i

kub koji su definisani u zaglavlju funkcije kvadrat_kub (m, n, kv, kub) biti opisani kao pokazivači.

• Pošto su p i q celobrojne promenljive promenljive kv , kub treba da budu opisane kao pokazivači na celobrojne promenljive, pa se deklarišu na sledeći način

• int m, int n, int *kv, int *kub•

Page 12: Op 10 1920

04/10/23 12

• Ovi parametri se nazivaju adresni parametri, i koriste se za određivanje izlaznih vrednosti funkcije ili promenu vrednosti odgovarajućih stvarnih parametara.

• Na mestu programa na kome se funkcija izvršava prvi put promenljivim p i q se dodeljuju vrednosti stvarnih parametara 2 i 4. Pokazivačke promenljive *kv, i *kub

• dobijaju adrese stvarnih parametara &p i &q tako da se sve operacije koje se u funkciji realizuju nad *kv, i *kub su operacije koje se realizuju nad stvarnim parametrima p i q

Page 13: Op 10 1920

04/10/23 13

Example No 14

• main()• {• int m,n,k,l,p,q,r;• Void kvadrat_kub();

• kvadrat_kub(2,4, &p,&q);• print(“p = %d q =%d\n”,p,q);• scan(“%d%d%d%d”,&m&n&k&l);• kvadrat_kub(m,n ,&p,&q);• print(“p = %d q =%d\n”,p,q);• kvadrat_kub(m-k,n+l ,&p,&r);• print(“p = %d q =%d\n”,p,r);

}void kvadrat_kub(int m, int n, int *kv, int *kub);

{int I;

*kv = *kub =0 for(i=m;i<=n;i++) { *kv+ = i*i; *kub+ = i*i*i; } }

Page 14: Op 10 1920

04/10/23 14

Podela memorije između promenljivih

• Main()• m• n• k• l

• p

• q

• r

kvadrat_kub(int m, int n, int *kv, int *kub);

*kv kv i

m

n

*kub kub