Programski jezik C
Pokazivači
Pokazivači
Specijalna konstanta NULL
Operacije sa pokazivačima
Operator dodele vrednosti
Pokazivači i argumenti funkcija
Pokazivači i nizovi
Pokazivači i nizovi kao parametri funkcija
Pokazivači i višedimenzionalni nizovi
Nizovi pokazivača
Niz pokazivača na karakter
Parametri komandne linije
Primer
Pokazivači na pokazivače
Pokazivači na funkcije
Alokacija memorije
Alokacija memorije
Primer alokacije memorije
Alokacija memorije
78.50K

1_Pokazivaci (2)

1. Programski jezik C

Pokazivači

2. 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 vrednost
NULL, 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 oba
pokazivač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đuje
po 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šu
kao 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 blok
alocirane 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 ne
zna 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.c
int *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
English     Русский Rules