osnove programiranja pointeri i 1d polja - …tniksic/fi/materijali/lec8.pdf · osnove...
Post on 05-Sep-2018
257 Views
Preview:
TRANSCRIPT
Osnoveprogramiranja
DinamickoalociranjememorijePointeri i 1D polja
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
Funkcija realloc
Funkcija free
Pointeri i 1D polja
• pointeri i polja su usko vezani• neka su pointer px i polje x istog tipa• sljedece dvije naredbe su ekvivalentne
px=&x[0];px=x;
• obje naredbe pointeru px pridružuju adresuprvog elementa polja x
• elementu polja x[i] možemo pristupiti i pomocupointera *(px+i)
Osnoveprogramiranja
DinamickoalociranjememorijePointeri i 1D polja
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
Funkcija realloc
Funkcija free
• sljedeci dio koda ilustrira vezu polja i pointera
int x[]={3,5,1};
int i;int *px=x;for(i=0;i<3;i++){
printf("x[%d]=%d\n",i,x[i]);printf("*(px+%d)=%d\n",i,*(px+i));
}
Osnoveprogramiranja
DinamickoalociranjememorijePointeri i 1D polja
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
Funkcija realloc
Funkcija free
• sljedeci dio koda ilustrira vezu polja i pointera
int x[]={3,5,1};
int i;int *px=x;for(i=0;i<3;i++){
printf("x[%d]=%d\n",i,x[i]);printf("*(px+%d)=%d\n",i,*(px+i));
}
• inicijaliziramo cjelobrojno polje od tri elementa
Osnoveprogramiranja
DinamickoalociranjememorijePointeri i 1D polja
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
Funkcija realloc
Funkcija free
• sljedeci dio koda ilustrira vezu polja i pointera
int x[]={3,5,1};
int i;int *px=x;for(i=0;i<3;i++){
printf("x[%d]=%d\n",i,x[i]);printf("*(px+%d)=%d\n",i,*(px+i));
}
• deklariramo cjelobrojnu varijablu koja ce služitikao brojac
Osnoveprogramiranja
DinamickoalociranjememorijePointeri i 1D polja
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
Funkcija realloc
Funkcija free
• sljedeci dio koda ilustrira vezu polja i pointera
int x[]={3,5,1};
int i;int *px=x;for(i=0;i<3;i++){
printf("x[%d]=%d\n",i,x[i]);printf("*(px+%d)=%d\n",i,*(px+i));
}
• deklariramo pointer na cjelobrojnu varijablu px ipridružimo mu adresu prvog elementa polja x(x[0])
• ekvivalentna naredba bi bila px=&x[0];
Osnoveprogramiranja
DinamickoalociranjememorijePointeri i 1D polja
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
Funkcija realloc
Funkcija free
• sljedeci dio koda ilustrira vezu polja i pointera
int x[]={3,5,1};
int i;int *px=x;for(i=0;i<3;i++){
printf("x[%d]=%d\n",i,x[i]);printf("*(px+%d)=%d\n",i,*(px+i));
}
• ulazimo u for petlju, brojac i=0
Osnoveprogramiranja
DinamickoalociranjememorijePointeri i 1D polja
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
Funkcija realloc
Funkcija free
• sljedeci dio koda ilustrira vezu polja i pointera
int x[]={3,5,1};
int i;int *px=x;for(i=0;i<3;i++){
printf("x[%d]=%d\n",i,x[i]);printf("*(px+%d)=%d\n",i,*(px+i));
}
x[0]=3
• ispisujemo element polja x[0]
Osnoveprogramiranja
DinamickoalociranjememorijePointeri i 1D polja
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
Funkcija realloc
Funkcija free
• sljedeci dio koda ilustrira vezu polja i pointera
int x[]={3,5,1};
int i;int *px=x;for(i=0;i<3;i++){
printf("x[%d]=%d\n",i,x[i]);printf("*(px+%d)=%d\n",i,*(px+i));
}
x[0]=3*px=3
• ispisujemo sadržaj varijable na koju pokazujepointer px
Osnoveprogramiranja
DinamickoalociranjememorijePointeri i 1D polja
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
Funkcija realloc
Funkcija free
• sljedeci dio koda ilustrira vezu polja i pointera
int x[]={3,5,1};
int i;int *px=x;for(i=0;i<3;i++){
printf("x[%d]=%d\n",i,x[i]);printf("*(px+%d)=%d\n",i,*(px+i));
}
x[0]=3*px=3
• brojac i=1
Osnoveprogramiranja
DinamickoalociranjememorijePointeri i 1D polja
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
Funkcija realloc
Funkcija free
• sljedeci dio koda ilustrira vezu polja i pointera
int x[]={3,5,1};
int i;int *px=x;for(i=0;i<3;i++){
printf("x[%d]=%d\n",i,x[i]);printf("*(px+%d)=%d\n",i,*(px+i));
}
x[0]=3*px=3x[1]=5
• ispisujemo element polja x[1]
Osnoveprogramiranja
DinamickoalociranjememorijePointeri i 1D polja
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
Funkcija realloc
Funkcija free
• sljedeci dio koda ilustrira vezu polja i pointera
int x[]={3,5,1};
int i;int *px=x;for(i=0;i<3;i++){
printf("x[%d]=%d\n",i,x[i]);printf("*(px+%d)=%d\n",i,*(px+i));
}
x[0]=3*px=3x[1]=5*(px+1)=5
• ispisujemo sadržaj varijable na koju pokazujepointer px+1
Osnoveprogramiranja
DinamickoalociranjememorijePointeri i 1D polja
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
Funkcija realloc
Funkcija free
• sljedeci dio koda ilustrira vezu polja i pointera
int x[]={3,5,1};
int i;int *px=x;for(i=0;i<3;i++){
printf("x[%d]=%d\n",i,x[i]);printf("*(px+%d)=%d\n",i,*(px+i));
}
x[0]=3*px=3x[1]=5*(px+1)=5
• brojac i=2
Osnoveprogramiranja
DinamickoalociranjememorijePointeri i 1D polja
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
Funkcija realloc
Funkcija free
• sljedeci dio koda ilustrira vezu polja i pointera
int x[]={3,5,1};
int i;int *px=x;for(i=0;i<3;i++){
printf("x[%d]=%d\n",i,x[i]);printf("*(px+%d)=%d\n",i,*(px+i));
}
x[0]=3*px=3x[1]=5*(px+1)=5x[2]=1
• ispisujemo element polja x[2]
Osnoveprogramiranja
DinamickoalociranjememorijePointeri i 1D polja
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
Funkcija realloc
Funkcija free
• sljedeci dio koda ilustrira vezu polja i pointera
int x[]={3,5,1};
int i;int *px=x;for(i=0;i<3;i++){
printf("x[%d]=%d\n",i,x[i]);printf("*(px+%d)=%d\n",i,*(px+i));
}
x[0]=3*px=3x[1]=5*(px+1)=5x[2]=1*(px+2)=1
• ispisujemo sadržaj varijable na koju pokazujepointer px+2
• elementima polja možemo bez problemapristupati koristeci pointere
Osnoveprogramiranja
DinamickoalociranjememorijePointeri i 1D polja
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
Funkcija realloc
Funkcija free
Važno!• polje i pointer nisu potpuno ekvivalentni• neka je x polje, a px pointer istog tipa• varijabla x je konstanta jer ne možemo mijenjati
lokaciju polja u memoriji racunala, nego samovrijednosti elemenata polja
• zato naredbe tipa x++ ne funkcioniraju• ekvivalentne naredbe s pointerima (npr. px++)
su potpuno legalne
Osnoveprogramiranja
DinamickoalociranjememorijePointeri i 1D polja
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
Funkcija realloc
Funkcija free
Polje pointera
• osim varijable pokazivackog tipa možemodeklarirati i polje varijabli pokazivackog tipa tj.polje pointera
int x[]={12,24,35};int *px[3];px[0]=&x[0];px[1]=&x[1];px[2]=&x[2];
-
x[0]
10
-
x[1]
14
-
x[2]
18
-
px[0]
56
-
px[1]
60
-
px[2]
64
Osnoveprogramiranja
DinamickoalociranjememorijePointeri i 1D polja
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
Funkcija realloc
Funkcija free
Polje pointera
• osim varijable pokazivackog tipa možemodeklarirati i polje varijabli pokazivackog tipa tj.polje pointera
int x[]={12,24,35};int *px[3];px[0]=&x[0];px[1]=&x[1];px[2]=&x[2];
12
x[0]
10
24
x[1]
14
35
x[2]
18
-
px[0]
56
-
px[1]
60
-
px[2]
64
Osnoveprogramiranja
DinamickoalociranjememorijePointeri i 1D polja
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
Funkcija realloc
Funkcija free
Polje pointera
• osim varijable pokazivackog tipa možemodeklarirati i polje varijabli pokazivackog tipa tj.polje pointera
int x[]={12,24,35};int *px[3];px[0]=&x[0];px[1]=&x[1];px[2]=&x[2];
12
x[0]
10
24
x[1]
14
35
x[2]
18
-
px[0]
56
-
px[1]
60
-
px[2]
64
Osnoveprogramiranja
DinamickoalociranjememorijePointeri i 1D polja
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
Funkcija realloc
Funkcija free
Polje pointera
• osim varijable pokazivackog tipa možemodeklarirati i polje varijabli pokazivackog tipa tj.polje pointera
int x[]={12,24,35};int *px[3];px[0]=&x[0];px[1]=&x[1];px[2]=&x[2];
12
x[0]
10
24
x[1]
14
35
x[2]
18
10
px[0]
56
-
px[1]
60
-
px[2]
64
Osnoveprogramiranja
DinamickoalociranjememorijePointeri i 1D polja
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
Funkcija realloc
Funkcija free
Polje pointera
• osim varijable pokazivackog tipa možemodeklarirati i polje varijabli pokazivackog tipa tj.polje pointera
int x[]={12,24,35};int *px[3];px[0]=&x[0];px[1]=&x[1];px[2]=&x[2];
12
x[0]
10
24
x[1]
14
35
x[2]
18
10
px[0]
56
14
px[1]
60
-
px[2]
64
Osnoveprogramiranja
DinamickoalociranjememorijePointeri i 1D polja
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
Funkcija realloc
Funkcija free
Polje pointera
• osim varijable pokazivackog tipa možemodeklarirati i polje varijabli pokazivackog tipa tj.polje pointera
int x[]={12,24,35};int *px[3];px[0]=&x[0];px[1]=&x[1];px[2]=&x[2];
12
x[0]
10
24
x[1]
14
35
x[2]
18
10
px[0]
56
14
px[1]
60
18
px[2]
64
Osnoveprogramiranja
DinamickoalociranjememorijePointeri i 1D polja
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
Funkcija realloc
Funkcija free
Pointeri i 2D polja
• organizacija "fixed sized" 2D polja A[m][n] umemoriji racunala
13
A[0][0]
33
A[0][1]
76
A[0][2]
45
A[0][3]
11
A[0][4]
99
A[1][0]
92
A[1][1]
14
A[1][2]
17
A[1][3]
18
A[1][4]
43
A[2][0]
87
A[2][1]
44
A[2][2]
32
A[2][3]
76
A[2][4]
A
• element polja A[i][j] nalazi se na adresi
&A[0][0]+(n*i+j)*sizeof(tip_polja)
Osnoveprogramiranja
DinamickoalociranjememorijePointeri i 1D polja
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
Funkcija realloc
Funkcija free
• 2D polje možemo organizirati i kao pointer naniz pointera
13
A[0][0]
20
33
A[0][1]
76
A[0][2]
45
A[0][3]
11
A[0][4]
99
A[1][0]
40
92
A[1][1]
14
A[1][2]
17
A[1][3]
18
A[1][4]
43
A[2][0]
60
87
A[2][1]
44
A[2][2]
32
A[2][3]
76
A[2][4]
20
*A[0]
45
40
*A[1]
60
*A[2]
45
**A
77
• 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]
Osnoveprogramiranja
DinamickoalociranjememorijePointeri i 1D polja
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
Funkcija realloc
Funkcija free
Funkcije malloc i calloc
• dinamicko alociranje memorije → varijable i poljaalociramo za vrijeme izvršavanja programa, a nekao dosada za vrijeme prevodenja programa
• koristimo funkcije malloc i calloc deklarirane u• funkcija malloc kao argument uzima broj
byte-ova koje treba rezervirati za polje, a vracapointer na rezervirani blok memorije ili NULLpointer ako zahtjev za alociranjem nije mogaobiti ispunjen (jer npr. nema dovoljno memorije)
• pointer koji funkcija malloc vraca je genericki(tipa void) pa ga prije upotrebe treba konvertiratiu željeni tip cast operatorom
Osnoveprogramiranja
DinamickoalociranjememorijePointeri i 1D polja
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
Funkcija realloc
Funkcija free
• sljedeci fragment koda pokazuje kako funkcijommalloc možemo rezrvirati memoriju za 128varijabli tipa double
• ne smijemo zaboraviti ukljuciti biblioteku<stdlib.h>
double *px;int broj=128;px=(double*) malloc(broj*sizeof(double));if(px==NULL){
printf("Memorija nije rezervirana\n");exit(-1);
}
Osnoveprogramiranja
DinamickoalociranjememorijePointeri i 1D polja
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
Funkcija realloc
Funkcija free
• sljedeci fragment koda pokazuje kako funkcijommalloc možemo rezrvirati memoriju za 128varijabli tipa double
• ne smijemo zaboraviti ukljuciti biblioteku<stdlib.h>
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
Osnoveprogramiranja
DinamickoalociranjememorijePointeri i 1D polja
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
Funkcija realloc
Funkcija free
• sljedeci fragment koda pokazuje kako funkcijommalloc možemo rezrvirati memoriju za 128varijabli tipa double
• ne smijemo zaboraviti ukljuciti biblioteku<stdlib.h>
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 trebamorezervirati memoriju
Osnoveprogramiranja
DinamickoalociranjememorijePointeri i 1D polja
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
Funkcija realloc
Funkcija free
• sljedeci fragment koda pokazuje kako funkcijommalloc možemo rezrvirati memoriju za 128varijabli tipa double
• ne smijemo zaboraviti ukljuciti biblioteku<stdlib.h>
double *px;int broj=128;px=(double*) malloc(broj*sizeof(double));if(px==NULL){
printf("Memorija nije rezervirana\n");exit(-1);
}
• pozivamo funkciju malloc
Osnoveprogramiranja
DinamickoalociranjememorijePointeri i 1D polja
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
Funkcija realloc
Funkcija free
• sljedeci fragment koda pokazuje kako funkcijommalloc možemo rezrvirati memoriju za 128varijabli tipa double
• ne smijemo zaboraviti ukljuciti biblioteku<stdlib.h>
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 kojezauzima varijabla doticnog tipa
Osnoveprogramiranja
DinamickoalociranjememorijePointeri i 1D polja
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
Funkcija realloc
Funkcija free
• sljedeci fragment koda pokazuje kako funkcijommalloc možemo rezrvirati memoriju za 128varijabli tipa double
• ne smijemo zaboraviti ukljuciti biblioteku<stdlib.h>
double *px;int broj=128;px=(double*) malloc(broj*sizeof(double));if(px==NULL){
printf("Memorija nije rezervirana\n");exit(-1);
}
• genericki pointer koji vraca funkcija malloc castoperatorom (double*) pretvaramo u pointer tipadouble
Osnoveprogramiranja
DinamickoalociranjememorijePointeri i 1D polja
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
Funkcija realloc
Funkcija free
• sljedeci fragment koda pokazuje kako funkcijommalloc možemo rezrvirati memoriju za 128varijabli tipa double
• ne smijemo zaboraviti ukljuciti biblioteku<stdlib.h>
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 vraca NULL
pointer, program obavještava korisnika o grešci iprekida izvršavanje
Osnoveprogramiranja
DinamickoalociranjememorijePointeri i 1D polja
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
Funkcija realloc
Funkcija free
• funkcija calloc funkcionira slicno kao funkcijacalloc
• razlike izmedu funkcija malloc i calloc• funkcija calloc uzima dva argumenta: broj
varijabli za koje želimo rezervirati memoriju ivelicinu tipa varijable
• vrijednost varijabli rezerviranih funkcijom callocse postavlja na nulu, dok je vrijednost varijablirezerviranih funkcijom malloc proizvoljna
double *px;int broj=128;px=(double*)calloc(broj,sizeof(double));if(px==NULL){
printf("Memorija nije rezervirana\n");exit(-1);
}
Osnoveprogramiranja
DinamickoalociranjememorijePointeri i 1D polja
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
Funkcija realloc
Funkcija free
Funkcija realloc
• funkciju realloc koristimo da bi rezerviralidodatnu memoriju
• argumenti funkcije realloc su pointer na dosadrezerviranu memoriju i broj dodatnih byte-ovakoje želimo rezervirati
• u sljedecemo primjeru rezerviramo mjesto zadodatnih 256 varijabli tipa double
• u praksi bi još morali provjeriti da li je memorijadoista rezervirana
double *px;int broj=128;px=(double*)calloc(broj,sizeof(double));int dodatno=256;px=realloc(px,dodatno*sizeof(double));
Osnoveprogramiranja
DinamickoalociranjememorijePointeri i 1D polja
Polje pointera
Pointeri i 2D polja
Funkcije malloc i calloc
Funkcija realloc
Funkcija free
Funkcija free
• kada nam rezervirana memorija više ne trebamoramo je osloboditi
• koristimo funkciju free deklariranu u• argument funkcije free je pointer na blok
memorije koji želimo osloboditidouble *px;int broj=128;px=(double*)calloc(broj,sizeof(double));if(px==NULL){
printf("Memorija nije rezervirana\n");exit(-1);
}free(px);
top related