Top Banner
Pokazivači (Pointeri) Pojam pointera Operatori za rad sa pointerima Pokazivači na vektor i matricu Funkcije i pokazivači Za kompajliranje koda koristen DEV-C++ 4.9.9.2 Compiler !!!!
38

Programski jezik C - APEGapeg.ac.me/nastava/SPR_2016_C_Pokazivaci i dinamicka memorija.pdf · Pokazivači (Pointeri) •Pojam pointera •Operatori za rad sa pointerima •Pokazivači

Sep 01, 2019

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Programski jezik C - APEGapeg.ac.me/nastava/SPR_2016_C_Pokazivaci i dinamicka memorija.pdf · Pokazivači (Pointeri) •Pojam pointera •Operatori za rad sa pointerima •Pokazivači

Pokazivači (Pointeri)

• Pojam pointera

• Operatori za rad sa pointerima

• Pokazivači na vektor i matricu

• Funkcije i pokazivači

Za kompajliranje koda koristen DEV-C++ 4.9.9.2 Compiler !!!!

Page 2: Programski jezik C - APEGapeg.ac.me/nastava/SPR_2016_C_Pokazivaci i dinamicka memorija.pdf · Pokazivači (Pointeri) •Pojam pointera •Operatori za rad sa pointerima •Pokazivači

Pokazivači (pointeri) POINTERI?

Pokazivači (Pointeri)*

Pokazivači obezbjeđuju indirektan pristup memoriji (putem adrese)

Pokazivač je promjenljiva koja sadrži memorijsku adresu nekog objekta

ako je u pitanju polje – tada je to adresa početnog elementa polja

ako je u pitanju funkcija – tada je to adresa početka funkcije

Ako promjenljiva p sadrži adresu objekta q, kažemo da p pokazuje na q

Primjer:

MEMORIJA

adresa

101

100

99

q 65

Deklaracija

pokazivača:

tip *ime;

Primjer:

int *pi;

char *pc,

*tekst;

100 p

* Dio slajdova od: Dražen Brđanin. Elektrotehnički fakultet Banja Luka, sa dopustenjem.

Page 3: Programski jezik C - APEGapeg.ac.me/nastava/SPR_2016_C_Pokazivaci i dinamicka memorija.pdf · Pokazivači (Pointeri) •Pojam pointera •Operatori za rad sa pointerima •Pokazivači

Pokazivači (pointeri) POINTERI?

Operatori za rad sa pokazivačima

Adresni operator &

daje adresu nekog objekta u

memoriji

Ako je q neka promjenljiva tada

&q daje adresu te promjenljive

Ako želimo da pokazivač p

pokazuje na promjenljivu q

imamo p=&q

MEMORIJA

adresa

101

100

99

q 65

Operator indirekcije *

omogućava indirektan pristup

promjenljivoj koristeći pokazivač na tu

promjenljivu

Ako je s neka promjenljiva, a p

pokazivač na isti tip, tada se može pisati

s=*p .

To znači da će q dobiti vrijednost koja

se nalazi na lokaciji koju pokazuje p

MEMORIJA

adresa

101

100

99

q 65

100 p

p=&q 100 p

p=&q

65 s

s=*p

Page 4: Programski jezik C - APEGapeg.ac.me/nastava/SPR_2016_C_Pokazivaci i dinamicka memorija.pdf · Pokazivači (Pointeri) •Pojam pointera •Operatori za rad sa pointerima •Pokazivači

Pokazivači (pointeri) POINTERI?

Operatori za rad sa pokazivačima Adresni operator & i operator indirekcije * su INVERZNI OPERATORI

y = *& x ili y = x

ili

int x,y,*z;

z = &x;

y = *z; y = *z = *&x = x

Primjer:

#include <stdio.h>

#include <stdlib.h>

int main()

{

int x, prom=5, *pokaz;

pokaz = &prom;

x = *pokaz;

printf("prom=%d\npokaz=%d\nx=%d\n",prom, pokaz, x);

return 0;

}

prom=5

pokaz=2293568

x=5 Adresa od prom

Page 5: Programski jezik C - APEGapeg.ac.me/nastava/SPR_2016_C_Pokazivaci i dinamicka memorija.pdf · Pokazivači (Pointeri) •Pojam pointera •Operatori za rad sa pointerima •Pokazivači

Pokazivači (pointeri) POINTER NA POLJE?

Pokazivač na vektor (jednodimenzionalno polje)

Ime vektora (niza) predstavlja adresu početnog elementa vektora i

već je samo po sebi pokazivač (statički pokazivač)

a[2] a[0] a[1]

0 0 0 0

a[3]

0

a[4]

int a[5]={0};

int *p, *q;

p = a;

ili

p = &a[0];

q = a+3;

ili

q = &a[3];

Napomena:

a je statička promjenljiva

Nije dozvoljeno a=a+2; ili

a++;

Napomena:

p je dinamička promjenljiva

Dozvoljeno je p=p+2; ili p++;

Page 6: Programski jezik C - APEGapeg.ac.me/nastava/SPR_2016_C_Pokazivaci i dinamicka memorija.pdf · Pokazivači (Pointeri) •Pojam pointera •Operatori za rad sa pointerima •Pokazivači

Pokazivači (pointeri) POINTER NA POLJE?

Pokazivač na vektor (jednodimenzionalno polje)

Primjer:

#include <stdio.h>

static int x[5] = {1,2,3,4,5};

main()

{

int *p;

p = x;

printf(”%d %d %d\n”, x[0], x[1], x[2]);

printf(”%d %d %d\n”, *p, *(p+1), *(p+2) );

}

1 2 3

1 2 3

Page 7: Programski jezik C - APEGapeg.ac.me/nastava/SPR_2016_C_Pokazivaci i dinamicka memorija.pdf · Pokazivači (Pointeri) •Pojam pointera •Operatori za rad sa pointerima •Pokazivači

Pokazivači (pointeri) POINTER NA POLJE?

Prenos vektora u funkciju pomoću pokazivača

Pretpostavimo da imamo funkciju

int funkcija (niz, n)

int niz[], n;

{ ... }

pristup elementima u nizu

niz[indeks]

int funkcija (p, n)

int *p, n;

{ ... }

pristup pomoću pointera

*(p+indeks)

ili

Primjer:

int suma (int niz[], int

n)

{

int s=0, i;

for (i=0; i<n; i++)

s += niz[i];

return (s);

}

Primjer:

int suma (int *p, int n)

{

int s=0, i;

for (i=0; i<n; i++)

s += *(p+i);

return (s);

}

Page 8: Programski jezik C - APEGapeg.ac.me/nastava/SPR_2016_C_Pokazivaci i dinamicka memorija.pdf · Pokazivači (Pointeri) •Pojam pointera •Operatori za rad sa pointerima •Pokazivači

Pokazivači (pointeri) POINTER NA POLJE?

Pokazivač na matricu (dvodimenzionalno polje)

... 0 1 j ... m-1

0

1

i

n-1

mat[i][j]

mat[0][0]

int *p;

p = mat; ili

p = &mat[0][0];

*( mat + m*i + j ) ili

*( &mat[0][0] + m*i + j )

Page 9: Programski jezik C - APEGapeg.ac.me/nastava/SPR_2016_C_Pokazivaci i dinamicka memorija.pdf · Pokazivači (Pointeri) •Pojam pointera •Operatori za rad sa pointerima •Pokazivači

Pokazivači (pointeri) ADRESNA

ARITMETIKA?

Adresna aritmetika Neka je:

a – vektor sa elementima tipa T

v – izraz tipa T

n – cjelobrojni izraz

p, q – pokazivači na tip T (pokazuju na elemente niza a)

Tada važe sljedeća pravila:

a – pokazivač na početak niza

&a[0] – pokazivač na početak niza

*p – element niza a na koji pokazuje p

*p=v – elementu na koji pokazuje p dodjeljuje vrijednost v

++p – pokazuje na sljedeći element niza

--p – pokazuje na prethodni element niza

*++p – inkrementira p, pa pristupa tom (sljedećem) elementu

*p++ - pristupa elementu na koji pokazuje p, a zatim pokazuje

na sljedeći element

p+n - pokazuje na n-ti naredni element niza

*(p+n)=v – dodjeljuje vrijednost v n-tom narednom elementu u nizu u

odnosu na element na koji pokazuje p

q-p - određuje broj elemenata niza smještenih između adresa na

koje pokazuju q i p

Page 10: Programski jezik C - APEGapeg.ac.me/nastava/SPR_2016_C_Pokazivaci i dinamicka memorija.pdf · Pokazivači (Pointeri) •Pojam pointera •Operatori za rad sa pointerima •Pokazivači

Pokazivači (pointeri) ADRESNA

ARITMETIKA?

Primjer:

#include <stdio.h>

main()

{

static char c[] = {’a’,’b’,’c’,’d’};

static int i[] = { 1, 2, 3, 4};

char *pc1=&c[0], *pc2=&c[3];

int *pi1=&i[0], *pi2=&i[3];

printf(”*c=%c *i=%d\n”, *c, *i);

printf(”*pc1=%c *pi1=%d\n”, *pc1, *pi1);

printf(”*(pc1+1)=%c *(pi1+2)=%d\n”, *(pc1+1), *(pi1+2));

printf(”*++pc1=%c *++pi1=%d\n”, *++pc1, *++pi1);

printf(”*pc1++=%c *pi1++=%d\n”, *pc1++, *pi1++);

printf(”*pc1=%c *pi1=%d\n”, *pc1, *pi1);

pc1-=2; pi1-=2;

printf(”*pc1=%c *pi1=%d\n”, *pc1, *pi1);

printf(”pc2-pc1=%d pi2-pi1=%d\n”, pc2-pc1, pi2-pi1);

}

*c=a *i=1

*pc1=a *pi1=1

*(pc1+1)=b *(pi1+2)=3

*++pc1=b *++pi1=2

*pc1++=b *pi1++=2

*pc1=c *pi1=3

*pc1=a *pi1=1

pc2-pc1=3 pi2-pi1=3

Page 11: Programski jezik C - APEGapeg.ac.me/nastava/SPR_2016_C_Pokazivaci i dinamicka memorija.pdf · Pokazivači (Pointeri) •Pojam pointera •Operatori za rad sa pointerima •Pokazivači

Funkcije i pokazivači

• Poziv funkcije po vrijednosti i referenci

– Funkcija se poziva po vrijednosti ako joj se predaju argumenti osnovnog tipa (a ne adrese).

– U tom slučaju, funkcija može koristiti vrijednosti stvarnih argumenata (kopije sadržaja lokacija u memoriji) ali nema mogućnost njihove izmjene (jer su joj nepoznate adrese lokacija).

– Funkcija se može pozvati po referenci, ako je deklarisana i definisana sa argumentima pokazivačima na odgovarajuće tipove.

Page 12: Programski jezik C - APEGapeg.ac.me/nastava/SPR_2016_C_Pokazivaci i dinamicka memorija.pdf · Pokazivači (Pointeri) •Pojam pointera •Operatori za rad sa pointerima •Pokazivači

Funkcije i pokazivači

#include <stdio.h>

int povrsina_1(int a, int b)

{

return a*b;

}

void povrsina_2(int *p, int a, int b)

{

*p= a * b;

}

int main()

{

int a,b, po;

a=2;

b=3;

// POZIV PO VRIJEDNOSTI

printf("\npovr_1= %d",povrsina_1(a,b));

// POZIV PO REFERENCI

printf("\npovr_2= %d",povrsina_2(&po,a,b));

getchar();

getchar();

return 0;

}

Proslijedi adresu promenljive po i na toj

adresi smjesti a*b

Nema return

Page 13: Programski jezik C - APEGapeg.ac.me/nastava/SPR_2016_C_Pokazivaci i dinamicka memorija.pdf · Pokazivači (Pointeri) •Pojam pointera •Operatori za rad sa pointerima •Pokazivači

Funkcije i pokazivači REFERISANJE?

Prenos argumenata u funkciju referisanjem

Argumenti se u funkciju standardno prenose putem vrijednosti

Funkcija nema mogućnost da promijeni vrijednost stvarnog argumenta!!!

Da bi se omogućilo da funkcija mijenja vrijednost stvarnog argumenta:

1. Prilikom poziva funkcije treba slati adresu!

2. Formalni argument treba definisati kao pokazivač na tip!

3. U tijelu funkcije treba koristiti operator indirekcije!

REFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumenta

Referisanje omogućava da funkcija mijenja vrijednost stvarnog argumenta!

Page 14: Programski jezik C - APEGapeg.ac.me/nastava/SPR_2016_C_Pokazivaci i dinamicka memorija.pdf · Pokazivači (Pointeri) •Pojam pointera •Operatori za rad sa pointerima •Pokazivači

Funkcije i pokazivači REFERISANJE?

Primjer:

#include <stdio.h>

void suma ( niz, n, s )

int *niz, n, *s;

{

int i;

*s = 0;

for (i=0; i<n; i++)

*s += *niz++ ;

}

main()

{

static int i[]={1,2,3,4};

int x;

suma (i, 4, &x);

printf(”Suma: %d”, x);

}

Suma: 10

šalje se adresa

Formalni argument je

pokazivač

Korišćenje

operatora

indirekcije

Page 15: Programski jezik C - APEGapeg.ac.me/nastava/SPR_2016_C_Pokazivaci i dinamicka memorija.pdf · Pokazivači (Pointeri) •Pojam pointera •Operatori za rad sa pointerima •Pokazivači

Funkcije i pokazivači GORNJI PRIMJER

BEZ POKAZIVACA?

#include <stdio.h>

int niz[]={1,2,3,4};

int suma ( int n)

{

int i, suma1=0;

for (i=0; i<n; i++)

suma1= suma1+niz[i];

return suma1;

}

int main()

{

int suma2, n;

n=4;

suma2=suma(n);

printf("Suma: %d", suma2);

getchar();

return 0;

}

Niz je sada globalna

promenljiva

Poziv po vrijednosti

Page 16: Programski jezik C - APEGapeg.ac.me/nastava/SPR_2016_C_Pokazivaci i dinamicka memorija.pdf · Pokazivači (Pointeri) •Pojam pointera •Operatori za rad sa pointerima •Pokazivači

Dinamička dodjela memorije • Statička i dinamička dodjela memorije

– Naredbe statičke deklaracije - na početku programa

(globalne) ili na početku određene funkcije (lokalne).

– Statička deklaracija - pod kontrolom prevodioca, unaprijed rezervisan prostor.

– Naredbe dinamičke deklaracije - bilo gdje u programu,unutar bilo koje funkcije i na bilo kom mjestu.

– Dinamička deklaracija – tokom izvršavanja programa se rezervise prostor.

Page 17: Programski jezik C - APEGapeg.ac.me/nastava/SPR_2016_C_Pokazivaci i dinamicka memorija.pdf · Pokazivači (Pointeri) •Pojam pointera •Operatori za rad sa pointerima •Pokazivači

Dinamička dodjela memorije...

• Statička dodjela memorije

• char x; 1 bajt

• int y; 4 bajta

• int niz_1d[100]; 400 bajtova

• double niz_2d[50][100]; 40 000 bajtova

• Na početku programa/funkcije zna se tačan broj bajtova koji će biti rezervisan za pojedine promenljive.

Page 18: Programski jezik C - APEGapeg.ac.me/nastava/SPR_2016_C_Pokazivaci i dinamicka memorija.pdf · Pokazivači (Pointeri) •Pojam pointera •Operatori za rad sa pointerima •Pokazivači

Dinamička dodjela memorije...

• Statička dodjela memorije • Nije pogodan oblik deklaracije kada se:

• zadaje i koristi mnogo manji broj podataka od predviđenog.

• Od 5000 promjenljivih ne koriste se sve.

Page 19: Programski jezik C - APEGapeg.ac.me/nastava/SPR_2016_C_Pokazivaci i dinamicka memorija.pdf · Pokazivači (Pointeri) •Pojam pointera •Operatori za rad sa pointerima •Pokazivači

Dinamička dodjela memorije...

• Statička dodjela memorije

• Nije pogodan oblik deklaracije kada se:

• formira kolekcija promenljivih koja predstavlja presjek od zadatih kolekcija promenljivih.

• Možda u presjeku nije ni 500 elemenata (1. niz).

Page 20: Programski jezik C - APEGapeg.ac.me/nastava/SPR_2016_C_Pokazivaci i dinamicka memorija.pdf · Pokazivači (Pointeri) •Pojam pointera •Operatori za rad sa pointerima •Pokazivači

Dinamička dodjela memorije...

• Statička dodjela memorije • Nije pogodan oblik deklaracije kada se: • Formira kolekcija promenljivih koja predstavlja uniju

od zadatih kolekcija promenljivih.

• Možda u uniji nije svih 1500 elemenata od oba niza

Page 21: Programski jezik C - APEGapeg.ac.me/nastava/SPR_2016_C_Pokazivaci i dinamicka memorija.pdf · Pokazivači (Pointeri) •Pojam pointera •Operatori za rad sa pointerima •Pokazivači

Dinamička dodjela memorije...

• Statička dodjela memorije • Nije pogodan oblik deklaracije kada se: • Od određenog mjesta u programu dio zadatih

podataka više ne koristi.

• Od 5000 promenljivih program dalje koristi dio.

Page 22: Programski jezik C - APEGapeg.ac.me/nastava/SPR_2016_C_Pokazivaci i dinamicka memorija.pdf · Pokazivači (Pointeri) •Pojam pointera •Operatori za rad sa pointerima •Pokazivači

Dinamička dodjela memorije...

• Statička dodjela memorije

• Nedostaci:

• Na početku programa neophodno je donijeti odluku o veličini prostora potrebnog u memoriji – za sve objekte tog programa.

• Ne može se promijeniti veličina jednom dodeljenog prostora u memoriji.

• Ne može se prostor koji više nije od koristi jednom objektu koristiti za neki drugi objekat programa.

Page 23: Programski jezik C - APEGapeg.ac.me/nastava/SPR_2016_C_Pokazivaci i dinamicka memorija.pdf · Pokazivači (Pointeri) •Pojam pointera •Operatori za rad sa pointerima •Pokazivači

Dinamička dodjela memorije...

• Statička dodjela memorije

• Koristi se:

• kod pojedinačnih promenljivih osnovnog tipa,

• kada niz bilo kog tipa ima relativno mali broj promenljivih,

• kada je kompletan niz promjenljivih potreban u svim djelovima jedne funkcije.

Page 24: Programski jezik C - APEGapeg.ac.me/nastava/SPR_2016_C_Pokazivaci i dinamicka memorija.pdf · Pokazivači (Pointeri) •Pojam pointera •Operatori za rad sa pointerima •Pokazivači

Dinamička dodjela memorije...

• Dinamička dodela (alokacija) memorije

• Koristi se:

• za uzimanje dijela memorijskog prostora rezervisanog za podatke, tokom izvršavanja programa.

• za vraćanje iskorišćenog memorijskog prostora, tokom izvršavanja programa da ne bi bilo nepotrebnog velikog trošenja memorije od početka do kraja izvršavanja jednog programa.

Page 25: Programski jezik C - APEGapeg.ac.me/nastava/SPR_2016_C_Pokazivaci i dinamicka memorija.pdf · Pokazivači (Pointeri) •Pojam pointera •Operatori za rad sa pointerima •Pokazivači

Dinamička dodjela memorije...

• Dinamička dodjela (alokacija) memorije i zone u operativnoj memoriji

operativna(radna) memorija

Permanent storage

za instrukcije programa i za

globalne statički deklarisane

promenljive

Heap

za dinamičku dodelu memorije

tokom izvršavanja programa

Stack

za poziv / povratak iz funkcija i

za lokalne statički deklarisane

promenljive

Page 26: Programski jezik C - APEGapeg.ac.me/nastava/SPR_2016_C_Pokazivaci i dinamicka memorija.pdf · Pokazivači (Pointeri) •Pojam pointera •Operatori za rad sa pointerima •Pokazivači

Dinamička dodjela memorije...

• Dinamička dodjela (alokacija) memorije u “C-u”.

• 4 funkcije iz C biblioteke <stdlib.h>

• malloc()

• calloc()

• realloc()

• free()

Page 27: Programski jezik C - APEGapeg.ac.me/nastava/SPR_2016_C_Pokazivaci i dinamicka memorija.pdf · Pokazivači (Pointeri) •Pojam pointera •Operatori za rad sa pointerima •Pokazivači

Dinamička dodjela memorije...

• malloc(), dinamička dodjela memorije za jedan blok od traženog broja bajtova (za n bajtova).

• calloc(), dinamička dodjela memorije za veći broj blokova i inicijalizacija svakog bajta u svakom bloku na 0 (za mxn bajtova, sa vrednošću 0).

• realloc(), izmena veličine prethodno dinamički dodijeljene memorije (za n2 bajtova).

• free(), Oslobađanje prethodno dinamički dodijeljene memorije (0 bajtova).

Page 28: Programski jezik C - APEGapeg.ac.me/nastava/SPR_2016_C_Pokazivaci i dinamicka memorija.pdf · Pokazivači (Pointeri) •Pojam pointera •Operatori za rad sa pointerima •Pokazivači

Dinamička dodjela memorije...

• Za funkcije malloc(), calloc() i realloc() važi:

– Ako je pomoću neke od funkcija nađen i dodijeljen odgovarajući prostor u memoriji – funkcija vraća u pokazivaču adresu dodeljenog prostora.

– Ako se pomoću neke od funkcija traži veći prostor od raspoloživog u memorijskoj heap zoni funkcija vraća NULL pokazivač.

Page 29: Programski jezik C - APEGapeg.ac.me/nastava/SPR_2016_C_Pokazivaci i dinamicka memorija.pdf · Pokazivači (Pointeri) •Pojam pointera •Operatori za rad sa pointerima •Pokazivači

Dinamička dodjela memorije...

• Deklaracija funkcije

• void *malloc( unsigned int vel);

• Traži se alokacija bloka u memoriji od vel bajtova i dobija:

– NULL ako nema dovoljno memorije ili

– adresa bloka (generički pokazivač void *)

Page 30: Programski jezik C - APEGapeg.ac.me/nastava/SPR_2016_C_Pokazivaci i dinamicka memorija.pdf · Pokazivači (Pointeri) •Pojam pointera •Operatori za rad sa pointerima •Pokazivači

Dinamička dodjela memorije...

• Primjer

int *ptr;

ptr = malloc( 100 * sizeof(int));

• Uspješno izvršena naredba rezerviše memorijski blok za 100 promenljivih tipa int i adresu ovog bloka dodeljuje pokazivaču ptr, ali ne inicijalizuje ovaj memorijski blok.

Page 31: Programski jezik C - APEGapeg.ac.me/nastava/SPR_2016_C_Pokazivaci i dinamicka memorija.pdf · Pokazivači (Pointeri) •Pojam pointera •Operatori za rad sa pointerima •Pokazivači

Dinamička dodjela memorije...

• Deklaracija funkcije

• void *calloc(unsigned int n, unsigned int vel);

• Traži se alokacija n blokova u memoriji, svaki od vel bajtova i dobija se od ove funkcije:

– NULL ako nema dovoljno memorije ili

– adresa 1. bloka (generički pokazivač void *), pri čemu je svaki bajt u svakom bloku inicijalizovan na vrijednost 0.

Page 32: Programski jezik C - APEGapeg.ac.me/nastava/SPR_2016_C_Pokazivaci i dinamicka memorija.pdf · Pokazivači (Pointeri) •Pojam pointera •Operatori za rad sa pointerima •Pokazivači

Dinamička dodjela memorije...

• Primjer

int *ptr;

ptr = calloc( 10, 100 * sizeof(int));

• Uspješno izvršena naredba rezerviše i inicijalizuje (na vrijednost 0) 10 memorijskih blokova, svaki od 100 promenljivih tipa int i adresu prvog od ovih blokova dodeljuje pokazivaču ptr.

Page 33: Programski jezik C - APEGapeg.ac.me/nastava/SPR_2016_C_Pokazivaci i dinamicka memorija.pdf · Pokazivači (Pointeri) •Pojam pointera •Operatori za rad sa pointerima •Pokazivači

Dinamička dodjela memorije...

• Deklaracija funkcije

• void *realloc(void *ptr, unsigned int vel);

• Traži se izmjena veličine dodeljenog prostora u memoriji, počev od adrese ptr, na vel bajtova, i dobija:

– NULL ako nema dovoljno memorije za izmjenu ili

– adresa prostora izmjenjene veličine (generički pokazivač void *).

Page 34: Programski jezik C - APEGapeg.ac.me/nastava/SPR_2016_C_Pokazivaci i dinamicka memorija.pdf · Pokazivači (Pointeri) •Pojam pointera •Operatori za rad sa pointerima •Pokazivači

Dinamička dodjela memorije...

• Primjer 1:

int *ptr;

ptr = malloc( 100 * sizeof(int));

.....

ptr = realloc( ptr, 500 * sizeof(int));

• Uspješno izvršena naredba mijenja veličinu dodijeljenog prostora od adrese ptr, sa 100 na 500 promenljivih tipa int i adresu ovog bloka dodeljuje pokazivaču ptr (ne mijenja se postojeći sadržaj od adrese ptr).

Page 35: Programski jezik C - APEGapeg.ac.me/nastava/SPR_2016_C_Pokazivaci i dinamicka memorija.pdf · Pokazivači (Pointeri) •Pojam pointera •Operatori za rad sa pointerima •Pokazivači

Dinamička dodjela memorije...

• Primjer 2:

int *ptr;

ptr = malloc( 100 * sizeof(int));

ptr = realloc( ptr, 10 * sizeof(int));

• Uspješno izvršena naredba mijenja veličinu dodijeljenog prostora od adrese ptr, sa 100 na 10 promenljivih tipa int i adresu ovog bloka dodeljuje pokazivaču ptr (ne mijenja se sadržaj zadržanih bajtova od adrese ptr).

Page 36: Programski jezik C - APEGapeg.ac.me/nastava/SPR_2016_C_Pokazivaci i dinamicka memorija.pdf · Pokazivači (Pointeri) •Pojam pointera •Operatori za rad sa pointerima •Pokazivači

Dinamička dodjela memorije...

• Deklaracija funkcije

• void free(void *ptr);

• Oslobađa se prostor u memoriji, počev od adrese ptr, samo ako je dinamički dodijeljen.

Page 37: Programski jezik C - APEGapeg.ac.me/nastava/SPR_2016_C_Pokazivaci i dinamicka memorija.pdf · Pokazivači (Pointeri) •Pojam pointera •Operatori za rad sa pointerima •Pokazivači

Dinamička dodjela memorije...

• Primjer:

int *ptr;

ptr = malloc( 100 * sizeof(int));

...

ptr = realloc( ptr, 500 * sizeof(int));

...

free(ptr);

• Oslobadja memoriju od adrese ptr.

Page 38: Programski jezik C - APEGapeg.ac.me/nastava/SPR_2016_C_Pokazivaci i dinamicka memorija.pdf · Pokazivači (Pointeri) •Pojam pointera •Operatori za rad sa pointerima •Pokazivači

Dinamička dodjela memorije... #include <stdio.h>

#include <string.h>

#include <stdlib.h>

main()

{

char *bafer;

bafer = (char *)malloc( 12 ); // Umjesto char bafer[12];

if( bafer == NULL ) { printf("\nGreska alokacije"); exit(1); }

printf( "\n Kreiran bafer velicine 12 bajtova");

strcpy(bafer, "Jedan tekst");

printf("\nSadrzaj bafera: %s", bafer);

bafer =(char *)realloc( bafer, 24 ); // Umjesto char bafer[24];

if(bafer == NULL) { printf("\nGreska realokacije"); exit(1); }

printf( "\nVelicina bafera promenjena na 24 bajtova" );

printf("\nBafer jos uvek sadrzi: %s", bafer);

strcat(bafer, " Drugi tekst");

printf("\nBafer sada sadrzi: %s\n", bafer); //Ne bi bilo sa char bafer[12];

free(bafer);

getchar();

}