Similar presentations:
1_Pokazivaci (2)
1. Programski jezik C
Pokazivači2. Pokazivači
• Pokazivač je adresa u memoriji, broj.– ukazuje na lokaciju u memoriji
– sadržaj pokazivačke promenljive je adresa
(lokacija u memoriji).
• Pokazivačke promenljive pokazuju na
druge promenljive ili na početak
memorijskog bloka
– pokazivači na promenljive tipa int, float, itd.
3. Pokazivači
• Deklaracija:int *p1, *p2;
• Dodela vrednosti:
p1 = &c; p2 = &d;
• Pristup lokaciji:
a = *p1;
*p2 = 6;
p1
11000
10000
p2
11002
10002
...
c
5
11000
d
6
11002
4. Specijalna konstanta NULL
• Ako pokazivačka promenljiva ima vrednostNULL, onda ne pokazuje ni na šta.
• Primer:
int *p;
p = NULL;
• Neinicijalizovana vrednost NEMA NULL!
– mora se eksplicitno inicijalizovati na NULL
5. Operacije sa pokazivačima
• Sabiranje/oduzimanje sa brojem:int *p;
p = p + 10;
p++;
• Poređenje:
int *p1, *p2;
...
if (p1 == p2)
...
6. Operator dodele vrednosti
• Dodelom vrednosti dobijamo da obapokazivača ukazuju na isto.
• Primer:
int a = 5;
int *p1, *p2;
p1 = &a;
p2 = p1;
p1
11000
10000
p2
11000
10002
...
a
5
11000
7. Pokazivači i argumenti funkcija
swap.c• Za prosleđivanje parametra po referenci koriste
se pokazivači:
void swap(int *a, int *b)
{
int t = *a;
*a = *b;
a
*b = t;
b
}
t
...
int x = 5, y = 6;
x
swap(&x, &y);
y
11000
10000
11002
10002
10004
...
5
11000
6
11002
8. Pokazivači i nizovi
pok.c• Svaki niz je zapravo pokazivač na prvi element u
memoriji.
• Primer:
int a[20];
int *pa;
je isto što i:
pa = a;
a+2
pa = &a[0];
== &a[2] == pa+2
*(a+3) == a[3]
== *(pa+3)
9. Pokazivači i nizovi kao parametri funkcija
• Niz kao parametar funkcije se prosleđujepo referenci time što je ime niza zapravo
adresa prvog elementa.
int strlen(char a[])
{
...
}
int strlen(char *a)
{
...
}
strlen(“tekst”); /* string konstanta */
strlen(niz);
/* char niz[100]
*/
strlen(ptr);
/* char *ptr
*/
10. Pokazivači i višedimenzionalni nizovi
• Višedimenzionalni nizovi se u memorijičuvaju u linearnom poretku (npr.
dvodimenzionalni nizovi se čuvaju kao niz
vrsta, tj. vrstu po vrstu).
int a[3][2];
int *p;
p = a;
p
p+1
p+2
p+3
p+4
p+5
== &a[0][0]
== &a[0][1]
== &a[1][0]
== &a[1][1]
== &a[2][0]
== &a[2][1]
11. Nizovi pokazivača
• Opšta sintaksa:tip *pok[vel];
• Primer:
int a=1, b=2, c=3;
int *p[3]; p[0] = &a; p[1] = &b; p[2]=&c;
10000
p[0]
10100
10002
p[1]
10102
10004
p[2]
10104
1
a
10100
2
b
10102
3
c
10104
12. Niz pokazivača na karakter
• Pokazivač na karakter je string.• Niz pokazivača na karakter je niz
pokazivača na string.
• Primer:
char *a[3] = {“ja”, “volim”, “c”};
10000
a[0]
10100
10002
a[1]
10200
10004
a[2]
10300
‘j’
‘a’
‘v’ ‘o’ ‘l’
‘c’
‘\0’
‘\0’
‘i’
10100
‘m’ ‘\0’
10200
10300
13. Parametri komandne linije
• Parametri komandne linije se deklarišukao argumenti funkcije main().
• Prvi parametar je ime programa.
• Primer:
void main(int argc, char *argv[])
{
...
}
14. Primer
parametr.c• Napisati program koji lista argumente
komandne linije.
printf("Argumenti kom. lin. su:\n");
for (i = 0; i < argc; i++)
{
printf("%s\n", argv[i]);
}
15. Pokazivači na pokazivače
• Opšta sintaksa:pokpok.c
tip_podatka **ime;
• Sadržaj takve promenljive je broj – adresa u memoriji
gde se nalazi pokazivač.
• Primer:
int a = 5;
// u p1 je adresa od a
int *p1 = &a;
// u p2 je adresa od p1
int **p2 = &p1;
10000
a
5
10002
p1
10000
10004
p2
10002
16. Pokazivači na funkcije
• Opšta sintaksa za deklaraciju:pokfunc.c
povratni_tip (*ime)(parametri);
• Poziv funkcije preko pokazivača:
(*ime)(parametri);
• Zagrade kod imena su obavezne!
– Ako se izostave, smatraće se da je u pitanju
funkcija koja vraća pokazivač na povratni tip.
17. Alokacija memorije
• Pokazivačke promenljive pokazuju na blokalocirane memorije
– pokazuju na prvi bajt bloka alocirane
memorije
– u zavisnosti od tipa pokazivača, blok se tretira
kao blok int-ova, char-ova, itd.
18. Alokacija memorije
• Koristi se kada se u toku pisanja programa nezna koliko memorije je potrebno.
• Alocirana memorija se mora dealocirati!
• Alokacija se vrši sistemskom funkcijom
malloc(br_bajtova).
• Dealokacija funkcijom free(pokazivac).
• Memorija se alocira sa heap-a.
– heap je blok memorije dodeljen svakom programu.
19. Primer alokacije memorije
memorija.cint *p;
const int KOLIKO = 10000;
p = (int *)malloc(KOLIKO);
printf("Broj alociranih bajtova je: %d\n",
KOLIKO);
printf("Velicina int-a je: %d\n",
sizeof(int));
printf("Broj alociranih int-ova je: %d\n",
KOLIKO / sizeof(int));
free(p);
20. Alokacija memorije
mem2.c• Memorija se uvek alocira zadatim brojem bajtova.
• Funkcija malloc() vraća adresu bloka u memoriji
– ako tu adresu prihvatimo u pokazivač na int, onda se
taj blok memorije tretira kao niz int-ova
int
p1
p1+0
1000
1000
p2
char
1000
p1+1
p1+2
?
?
4
1
?
0
2
?
?
p2+0
p2+1
p2+2
p2+3
p2+4