osnove programiranja pointeri i 1d polja - …tniksic/fi/materijali/lec8.pdf · osnove...

Post on 05-Sep-2018

261 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

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