You are on page 1of 34

Osnove

programiranja

Dinamičko
Pointeri i 1D polja
alociranje
memorije
Pointeri i 1D polja • pointeri i polja su usko vezani
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
• neka su pointer px i polje x istog tipa
Funkcija realloc
Funkcija free • sljedeće dvije naredbe su ekvivalentne
px=&x[0];
px=x;

• obje naredbe pointeru px pridružuju adresu


prvog elementa polja x
• elementu polja x[i] možemo pristupiti i pomoću
pointera *(px+i)
Osnove
programiranja • sljedeći dio koda ilustrira vezu polja i pointera

Dinamičko
alociranje
memorije int x[]={3,5,1};
Pointeri i 1D polja
Polje pointera int i;
Pointeri i 2D polja
Funkcije malloc i calloc
int *px=x;
Funkcija realloc for(i=0;i<3;i++)
Funkcija free
{
printf("x[%d]=%d\n",i,x[i]);
printf("*(px+%d)=%d\n",i,*(px+i));
}
Osnove
programiranja • sljedeći dio koda ilustrira vezu polja i pointera

Dinamičko
alociranje
memorije int x[]={3,5,1};
Pointeri i 1D polja
Polje pointera int i;
Pointeri i 2D polja
Funkcije malloc i calloc
int *px=x;
Funkcija realloc for(i=0;i<3;i++)
Funkcija free
{
printf("x[%d]=%d\n",i,x[i]);
printf("*(px+%d)=%d\n",i,*(px+i));
}

• inicijaliziramo cjelobrojno polje od tri elementa


Osnove
programiranja • sljedeći dio koda ilustrira vezu polja i pointera

Dinamičko
alociranje
memorije int x[]={3,5,1};
Pointeri i 1D polja
Polje pointera int i;
Pointeri i 2D polja
Funkcije malloc i calloc
int *px=x;
Funkcija realloc for(i=0;i<3;i++)
Funkcija free
{
printf("x[%d]=%d\n",i,x[i]);
printf("*(px+%d)=%d\n",i,*(px+i));
}

• deklariramo cjelobrojnu varijablu koja će služiti


kao brojač
Osnove
programiranja • sljedeći dio koda ilustrira vezu polja i pointera

Dinamičko
alociranje
memorije int x[]={3,5,1};
Pointeri i 1D polja
Polje pointera int i;
Pointeri i 2D polja
Funkcije malloc i calloc
int *px=x;
Funkcija realloc for(i=0;i<3;i++)
Funkcija free
{
printf("x[%d]=%d\n",i,x[i]);
printf("*(px+%d)=%d\n",i,*(px+i));
}

• deklariramo pointer na cjelobrojnu varijablu px i


pridružimo mu adresu prvog elementa polja x
(x[0])
• ekvivalentna naredba bi bila px=&x[0];
Osnove
programiranja • sljedeći dio koda ilustrira vezu polja i pointera

Dinamičko
alociranje
memorije int x[]={3,5,1};
Pointeri i 1D polja
Polje pointera int i;
Pointeri i 2D polja
Funkcije malloc i calloc
int *px=x;
Funkcija realloc for(i=0;i<3;i++)
Funkcija free
{
printf("x[%d]=%d\n",i,x[i]);
printf("*(px+%d)=%d\n",i,*(px+i));
}

• ulazimo u for petlju, brojač i=0


Osnove
programiranja • sljedeći dio koda ilustrira vezu polja i pointera

Dinamičko
alociranje
memorije int x[]={3,5,1}; x[0]=3
Pointeri i 1D polja
Polje pointera int i;
Pointeri i 2D polja
Funkcije malloc i calloc
int *px=x;
Funkcija realloc for(i=0;i<3;i++)
Funkcija free
{
printf("x[%d]=%d\n",i,x[i]);
printf("*(px+%d)=%d\n",i,*(px+i));
}

• ispisujemo element polja x[0]


Osnove
programiranja • sljedeći dio koda ilustrira vezu polja i pointera

Dinamičko
alociranje
memorije int x[]={3,5,1}; x[0]=3
Pointeri i 1D polja
Polje pointera int i; *px=3
Pointeri i 2D polja
Funkcije malloc i calloc
int *px=x;
Funkcija realloc for(i=0;i<3;i++)
Funkcija free
{
printf("x[%d]=%d\n",i,x[i]);
printf("*(px+%d)=%d\n",i,*(px+i));
}

• ispisujemo sadržaj varijable na koju pokazuje


pointer px
Osnove
programiranja • sljedeći dio koda ilustrira vezu polja i pointera

Dinamičko
alociranje
memorije int x[]={3,5,1}; x[0]=3
Pointeri i 1D polja
Polje pointera int i; *px=3
Pointeri i 2D polja
Funkcije malloc i calloc
int *px=x;
Funkcija realloc for(i=0;i<3;i++)
Funkcija free
{
printf("x[%d]=%d\n",i,x[i]);
printf("*(px+%d)=%d\n",i,*(px+i));
}

• brojač i=1
Osnove
programiranja • sljedeći dio koda ilustrira vezu polja i pointera

Dinamičko
alociranje
memorije int x[]={3,5,1}; x[0]=3
Pointeri i 1D polja
Polje pointera int i; *px=3
Pointeri i 2D polja
Funkcije malloc i calloc
int *px=x; x[1]=5
Funkcija realloc for(i=0;i<3;i++)
Funkcija free
{
printf("x[%d]=%d\n",i,x[i]);
printf("*(px+%d)=%d\n",i,*(px+i));
}

• ispisujemo element polja x[1]


Osnove
programiranja • sljedeći dio koda ilustrira vezu polja i pointera

Dinamičko
alociranje
memorije int x[]={3,5,1}; x[0]=3
Pointeri i 1D polja
Polje pointera int i; *px=3
Pointeri i 2D polja
Funkcije malloc i calloc
int *px=x; x[1]=5
Funkcija realloc for(i=0;i<3;i++) *(px+1)=5
Funkcija free
{
printf("x[%d]=%d\n",i,x[i]);
printf("*(px+%d)=%d\n",i,*(px+i));
}

• ispisujemo sadržaj varijable na koju pokazuje


pointer px+1
Osnove
programiranja • sljedeći dio koda ilustrira vezu polja i pointera

Dinamičko
alociranje
memorije int x[]={3,5,1}; x[0]=3
Pointeri i 1D polja
Polje pointera int i; *px=3
Pointeri i 2D polja
Funkcije malloc i calloc
int *px=x; x[1]=5
Funkcija realloc for(i=0;i<3;i++) *(px+1)=5
Funkcija free
{
printf("x[%d]=%d\n",i,x[i]);
printf("*(px+%d)=%d\n",i,*(px+i));
}

• brojač i=2
Osnove
programiranja • sljedeći dio koda ilustrira vezu polja i pointera

Dinamičko
alociranje
memorije int x[]={3,5,1}; x[0]=3
Pointeri i 1D polja
Polje pointera int i; *px=3
Pointeri i 2D polja
Funkcije malloc i calloc
int *px=x; x[1]=5
Funkcija realloc for(i=0;i<3;i++) *(px+1)=5
Funkcija free
{ x[2]=1
printf("x[%d]=%d\n",i,x[i]);
printf("*(px+%d)=%d\n",i,*(px+i));
}

• ispisujemo element polja x[2]


Osnove
programiranja • sljedeći dio koda ilustrira vezu polja i pointera

Dinamičko
alociranje
memorije int x[]={3,5,1}; x[0]=3
Pointeri i 1D polja
Polje pointera int i; *px=3
Pointeri i 2D polja
Funkcije malloc i calloc
int *px=x; x[1]=5
Funkcija realloc for(i=0;i<3;i++) *(px+1)=5
Funkcija free
{ x[2]=1
printf("x[%d]=%d\n",i,x[i]); *(px+2)=1
printf("*(px+%d)=%d\n",i,*(px+i));
}

• ispisujemo sadržaj varijable na koju pokazuje


pointer px+2
• elementima polja možemo bez problema
pristupati koristeći pointere
Osnove
programiranja Važno!
• polje i pointer nisu potpuno ekvivalentni
Dinamičko
alociranje • neka je x polje, a px pointer istog tipa
memorije
Pointeri i 1D polja
Polje pointera
• varijabla x je konstanta jer ne možemo mijenjati
Pointeri i 2D polja
Funkcije malloc i calloc lokaciju polja u memoriji računala, nego samo
Funkcija realloc
Funkcija free vrijednosti elemenata polja
• zato naredbe tipa x++ ne funkcioniraju
• ekvivalentne naredbe s pointerima (npr. px++)
su potpuno legalne
Osnove
programiranja

Dinamičko
Polje pointera
alociranje
memorije
Pointeri i 1D polja • osim varijable pokazivačkog tipa možemo
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
deklarirati i polje varijabli pokazivačkog tipa tj.
Funkcija realloc
Funkcija free
polje pointera

int x[]={12,24,35}; x[0] x[1] x[2]


int *px[3];
px[0]=&x[0]; - - -
px[1]=&x[1];
px[2]=&x[2]; 10 14 18

px[0] px[1] px[2]

- - -

56 60 64
Osnove
programiranja

Dinamičko
Polje pointera
alociranje
memorije
Pointeri i 1D polja • osim varijable pokazivačkog tipa možemo
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
deklarirati i polje varijabli pokazivačkog tipa tj.
Funkcija realloc
Funkcija free
polje pointera

int x[]={12,24,35}; x[0] x[1] x[2]


int *px[3];
px[0]=&x[0]; 12 24 35
px[1]=&x[1];
px[2]=&x[2]; 10 14 18

px[0] px[1] px[2]

- - -

56 60 64
Osnove
programiranja

Dinamičko
Polje pointera
alociranje
memorije
Pointeri i 1D polja • osim varijable pokazivačkog tipa možemo
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
deklarirati i polje varijabli pokazivačkog tipa tj.
Funkcija realloc
Funkcija free
polje pointera

int x[]={12,24,35}; x[0] x[1] x[2]


int *px[3];
px[0]=&x[0]; 12 24 35
px[1]=&x[1];
px[2]=&x[2]; 10 14 18

px[0] px[1] px[2]

- - -

56 60 64
Osnove
programiranja

Dinamičko
Polje pointera
alociranje
memorije
Pointeri i 1D polja • osim varijable pokazivačkog tipa možemo
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
deklarirati i polje varijabli pokazivačkog tipa tj.
Funkcija realloc
Funkcija free
polje pointera

int x[]={12,24,35}; x[0] x[1] x[2]


int *px[3];
px[0]=&x[0]; 12 24 35
px[1]=&x[1];
px[2]=&x[2]; 10 14 18

px[0] px[1] px[2]

10 - -

56 60 64
Osnove
programiranja

Dinamičko
Polje pointera
alociranje
memorije
Pointeri i 1D polja • osim varijable pokazivačkog tipa možemo
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
deklarirati i polje varijabli pokazivačkog tipa tj.
Funkcija realloc
Funkcija free
polje pointera

int x[]={12,24,35}; x[0] x[1] x[2]


int *px[3];
px[0]=&x[0]; 12 24 35
px[1]=&x[1];
px[2]=&x[2]; 10 14 18

px[0] px[1] px[2]

10 14 -

56 60 64
Osnove
programiranja

Dinamičko
Polje pointera
alociranje
memorije
Pointeri i 1D polja • osim varijable pokazivačkog tipa možemo
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
deklarirati i polje varijabli pokazivačkog tipa tj.
Funkcija realloc
Funkcija free
polje pointera

int x[]={12,24,35}; x[0] x[1] x[2]


int *px[3];
px[0]=&x[0]; 12 24 35
px[1]=&x[1];
px[2]=&x[2]; 10 14 18

px[0] px[1] px[2]

10 14 18

56 60 64
Osnove
programiranja

Dinamičko
Pointeri i 2D polja
alociranje
memorije
Pointeri i 1D polja • organizacija "fixed sized" 2D polja A[m][n] u
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
memoriji računala
Funkcija realloc
Funkcija free
A[0][0] A[0][1] A[0][2] A[0][3] A[0][4]

A 13 33 76 45 11

A[1][0] A[1][1] A[1][2] A[1][3] A[1][4]

99 92 14 17 18

A[2][0] A[2][1] A[2][2] A[2][3] A[2][4]

43 87 44 32 76

• element polja A[i][j] nalazi se na adresi


&A[0][0]+(n*i+j)*sizeof(tip_polja)
Osnove
programiranja • 2D polje možemo organizirati i kao pointer na
niz pointera
Dinamičko
alociranje **A *A[0] A[0][0] A[0][1] A[0][2] A[0][3] A[0][4]
memorije
Pointeri i 1D polja 45 20 13 33 76 45 11
Polje pointera
Pointeri i 2D polja 77 45 20
Funkcije malloc i calloc
Funkcija realloc *A[1] A[1][0] A[1][1] A[1][2] A[1][3] A[1][4]
Funkcija free
40 99 92 14 17 18
40
*A[2] A[2][0] A[2][1] A[2][2] A[2][3] A[2][4]

60 43 87 44 32 76
60

• element polja A[i][j]


• adresi na koju pokazuje A dodaj i → A[i]
• adresi na koju pokazuje A[i] dodaj j → A[i][j]
Osnove
programiranja

Dinamičko
Funkcije malloc i calloc
alociranje
memorije
Pointeri i 1D polja • dinamičko alociranje memorije → varijable i polja
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
alociramo za vrijeme izvršavanja programa, a ne
Funkcija realloc
Funkcija free
kao dosada za vrijeme prevod̄enja programa
• koristimo funkcije malloc i calloc deklarirane u
• funkcija malloc kao argument uzima broj
byte-ova koje treba rezervirati za polje, a vraća
pointer na rezervirani blok memorije ili NULL
pointer ako zahtjev za alociranjem nije mogao
biti ispunjen (jer npr. nema dovoljno memorije)
• pointer koji funkcija malloc vraća je generički
(tipa void) pa ga prije upotrebe treba konvertirati
u željeni tip cast operatorom
Osnove
programiranja • sljedeći fragment koda pokazuje kako funkcijom
malloc možemo rezrvirati memoriju za 128
Dinamičko
alociranje
varijabli tipa double
memorije
Pointeri i 1D polja • ne smijemo zaboraviti uključiti biblioteku
Polje pointera
Pointeri i 2D polja <stdlib.h>
Funkcije malloc i calloc
Funkcija realloc
Funkcija free
double *px;
int broj=128;
px=(double*) malloc(broj*sizeof(double));
if(px==NULL){
printf("Memorija nije rezervirana\n");
exit(-1);
}
Osnove
programiranja • sljedeći fragment koda pokazuje kako funkcijom
malloc možemo rezrvirati memoriju za 128
Dinamičko
alociranje
varijabli tipa double
memorije
Pointeri i 1D polja • ne smijemo zaboraviti uključiti biblioteku
Polje pointera
Pointeri i 2D polja <stdlib.h>
Funkcije malloc i calloc
Funkcija realloc
Funkcija free
double *px;
int broj=128;
px=(double*) malloc(broj*sizeof(double));
if(px==NULL){
printf("Memorija nije rezervirana\n");
exit(-1);
}

• deklariramo pointer px tipa double


Osnove
programiranja • sljedeći fragment koda pokazuje kako funkcijom
malloc možemo rezrvirati memoriju za 128
Dinamičko
alociranje
varijabli tipa double
memorije
Pointeri i 1D polja • ne smijemo zaboraviti uključiti biblioteku
Polje pointera
Pointeri i 2D polja <stdlib.h>
Funkcije malloc i calloc
Funkcija realloc
Funkcija free
double *px;
int broj=128;
px=(double*) malloc(broj*sizeof(double));
if(px==NULL){
printf("Memorija nije rezervirana\n");
exit(-1);
}

• definiramo broj varijabli za koje trebamo


rezervirati memoriju
Osnove
programiranja • sljedeći fragment koda pokazuje kako funkcijom
malloc možemo rezrvirati memoriju za 128
Dinamičko
alociranje
varijabli tipa double
memorije
Pointeri i 1D polja • ne smijemo zaboraviti uključiti biblioteku
Polje pointera
Pointeri i 2D polja <stdlib.h>
Funkcije malloc i calloc
Funkcija realloc
Funkcija free
double *px;
int broj=128;
px=(double*) malloc(broj*sizeof(double));
if(px==NULL){
printf("Memorija nije rezervirana\n");
exit(-1);
}

• pozivamo funkciju malloc


Osnove
programiranja • sljedeći fragment koda pokazuje kako funkcijom
malloc možemo rezrvirati memoriju za 128
Dinamičko
alociranje
varijabli tipa double
memorije
Pointeri i 1D polja • ne smijemo zaboraviti uključiti biblioteku
Polje pointera
Pointeri i 2D polja <stdlib.h>
Funkcije malloc i calloc
Funkcija realloc
Funkcija free
double *px;
int broj=128;
px=(double*) malloc(broj*sizeof(double));
if(px==NULL){
printf("Memorija nije rezervirana\n");
exit(-1);
}

• argument fukcije malloc je broj byte-ova koji


želimo rezervirati
• broj varijabli pomnožimo s brojem byte-ova koje
zauzima varijabla dotičnog tipa
Osnove
programiranja • sljedeći fragment koda pokazuje kako funkcijom
malloc možemo rezrvirati memoriju za 128
Dinamičko
alociranje
varijabli tipa double
memorije
Pointeri i 1D polja • ne smijemo zaboraviti uključiti biblioteku
Polje pointera
Pointeri i 2D polja <stdlib.h>
Funkcije malloc i calloc
Funkcija realloc
Funkcija free
double *px;
int broj=128;
px=(double*) malloc(broj*sizeof(double));
if(px==NULL){
printf("Memorija nije rezervirana\n");
exit(-1);
}

• generički pointer koji vraća funkcija malloc cast


operatorom (double*) pretvaramo u pointer tipa
double
Osnove
programiranja • sljedeći fragment koda pokazuje kako funkcijom
malloc možemo rezrvirati memoriju za 128
Dinamičko
alociranje
varijabli tipa double
memorije
Pointeri i 1D polja • ne smijemo zaboraviti uključiti biblioteku
Polje pointera
Pointeri i 2D polja <stdlib.h>
Funkcije malloc i calloc
Funkcija realloc
Funkcija free
double *px;
int broj=128;
px=(double*) malloc(broj*sizeof(double));
if(px==NULL){
printf("Memorija nije rezervirana\n");
exit(-1);
}

• provjerimo da li je memorija rezervirana


• ako je došlo do greške malloc vraća NULL
pointer, program obavještava korisnika o grešci i
prekida izvršavanje
Osnove
programiranja • funkcija calloc funkcionira slično kao funkcija
calloc
Dinamičko
alociranje
• razlike izmed̄u funkcija malloc i calloc
memorije
Pointeri i 1D polja • funkcija calloc uzima dva argumenta: broj
Polje pointera
Pointeri i 2D polja varijabli za koje želimo rezervirati memoriju i
Funkcije malloc i calloc
Funkcija realloc veličinu tipa varijable
Funkcija free
• vrijednost varijabli rezerviranih funkcijom calloc
se postavlja na nulu, dok je vrijednost varijabli
rezerviranih funkcijom malloc proizvoljna
double *px;
int broj=128;
px=(double*)calloc(broj,sizeof(double));
if(px==NULL){
printf("Memorija nije rezervirana\n");
exit(-1);
}
Osnove
programiranja

Dinamičko
Funkcija realloc
alociranje
memorije
Pointeri i 1D polja • funkciju realloc koristimo da bi rezervirali
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
dodatnu memoriju
Funkcija realloc
Funkcija free
• argumenti funkcije realloc su pointer na dosad
rezerviranu memoriju i broj dodatnih byte-ova
koje želimo rezervirati
• u sljedećemo primjeru rezerviramo mjesto za
dodatnih 256 varijabli tipa double
• u praksi bi još morali provjeriti da li je memorija
doista rezervirana
double *px;
int broj=128;
px=(double*)calloc(broj,sizeof(double));
int dodatno=256;
px=realloc(px,dodatno*sizeof(double));
Osnove
programiranja

Dinamičko
Funkcija free
alociranje
memorije
Pointeri i 1D polja • kada nam rezervirana memorija više ne treba
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
moramo je osloboditi
Funkcija realloc
Funkcija free
• koristimo funkciju free deklariranu u
• argument funkcije free je pointer na blok
memorije koji želimo osloboditi
double *px;
int broj=128;
px=(double*)calloc(broj,sizeof(double));
if(px==NULL){
printf("Memorija nije rezervirana\n");
exit(-1);
}
free(px);

You might also like