Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

64
Varijable i pokazivači

description

Prezentacija sa grafičkim prikazom apstraktnog poimanja složenijih struktura poput vezane liste, te prikaz stanja na stogu i hrpi tijekom izvođenja programa kod automatske i dinamičke alokacije memorije

Transcript of Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

Page 1: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

Varijable i pokazivači

Page 2: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

Rukovanje memorijom

• C++ dozvoljava ručni pristup sljedećim dijelovima memorije:• Stog (stack) – unutar radne memorije, koristi se za automatsko alociranje

varijabli (npr. int a; int* b;)

• Hrpa (heap) – unutar radne memorije, koristi se za dinamičko alociranje objekata (npr. int* c=new int; int *c=new int [10];)

• Sekundarna memorija – na tvrdom disku, koristi se za zapisivanje u datoteku(npr. dat.write((char*)&slog,sizeof(slog)); dat1<<redak;)

Page 3: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

Automatsko alociranje

#include <iostream>

using namespace std;

int globalna=69;

int main () {

char a=2;

for (short i=0;i<10;i++) {

short b=i;

if (b>a) {

cout<<„HaHa! Vekši sam”<<endl;

}

}

return 0;

}

adresa sadržaj stoga

9990 0010 1001

9991 0000 0000

9992 1011 1101

9993 1111 0001

9994 0000 0000

9995 0110 1011

9996 0000 0000

9997 0000 0000

9998 0000 0000

9999 1010 0111

999A 1010 0101

999B 1110 1110

999C 0000 0010

999D 1000 0000

999E 1100 1100

999F 0100 1111

99A0 1111 1111

99A0

kazalo stoga(sadrži adresu dijela stoga koji nije još popunjen)

„Smeće” na stogu preostalo od prijašnje uporabe

Page 4: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

#include <iostream>

using namespace std;

int globalna=69;

int main () {

char a=2;

for (short i=0;i<10;i++) {

short b=i;

if (b>a) {

cout<<„HaHa! Vekši sam”<<endl;

}

}

return 0;

}

adresa sadržaj stoga

9990 0010 1001

9991 0000 0000

9992 1011 1101

9993 1111 0001

9994 0000 0000

9995 0110 1011

9996 0000 0000

9997 0000 0000

9998 0000 0000

9999 1010 0111

999A 1010 0101

999B 1110 1110

999C 0000 0010

999D 0000 0000

999E 0000 0000

999F 0000 0011

99A0 1110 0111

999C

kgf (999)

Pretpostavimo da se u toj biblioteci nalazi

samo varijablaint kgf=999

Automatsko alociranje

Page 5: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

Automatsko alociranje

#include <iostream>

using namespace std;

int globalna=69;

int main () {

char a=2;

for (short i=0;i<10;i++) {

short b=i;

if (b>a) {

cout<<„HaHa! Vekši sam”<<endl;

}

}

return 0;

}

adresa sadržaj stoga

9990 0010 1001

9991 0000 0000

9992 1011 1101

9993 1111 0001

9994 0000 0000

9995 0110 1011

9996 0000 0000

9997 0000 0000

9998 0000 0000

9999 0000 0000

999A 0000 0000

999B 0000 0000

999C 0100 0101

999D 0000 0000

999E 0000 0000

999F 0000 0011

99A0 1110 0111

9998

kgf (999)

globalna (69)

Page 6: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

#include <iostream>

using namespace std;

int globalna=69;

int main () {

char a=2;

for (short i=0;i<10;i++) {

short b=i;

if (b>a) {

cout<<„HaHa! Vekši sam”<<endl;

}

}

return 0;

}

adresa sadržaj stoga

9990 0010 1001

9991 0000 0000

9992 1011 1101

9993 1111 0001

9994 0000 0000

9995 0110 1011

9996 0000 0000

9997 0000 0000

9998 0000 0010

9999 0000 0000

999A 0000 0000

999B 0000 0000

999C 0100 0101

999D 0000 0000

999E 0000 0000

999F 0000 0011

99A0 1110 0111

9997

kgf (999)

globalna (69)

a (2)

Automatsko alociranje

Page 7: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

#include <iostream>

using namespace std;

int globalna=69;

int main () {

char a=2;

for (short i=0;i<10;i++) {

short b=i;

if (b>a) {

cout<<„HaHa! Vekši sam”<<endl;

}

}

return 0;

}

adresa sadržaj stoga

9990 0010 1001

9991 0000 0000

9992 1011 1101

9993 1111 0001

9994 0000 0000

9995 0110 1011

9996 0000 0000

9997 0000 0000

9998 0000 0010

9999 0000 0000

999A 0000 0000

999B 0000 0000

999C 0100 0101

999D 0000 0000

999E 0000 0000

999F 0000 0011

99A0 1110 0111

9995

kgf (999)

globalna (69)

a (2)

i (0)

Automatsko alociranje

Page 8: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

#include <iostream>

using namespace std;

int globalna=69;

int main () {

char a=2;

for (short i=0;i<10;i++) {

short b=i;

if (b>a) {

cout<<„HaHa! Vekši sam”<<endl;

}

}

return 0;

}

adresa sadržaj stoga

9990 0010 1001

9991 0000 0000

9992 1011 1101

9993 1111 0001

9994 0000 0000

9995 0000 0000

9996 0000 0000

9997 0000 0000

9998 0000 0010

9999 0000 0000

999A 0000 0000

999B 0000 0000

999C 0100 0101

999D 0000 0000

999E 0000 0000

999F 0000 0011

99A0 1110 0111

9993

kgf (999)

globalna (69)

a (2)

i (0)

b (0)

Automatsko alociranje

Page 9: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

#include <iostream>

using namespace std;

int globalna=69;

int main () {

char a=2;

for (short i=0;i<10;i++) {

short b=i;

if (b>a) {

cout<<„HaHa! Vekši sam”<<endl;

}

}

return 0;

}

adresa sadržaj stoga

9990 0010 1001

9991 0000 0000

9992 1011 1101

9993 1111 0001

9994 0000 0000

9995 0000 0000

9996 0000 0000

9997 0000 0000

9998 0000 0010

9999 0000 0000

999A 0000 0000

999B 0000 0000

999C 0100 0101

999D 0000 0000

999E 0000 0000

999F 0000 0011

99A0 1110 0111

9995

kgf (999)

globalna (69)

a (2)

i (0)

Automatsko alociranje

Page 10: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

#include <iostream>

using namespace std;

int globalna=69;

int main () {

char a=2;

for (short i=0;i<10;i++) {

short b=i;

if (b>a) {

cout<<„HaHa! Vekši sam”<<endl;

}

}

return 0;

}

adresa sadržaj stoga

9990 0010 1001

9991 0000 0000

9992 1011 1101

9993 1111 0001

9994 0000 0000

9995 0000 0000

9996 0000 0000

9997 0000 0001

9998 0000 0010

9999 0000 0000

999A 0000 0000

999B 0000 0000

999C 0100 0101

999D 0000 0000

999E 0000 0000

999F 0000 0011

99A0 1110 0111

9995

kgf (999)

globalna (69)

a (2)

i (1)

Automatsko alociranje

Page 11: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

#include <iostream>

using namespace std;

int globalna=69;

int main () {

char a=2;

for (short i=0;i<10;i++) {

short b=i;

if (b>a) {

cout<<„HaHa! Vekši sam”<<endl;

}

}

return 0;

}

adresa sadržaj stoga

9990 0010 1001

9991 0000 0000

9992 1011 1101

9993 1111 0001

9994 0000 0000

9995 0000 0001

9996 0000 0000

9997 0000 0001

9998 0000 0010

9999 0000 0000

999A 0000 0000

999B 0000 0000

999C 0100 0101

999D 0000 0000

999E 0000 0000

999F 0000 0011

99A0 1110 0111

9993

kgf (999)

globalna (69)

a (2)

i (1)

b (1)

Automatsko alociranje

Page 12: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

#include <iostream>

using namespace std;

int globalna=69;

int main () {

char a=2;

for (short i=0;i<10;i++) {

short b=i;

if (b>a) {

cout<<„HaHa! Vekši sam”<<endl;

}

}

return 0;

}

adresa sadržaj stoga

9990 0010 1001

9991 0000 0000

9992 1011 1101

9993 1111 0001

9994 0000 0000

9995 0000 0001

9996 0000 0000

9997 0000 0001

9998 0000 0010

9999 0000 0000

999A 0000 0000

999B 0000 0000

999C 0100 0101

999D 0000 0000

999E 0000 0000

999F 0000 0011

99A0 1110 0111

9995

kgf (999)

globalna (69)

a (2)

i (1)

I tak još 8 puta do kraja izvršavanja petlje..

Automatsko alociranje

Page 13: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

#include <iostream>

using namespace std;

int globalna=69;

int main () {

char a=2;

for (short i=0;i<10;i++) {

short b=i;

if (b>a) {

cout<<„HaHa! Vekši sam”<<endl;

}

}

return 0;

}

adresa sadržaj stoga

9990 0010 1001

9991 0000 0000

9992 1011 1101

9993 1111 0001

9994 0000 0000

9995 0000 1001

9996 0000 0000

9997 0000 1001

9998 0000 0010

9999 0000 0000

999A 0000 0000

999B 0000 0000

999C 0100 0101

999D 0000 0000

999E 0000 0000

999F 0000 0011

99A0 1110 0111

9995

kgf (999)

globalna (69)

a (2)

i (9)

Scena nakon tih preostalih 8 puta

Automatsko alociranje

Page 14: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

#include <iostream>

using namespace std;

int globalna=69;

int main () {

char a=2;

for (short i=0;i<10;i++) {

short b=i;

if (b>a) {

cout<<„HaHa! Vekši sam”<<endl;

}

}

return 0;

}

adresa sadržaj stoga

9990 0010 1001

9991 0000 0000

9992 1011 1101

9993 1111 0001

9994 0000 0000

9995 0000 1001

9996 0000 0000

9997 0000 1010

9998 0000 0010

9999 0000 0000

999A 0000 0000

999B 0000 0000

999C 0100 0101

999D 0000 0000

999E 0000 0000

999F 0000 0011

99A0 1110 0111

9995

kgf (999)

globalna (69)

a (2)

i (10)

Automatsko alociranje

Page 15: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

#include <iostream>

using namespace std;

int globalna=69;

int main () {

char a=2;

for (short i=0;i<10;i++) {

short b=i;

if (b>a) {

cout<<„HaHa! Vekši sam”<<endl;

}

}

return 0;

}

adresa sadržaj stoga

9990 0010 1001

9991 0000 0000

9992 1011 1101

9993 1111 0001

9994 0000 0000

9995 0000 1001

9996 0000 0000

9997 0000 1010

9998 0000 0010

9999 0000 0000

999A 0000 0000

999B 0000 0000

999C 0100 0101

999D 0000 0000

999E 0000 0000

999F 0000 0011

99A0 1110 0111

9997

kgf (999)

globalna (69)

a (2)

Automatsko alociranje

Page 16: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

#include <iostream>

using namespace std;

int globalna=69;

int main () {

char a=2;

for (short i=0;i<10;i++) {

short b=i;

if (b>a) {

cout<<„HaHa! Vekši sam”<<endl;

}

}

return 0;

}

adresa sadržaj stoga

9990 0010 1001

9991 0000 0000

9992 1011 1101

9993 1111 0001

9994 0000 0000

9995 0000 1001

9996 0000 0000

9997 0000 1010

9998 0000 0010

9999 0000 0000

999A 0000 0000

999B 0000 0000

999C 0100 0101

999D 0000 0000

999E 0000 0000

999F 0000 0011

99A0 1110 0111

9998

kgf (999)

globalna (69)

Automatsko alociranje

Page 17: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

adresa sadržaj stoga

9990 0010 1001

9991 0000 0000

9992 1011 1101

9993 1111 0001

9994 0000 0000

9995 0000 1001

9996 0000 0000

9997 0000 1010

9998 0000 0010

9999 0000 0000

999A 0000 0000

999B 0000 0000

999C 0100 0101

999D 0000 0000

999E 0000 0000

999F 0000 0011

99A0 1110 0111

99A0

Program gotov sa izvođenjem=

Vraćanje kazala stoga na vrijednost koju je imalo neposredno prije

izvođenja programa

Automatsko alociranje

Ishod za znatiželjne

Page 18: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

• Razlika u odnosu na automatsko alociranje:• Podaci se alociraju na memoriji sa naredbom new

• Podaci se smještaju na hrpu (ne na stog!)

• Podatak je moguće dealocirati u bilo kojem trenutku sa naredbom:• delete

• delete []

• Ako se podatak ne dealocira prije završetka programa, on ostaje dalje spremljen u radnoj memoriji (ne briše se izlaskom iz bloka naredbi unutar kojeg je alociran kao što je slučaj kod stoga) -> uzrokuje curenje memorije! (današnji operativni sustavi se ipak brinu za taj slučaj pa pri izlazu iz programa se brišu svi podaci sa radne memorije koji su nastali tijekom izvođenja programa)

Dinamičko alociranje

Page 19: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

00000000

10110000

11100000

10101000

11101011

00001000

01000000

01000010

10101010

11111111

11011001

11101101

10000111

11100011

11000000

10001001

11101011

00001000

01000000

01000010

10101010

10101000

11101011

10101000

00000000

00000000

00000000

00000000

01000010

10101010

10110000

11101011

00000000

00000000

00000000

00000000

00000000

00000000

00000000

01000010

01011010

10110000

11100000

10101000

11101011

11101011

00001000

00000000

00000000

01000000

01000000

00001000

01000000

11100000

10110000

11100000

10101000

11101011

00001000

01000000

11100000

10101000

00000000

11101011

11100000

10101000

10101000

10101000

11101011

00001000

01000000

01000010

10101010

10110000

11100000

10101000

11101011

01000010

11100000

10110000

00001000

00000000

00000000

01000010

00000000

10110000

01000000

10101000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

10110000

11100000

10101000

11101011

11101011

00001000

10101000

01000010

11100000

10110000

11100000

10101000

11101011

00000000

10110000

10110000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

00001000

01000000

01000010

10101010

11101011

00001000

10110000

100_

101_

102_

103_

104_

105_

106_

107_

0 1 2 3 4 5 6 7 8 9 A B C D E F

Prv

e 3

hex

zn

amen

ke s

traž

nje

g d

ijela

32

-bit

ne

adre

se

Zadnja hex znamenka 32-bitne adrese

################

Podatak veličine 1 bajta sa kontrolnim blokom:

0 (korišten)

1 (slobodan (smeće))

0 0 0 0 1 0 Y X

Y\X

Prednji dio adrese | Stražnji dio adrese

Page 20: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

00000000

10110000

11100000

10101000

11101011

00001000

01000000

01000010

10101010

11111111

11011001

11101101

10000111

11100011

11000000

10001001

11101011

00001000

01000000

01000010

10101010

10101000

11101011

10101000

00000000

00000000

00000000

00000000

01000010

10101010

10110000

11101011

00000000

00000000

00000000

00000000

00000000

00000000

00000000

01000010

01011010

10110000

11100000

10101000

11101011

11101011

00001000

00000000

00000000

01000000

01000000

00001000

01000000

11100000

10110000

11100000

10101000

11101011

00001000

01000000

11100000

10101000

00000000

11101011

11100000

10101000

10101000

10101000

11101011

00001000

01000000

01000010

10101010

10110000

11100000

10101000

11101011

01000010

11100000

10110000

00001000

00000000

00000000

01000010

00000000

10110000

01000000

10101000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

10110000

11100000

10101000

11101011

11101011

00001000

10101000

01000010

11100000

10110000

11100000

10101000

11101011

00000000

10110000

10110000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

00001000

01000000

01000010

10101010

11101011

00001000

10110000

100_

101_

102_

103_

104_

105_

106_

107_

0 1 2 3 4 5 6 7 8 9 A B C D E F

Dinamičko alociranje

Page 21: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

00000000

10110000

11100000

10101000

11101011

00001000

01000000

01000010

10101010

11111111

11011001

11101101

10000111

11100011

11000000

10001001

11101011

00001000

01000000

01000010

10101010

10101000

11101011

10101000

00000000

00000000

00000000

00000000

01000010

10101010

10110000

11101011

00000000

00000000

00000000

00000000

00000000

00000000

00000000

01000010

01011010

10110000

11100000

10101000

11101011

11101011

00001000

00000000

00000000

01000000

01000000

00001000

01000000

11100000

10110000

11100000

10101000

11101011

00001000

01000000

11100000

10101000

00000000

11101011

11100000

10101000

10101000

10101000

11101011

00001000

01000000

01000010

10101010

10110000

11100000

10101000

11101011

01000010

11100000

10110000

00001000

00000000

00000000

01000010

00000000

10110000

01000000

10101000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

10110000

11100000

10101000

11101011

11101011

00001000

10101000

01000010

11100000

10110000

11100000

10101000

11101011

00000000

10110000

10110000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

00001000

01000000

01000010

10101010

11101011

00001000

10110000

100_

101_

102_

103_

104_

105_

106_

107_

0 1 2 3 4 5 6 7 8 9 A B C D E F

Naredba: new int;

Dinamičko alociranje OS mora rezervirati 4 uzastopnih

slobodnih ćelija

Page 22: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

00000000

10110000

11100000

10101000

11101011

00001000

01000000

01000010

10101010

11111111

11011001

11101101

10000111

11100011

11000000

10001001

11101011

00001000

01000000

01000010

10101010

10101000

11101011

10101000

00000000

00000000

00000000

00000000

01000010

10101010

10110000

11101011

00000000

00000000

00000000

00000000

00000000

00000000

00000000

01000010

01011010

10110000

11100000

10101000

11101011

11101011

00001000

00000000

00000000

01000000

01000000

00001000

01000000

11100000

10110000

11100000

10101000

11101011

00001000

01000000

11100000

10101000

00000000

11101011

11100000

10101000

10101000

10101000

11101011

00001000

01000000

01000010

10101010

10110000

11100000

10101000

11101011

01000010

11100000

10110000

00001000

00000000

00000000

01000010

00000000

10110000

01000000

10101000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

10110000

11100000

10101000

11101011

11101011

00001000

10101000

01000010

11100000

10110000

11100000

10101000

11101011

00000000

10110000

10110000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

00001000

01000000

01000010

10101010

11101011

00001000

10110000

100_

101_

102_

103_

104_

105_

106_

107_

0 1 2 3 4 5 6 7 8 9 A B C D E F

Dinamičko alociranje

Page 23: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

00000000

10110000

11100000

10101000

11101011

00001000

01000000

01000010

10101010

11111111

11011001

11101101

00000000

00000000

00000000

00001101

11101011

00001000

01000000

01000010

10101010

10101000

11101011

10101000

00000000

00000000

00000000

00000000

01000010

10101010

10110000

11101011

00000000

00000000

00000000

00000000

00000000

00000000

00000000

01000010

01011010

10110000

11100000

10101000

11101011

11101011

00001000

00000000

00000000

01000000

01000000

00001000

01000000

11100000

10110000

11100000

10101000

11101011

00001000

01000000

11100000

10101000

00000000

11101011

11100000

10101000

10101000

10101000

11101011

00001000

01000000

01000010

10101010

10110000

11100000

10101000

11101011

01000010

11100000

10110000

00001000

00000000

00000000

01000010

00000000

10110000

01000000

10101000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

10110000

11100000

10101000

11101011

11101011

00001000

10101000

01000010

11100000

10110000

11100000

10101000

11101011

00000000

10110000

10110000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

00001000

01000000

01000010

10101010

11101011

00001000

10110000

100_

101_

102_

103_

104_

105_

106_

107_

0 1 2 3 4 5 6 7 8 9 A B C D E F

Naredba: new int (13);Dinamičko alociranje OS mora rezervirati 4

uzastopnih slobodnih ćelija i na to mjesto se zapisuje

vrijednost 13

Page 24: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

00000000

10110000

11100000

10101000

11101011

00001000

01000000

01000010

10101010

11111111

11011001

11101101

10000111

11100011

11000000

10001001

11101011

00001000

01000000

01000010

10101010

10101000

11101011

10101000

00000000

00000000

00000000

00000000

01000010

10101010

10110000

11101011

00000000

00000000

00000000

00000000

00000000

00000000

00000000

01000010

01011010

10110000

11100000

10101000

11101011

11101011

00001000

00000000

00000000

01000000

01000000

00001000

01000000

11100000

10110000

11100000

10101000

11101011

00001000

01000000

11100000

10101000

00000000

11101011

11100000

10101000

10101000

10101000

11101011

00001000

01000000

01000010

10101010

10110000

11100000

10101000

11101011

01000010

11100000

10110000

00001000

00000000

00000000

01000010

00000000

10110000

01000000

10101000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

10110000

11100000

10101000

11101011

11101011

00001000

10101000

01000010

11100000

10110000

11100000

10101000

11101011

00000000

10110000

10110000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

00001000

01000000

01000010

10101010

11101011

00001000

10110000

100_

101_

102_

103_

104_

105_

106_

107_

0 1 2 3 4 5 6 7 8 9 A B C D E F

Dinamičko alociranje

Page 25: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

00000000

10110000

11100000

10101000

11101011

00001000

01000000

01000010

10101010

11111111

11011001

11101101

10000111

11100011

11000000

10001001

11101011

00001000

01000000

01000010

10101010

10101000

11101011

10101000

00000000

00000000

00000000

00000000

01000010

10101010

10110000

11101011

00000000

00000000

00000000

00000000

00000000

00000000

00000000

01000010

01011010

10110000

11100000

10101000

11101011

11101011

00001000

00000000

00000000

01000000

01000000

00001000

01000000

11100000

10110000

11100000

10101000

11101011

00001000

01000000

11100000

10101000

00000000

11101011

11100000

10101000

10101000

10101000

11101011

00001000

01000000

01000010

10101010

10110000

11100000

10101000

11101011

01000010

11100000

10110000

00001000

00000000

00000000

01000010

00000000

10110000

01000000

10101000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

10110000

11100000

10101000

11101011

11101011

00001000

10101000

01000010

11100000

10110000

11100000

10101000

11101011

00000000

10110000

10110000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

00001000

01000000

01000010

10101010

11101011

00001000

10110000

100_

101_

102_

103_

104_

105_

106_

107_

0 1 2 3 4 5 6 7 8 9 A B C D E F

Naredba: new int [5];Dinamičko alociranje OS mora rezervirati

5*4=20 uzastopnih slobodnih ćelija

Page 26: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

Kombiniranje 2 prethodna tipa

• Kako bi se jednom alociranim objektima moglo kasnije pristupati, potrebno je njihovu adresu pohraniti -> za to se koriste posebne varijable zvane pokazivači

• Vrijednost pokazivača (adresa alociranog objekta sa hrpe) se pohranjuje na stog, a tom objektu se pristupa pomoću operatora dereferencijacije (*)

• Pokazivač može sadržavati i adresu neke varijable, a njena adresa se dohvaća pomoću operatora adrese (&)

• Svi pokazivači (char*,int*,double*) su veličine 4 bajta, odnosno 8 bajta (ovisno o širini adresne sabirnice računala na kojem se izvodi program!)

Page 27: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

Kombiniranje 2 prethodna tipa

...

int main () {

int* pok;

int* ptr=new int;

pok=new int[3];

delete ptr;

ptr=pok;

int var=3;

pok=&var;

*pok=5;

ptr[0]=4;

*(ptr+1)=13;

return 0;

}

99A0

adresa sadržaj stoga

9990 0010 1001

9991 0000 0000

9992 1011 1101

9993 1111 0001

9994 0000 0000

9995 0110 1011

9996 0000 0000

9997 0000 0000

9998 0000 0000

9999 1010 0111

999A 1010 0101

999B 1110 1110

999C 0000 0010

999D 1000 0000

999E 1100 1100

999F 0100 1111

99A0 1111 1111

Page 28: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

999C

pok (80AA4FFF)

adresa sadržaj stoga

9990 0010 1001

9991 0000 0000

9992 1011 1101

9993 1111 0001

9994 0000 0000

9995 0110 1011

9996 0000 0000

9997 0000 0000

9998 0000 0000

9999 1010 0111

999A 1010 0101

999B 1110 1110

999C 0000 0010

999D 1000 0000

999E 1100 1100

999F 0100 1111

99A0 1111 1111

...

int main () {

int* pok;

int* ptr=new int;

pok=new int[3];

delete ptr;

ptr=pok;

int var=3;

pok=&var;

*pok=5;

ptr[0]=4;

*(ptr+1)=13;

return 0;

}

vrijednost pokazivača nije inicijalizirana, pa je jednaka prethodnom sadržaju memorije

Kombiniranje 2 prethodna tipa

Page 29: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

00000000

10110000

11100000

10101000

11101011

00001000

01000000

01000010

10101010

11111111

11011001

11101101

10000111

11100011

11000000

10001001

11101011

00001000

01000000

01000010

10101010

10101000

11101011

10101000

00000000

00000000

00000000

00000000

01000010

10101010

10110000

11101011

00000000

00000000

00000000

00000000

00000000

00000000

00000000

01000010

01011010

10110000

11100000

10101000

11101011

11101011

00001000

00000000

00000000

01000000

01000000

00001000

01000000

11100000

10110000

11100000

10101000

11101011

00001000

01000000

11100000

10101000

00000000

11101011

11100000

10101000

10101000

10101000

11101011

00001000

01000000

01000010

10101010

10110000

11100000

10101000

11101011

01000010

11100000

10110000

00001000

00000000

00000000

01000010

00000000

10110000

01000000

10101000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

10110000

11100000

10101000

11101011

11101011

00001000

10101000

01000010

11100000

10110000

11100000

10101000

11101011

00000000

10110000

10110000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

00001000

01000000

01000010

10101010

11101011

00001000

10110000

100_

101_

102_

103_

104_

105_

106_

107_

0 1 2 3 4 5 6 7 8 9 A B C D E F

Kombiniranje 2 prethodna tipa ...int* ptr=new int;...

Page 30: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

00000000

10110000

11100000

10101000

11101011

00001000

01000000

01000010

10101010

11111111

11011001

11101101

10000111

11100011

11000000

10001001

11101011

00001000

01000000

01000010

10101010

10101000

11101011

10101000

00000000

00000000

00000000

00000000

01000010

10101010

10110000

11101011

00000000

00000000

00000000

00000000

00000000

00000000

00000000

01000010

01011010

10110000

11100000

10101000

11101011

11101011

00001000

00000000

00000000

01000000

01000000

00001000

01000000

11100000

10110000

11100000

10101000

11101011

00001000

01000000

11100000

10101000

00000000

11101011

11100000

10101000

10101000

10101000

11101011

00001000

01000000

01000010

10101010

10110000

11100000

10101000

11101011

01000010

11100000

10110000

00001000

00000000

00000000

01000010

00000000

10110000

01000000

10101000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

10110000

11100000

10101000

11101011

11101011

00001000

10101000

01000010

11100000

10110000

11100000

10101000

11101011

00000000

10110000

10110000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

00001000

01000000

01000010

10101010

11101011

00001000

10110000

100_

101_

102_

103_

104_

105_

106_

107_

0 1 2 3 4 5 6 7 8 9 A B C D E F

Kombiniranje 2 prethodna tipa ...int* ptr=new int;...

Adresa početka alociranog dijela memorije (0000100C)

Page 31: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

9998

pok (80AA4FFF16)

adresa sadržaj stoga

9990 0010 1001

9991 0000 0000

9992 1011 1101

9993 1111 0001

9994 0000 0000

9995 0110 1011

9996 0000 0000

9997 0000 0000

9998 0000 0000

9999 0000 0000

999A 0000 0000

999B 0001 0000

999C 0000 1100

999D 1000 0000

999E 1100 1100

999F 0100 1111

99A0 1111 1111

...

int main () {

int* pok;

int* ptr=new int;

pok=new int[3];

delete ptr;

ptr=pok;

int var=3;

pok=&var;

*pok=5;

ptr[0]=4;

*(ptr+1)=13;

return 0;

}

Kombiniranje 2 prethodna tipa

ptr (0000100C16)

Pridruživanje pribavljene adrese varijabli (pokazivaču)

Page 32: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

...pok=new int[3];...

00000000

10110000

11100000

10101000

11101011

00001000

01000000

01000010

10101010

11111111

11011001

11101101

10000111

11100011

11000000

10001001

11101011

00001000

01000000

01000010

10101010

10101000

11101011

10101000

00000000

00000000

00000000

00000000

01000010

10101010

10110000

11101011

00000000

00000000

00000000

00000000

00000000

00000000

00000000

01000010

01011010

10110000

11100000

10101000

11101011

11101011

00001000

00000000

00000000

01000000

01000000

00001000

01000000

11100000

10110000

11100000

10101000

11101011

00001000

01000000

11100000

10101000

00000000

11101011

11100000

10101000

10101000

10101000

11101011

00001000

01000000

01000010

10101010

10110000

11100000

10101000

11101011

01000010

11100000

10110000

00001000

00000000

00000000

01000010

00000000

10110000

01000000

10101000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

10110000

11100000

10101000

11101011

11101011

00001000

10101000

01000010

11100000

10110000

11100000

10101000

11101011

00000000

10110000

10110000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

00001000

01000000

01000010

10101010

11101011

00001000

10110000

100_

101_

102_

103_

104_

105_

106_

107_

0 1 2 3 4 5 6 7 8 9 A B C D E F

Kombiniranje 2 prethodna tipa

Page 33: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

...pok=new int[3];...

00000000

10110000

11100000

10101000

11101011

00001000

01000000

01000010

10101010

11111111

11011001

11101101

10000111

11100011

11000000

10001001

11101011

00001000

01000000

01000010

10101010

10101000

11101011

10101000

00000000

00000000

00000000

00000000

01000010

10101010

10110000

11101011

00000000

00000000

00000000

00000000

00000000

00000000

00000000

01000010

01011010

10110000

11100000

10101000

11101011

11101011

00001000

00000000

00000000

01000000

01000000

00001000

01000000

11100000

10110000

11100000

10101000

11101011

00001000

01000000

11100000

10101000

00000000

11101011

11100000

10101000

10101000

10101000

11101011

00001000

01000000

01000010

10101010

10110000

11100000

10101000

11101011

01000010

11100000

10110000

00001000

00000000

00000000

01000010

00000000

10110000

01000000

10101000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

10110000

11100000

10101000

11101011

11101011

00001000

10101000

01000010

11100000

10110000

11100000

10101000

11101011

00000000

10110000

10110000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

00001000

01000000

01000010

10101010

11101011

00001000

10110000

100_

101_

102_

103_

104_

105_

106_

107_

0 1 2 3 4 5 6 7 8 9 A B C D E F

Kombiniranje 2 prethodna tipa

Adresa početka alociranog dijela memorije (00001010)

Page 34: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

9998

pok (0000101016)

adresa sadržaj stoga

9990 0010 1001

9991 0000 0000

9992 1011 1101

9993 1111 0001

9994 0000 0000

9995 0110 1011

9996 0000 0000

9997 0000 0000

9998 0000 0000

9999 0000 0000

999A 0000 0000

999B 0001 0000

999C 0000 1100

999D 0000 0000

999E 0000 0000

999F 0001 0000

99A0 0001 0000

...

int main () {

int* pok;

int* ptr=new int;

pok=new int[3];

delete ptr;

ptr=pok;

int var=3;

pok=&var;

*pok=5;

ptr[0]=4;

*(ptr+1)=13;

return 0;

}

Kombiniranje 2 prethodna tipa

ptr (0000100C16)

Pridruživanje pribavljene adrese varijabli (pokazivaču)

Page 35: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

...delete ptr;...

00000000

10110000

11100000

10101000

11101011

00001000

01000000

01000010

10101010

11111111

11011001

11101101

10000111

11100011

11000000

10001001

11101011

00001000

01000000

01000010

10101010

10101000

11101011

10101000

00000000

00000000

00000000

00000000

01000010

10101010

10110000

11101011

00000000

00000000

00000000

00000000

00000000

00000000

00000000

01000010

01011010

10110000

11100000

10101000

11101011

11101011

00001000

00000000

00000000

01000000

01000000

00001000

01000000

11100000

10110000

11100000

10101000

11101011

00001000

01000000

11100000

10101000

00000000

11101011

11100000

10101000

10101000

10101000

11101011

00001000

01000000

01000010

10101010

10110000

11100000

10101000

11101011

01000010

11100000

10110000

00001000

00000000

00000000

01000010

00000000

10110000

01000000

10101000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

10110000

11100000

10101000

11101011

11101011

00001000

10101000

01000010

11100000

10110000

11100000

10101000

11101011

00000000

10110000

10110000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

00001000

01000000

01000010

10101010

11101011

00001000

10110000

100_

101_

102_

103_

104_

105_

106_

107_

0 1 2 3 4 5 6 7 8 9 A B C D E F

Kombiniranje 2 prethodna tipa9999 0000 0000

999A 0000 0000

999B 0001 0000

999C 0000 1100

*ptr (0000100C16) na objekt tipa int=> 4 bloka

Page 36: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

...delete ptr;...

00000000

10110000

11100000

10101000

11101011

00001000

01000000

01000010

10101010

11111111

11011001

11101101

10000111

11100011

11000000

10001001

11101011

00001000

01000000

01000010

10101010

10101000

11101011

10101000

00000000

00000000

00000000

00000000

01000010

10101010

10110000

11101011

00000000

00000000

00000000

00000000

00000000

00000000

00000000

01000010

01011010

10110000

11100000

10101000

11101011

11101011

00001000

00000000

00000000

01000000

01000000

00001000

01000000

11100000

10110000

11100000

10101000

11101011

00001000

01000000

11100000

10101000

00000000

11101011

11100000

10101000

10101000

10101000

11101011

00001000

01000000

01000010

10101010

10110000

11100000

10101000

11101011

01000010

11100000

10110000

00001000

00000000

00000000

01000010

00000000

10110000

01000000

10101000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

10110000

11100000

10101000

11101011

11101011

00001000

10101000

01000010

11100000

10110000

11100000

10101000

11101011

00000000

10110000

10110000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

00001000

01000000

01000010

10101010

11101011

00001000

10110000

100_

101_

102_

103_

104_

105_

106_

107_

0 1 2 3 4 5 6 7 8 9 A B C D E F

Kombiniranje 2 prethodna tipa9999 0000 0000

999A 0000 0000

999B 0001 0000

999C 0000 1100

*ptr (0000100C16) na objekt tipa int=> 4 bloka

Naredba delete ne briše vrijednost pokazivača, niti sadržaj memorijske lokacije, već samo postavlja stanje (zastavicu) kontrolnog bloka na 1 (omogućena ponovna alokacija)

Page 37: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

9998

pok (0000101016)

adresa sadržaj stoga

9990 0010 1001

9991 0000 0000

9992 1011 1101

9993 1111 0001

9994 0000 0000

9995 0110 1011

9996 0000 0000

9997 0000 0000

9998 0000 0000

9999 0000 0000

999A 0000 0000

999B 0001 0000

999C 0001 0000

999D 0000 0000

999E 0000 0000

999F 0001 0000

99A0 0001 0000

...

int main () {

int* pok;

int* ptr=new int;

pok=new int[3];

delete ptr;

ptr=pok;

int var=3;

pok=&var;

*pok=5;

ptr[0]=4;

*(ptr+1)=13;

return 0;

}

Kombiniranje 2 prethodna tipa

ptr (0000101016)

Pridruživanje vrijednosti pokazivača pok pokazivaču ptr (oni time međusobno ne postaju povezani)

Page 38: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

9994

pok (0000101016)

adresa sadržaj stoga

9990 0010 1001

9991 0000 0000

9992 1011 1101

9993 1111 0001

9994 0000 0000

9995 0000 0000

9996 0000 0000

9997 0000 0000

9998 0000 0011

9999 0000 0000

999A 0000 0000

999B 0001 0000

999C 0001 0000

999D 0000 0000

999E 0000 0000

999F 0001 0000

99A0 0001 0000

...

int main () {

int* pok;

int* ptr=new int;

pok=new int[3];

delete ptr;

ptr=pok;

int var=3;

pok=&var;

*pok=5;

ptr[0]=4;

*(ptr+1)=13;

return 0;

}

Kombiniranje 2 prethodna tipa

ptr (0000101016)

var (3)

Page 39: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

9994

pok (0000101016)

adresa sadržaj stoga

9990 0010 1001

9991 0000 0000

9992 1011 1101

9993 1111 0001

9994 0000 0000

9995 0000 0000

9996 0000 0000

9997 0000 0000

9998 0000 0011

9999 0000 0000

999A 0000 0000

999B 0001 0000

999C 0001 0000

999D 0000 0000

999E 0000 0000

999F 0001 0000

99A0 0001 0000

...

int main () {

int* pok;

int* ptr=new int;

pok=new int[3];

delete ptr;

ptr=pok;

int var=3;

pok=&var;

*pok=5;

ptr[0]=4;

*(ptr+1)=13;

return 0;

}

Kombiniranje 2 prethodna tipa

ptr (0000101016)

var (3)

Dohvaćanje adrese varijable

Page 40: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

9994

pok (0000999516)

adresa sadržaj stoga

9990 0010 1001

9991 0000 0000

9992 1011 1101

9993 1111 0001

9994 0000 0000

9995 0000 0000

9996 0000 0000

9997 0000 0000

9998 0000 0011

9999 0000 0000

999A 0000 0000

999B 0001 0000

999C 0001 0000

999D 0000 0000

999E 0000 0000

999F 0001 0000

99A0 0001 0000

...

int main () {

int* pok;

int* ptr=new int;

pok=new int[3];

delete ptr;

ptr=pok;

int var=3;

pok=&var;

*pok=5;

ptr[0]=4;

*(ptr+1)=13;

return 0;

}

Kombiniranje 2 prethodna tipa

ptr (0000101016)

var (3)

Pridruživanje adrese varijable pokazivaču

Page 41: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

9994

pok (0000999516)

adresa sadržaj stoga

9990 0010 1001

9991 0000 0000

9992 1011 1101

9993 1111 0001

9994 0000 0000

9995 0000 0000

9996 0000 0000

9997 0000 0000

9998 0000 0011

9999 0000 0000

999A 0000 0000

999B 0001 0000

999C 0001 0000

999D 0000 0000

999E 0000 0000

999F 0001 0000

99A0 0001 0000

...

int main () {

int* pok;

int* ptr=new int;

pok=new int[3];

delete ptr;

ptr=pok;

int var=3;

pok=&var;

*pok=5;

ptr[0]=4;

*(ptr+1)=13;

return 0;

}

Kombiniranje 2 prethodna tipa

ptr (0000101016)

var (3)

Page 42: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

9994

pok (0000999516)

adresa sadržaj stoga

9990 0010 1001

9991 0000 0000

9992 1011 1101

9993 1111 0001

9994 0000 0000

9995 0000 0000

9996 0000 0000

9997 0000 0000

9998 0000 0101

9999 0000 0000

999A 0000 0000

999B 0001 0000

999C 0001 0000

999D 0000 0000

999E 0000 0000

999F 0001 0000

99A0 0001 0000

...

int main () {

int* pok;

int* ptr=new int;

pok=new int[3];

delete ptr;

ptr=pok;

int var=3;

pok=&var;

*pok=5;

ptr[0]=4;

*(ptr+1)=13;

return 0;

}

Kombiniranje 2 prethodna tipa

ptr (0000101016)

var (5)

Page 43: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

00000000

10110000

11100000

10101000

11101011

00001000

01000000

01000010

10101010

11111111

11011001

11101101

10000111

11100011

11000000

10001001

11101011

00001000

01000000

01000010

10101010

10101000

11101011

10101000

00000000

00000000

00000000

00000000

01000010

10101010

10110000

11101011

00000000

00000000

00000000

00000000

00000000

00000000

00000000

01000010

01011010

10110000

11100000

10101000

11101011

11101011

00001000

00000000

00000000

01000000

01000000

00001000

01000000

11100000

10110000

11100000

10101000

11101011

00001000

01000000

11100000

10101000

00000000

11101011

11100000

10101000

10101000

10101000

11101011

00001000

01000000

01000010

10101010

10110000

11100000

10101000

11101011

01000010

11100000

10110000

00001000

00000000

00000000

01000010

00000000

10110000

01000000

10101000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

10110000

11100000

10101000

11101011

11101011

00001000

10101000

01000010

11100000

10110000

11100000

10101000

11101011

00000000

10110000

10110000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

00001000

01000000

01000010

10101010

11101011

00001000

10110000

100_

101_

102_

103_

104_

105_

106_

107_

0 1 2 3 4 5 6 7 8 9 A B C D E F

Kombiniranje 2 prethodna tipa9999 0000 0000

999A 0000 0000

999B 0001 0000

999C 0001 0000

*ptr (0000101016+0) na objekt tipa int=> 4 bloka

...ptr[0]=4;...

Page 44: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

00000000

10110000

11100000

10101000

11101011

00001000

01000000

01000010

10101010

11111111

11011001

11101101

10000111

11100011

11000000

10001001

00000000

00000000

00000000

00000100

10101010

10101000

11101011

10101000

00000000

00000000

00000000

00000000

01000010

10101010

10110000

11101011

00000000

00000000

00000000

00000000

00000000

00000000

00000000

01000010

01011010

10110000

11100000

10101000

11101011

11101011

00001000

00000000

00000000

01000000

01000000

00001000

01000000

11100000

10110000

11100000

10101000

11101011

00001000

01000000

11100000

10101000

00000000

11101011

11100000

10101000

10101000

10101000

11101011

00001000

01000000

01000010

10101010

10110000

11100000

10101000

11101011

01000010

11100000

10110000

00001000

00000000

00000000

01000010

00000000

10110000

01000000

10101000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

10110000

11100000

10101000

11101011

11101011

00001000

10101000

01000010

11100000

10110000

11100000

10101000

11101011

00000000

10110000

10110000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

00001000

01000000

01000010

10101010

11101011

00001000

10110000

100_

101_

102_

103_

104_

105_

106_

107_

0 1 2 3 4 5 6 7 8 9 A B C D E F

Kombiniranje 2 prethodna tipa9999 0000 0000

999A 0000 0000

999B 0001 0000

999C 0001 0000

*ptr (0000101016+0) na objekt tipa int=> 4 bloka

...ptr[0]=4;...

Page 45: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

00000000

10110000

11100000

10101000

11101011

00001000

01000000

01000010

10101010

11111111

11011001

11101101

10000111

11100011

11000000

10001001

11101011

00001000

01000000

01000010

10101010

10101000

11101011

10101000

00000000

00000000

00000000

00000000

01000010

10101010

10110000

11101011

00000000

00000000

00000000

00000000

00000000

00000000

00000000

01000010

01011010

10110000

11100000

10101000

11101011

11101011

00001000

00000000

00000000

01000000

01000000

00001000

01000000

11100000

10110000

11100000

10101000

11101011

00001000

01000000

11100000

10101000

00000000

11101011

11100000

10101000

10101000

10101000

11101011

00001000

01000000

01000010

10101010

10110000

11100000

10101000

11101011

01000010

11100000

10110000

00001000

00000000

00000000

01000010

00000000

10110000

01000000

10101000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

10110000

11100000

10101000

11101011

11101011

00001000

10101000

01000010

11100000

10110000

11100000

10101000

11101011

00000000

10110000

10110000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

00001000

01000000

01000010

10101010

11101011

00001000

10110000

100_

101_

102_

103_

104_

105_

106_

107_

0 1 2 3 4 5 6 7 8 9 A B C D E F

Kombiniranje 2 prethodna tipa9999 0000 0000

999A 0000 0000

999B 0001 0000

999C 0001 0000

*ptr (0000101016+”1”) na objekt tipa int=> 4 bloka

...*(ptr+1)=13;//isto ko i ptr[1]=13;...

Page 46: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

00000000

10110000

11100000

10101000

11101011

00001000

01000000

01000010

10101010

11111111

11011001

11101101

10000111

11100011

11000000

10001001

11101011

00001000

01000000

01000010

00000000

00000000

00000000

00001101

00000000

00000000

00000000

00000000

01000010

10101010

10110000

11101011

00000000

00000000

00000000

00000000

00000000

00000000

00000000

01000010

01011010

10110000

11100000

10101000

11101011

11101011

00001000

00000000

00000000

01000000

01000000

00001000

01000000

11100000

10110000

11100000

10101000

11101011

00001000

01000000

11100000

10101000

00000000

11101011

11100000

10101000

10101000

10101000

11101011

00001000

01000000

01000010

10101010

10110000

11100000

10101000

11101011

01000010

11100000

10110000

00001000

00000000

00000000

01000010

00000000

10110000

01000000

10101000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

10110000

11100000

10101000

11101011

11101011

00001000

10101000

01000010

11100000

10110000

11100000

10101000

11101011

00000000

10110000

10110000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

00001000

01000000

01000010

10101010

11101011

00001000

10110000

100_

101_

102_

103_

104_

105_

106_

107_

0 1 2 3 4 5 6 7 8 9 A B C D E F

Kombiniranje 2 prethodna tipa9999 0000 0000

999A 0000 0000

999B 0001 0000

999C 0001 0000

*ptr (0000101016+”1”) na objekt tipa int=> 4 bloka

...*(ptr+1)=13;...

Page 47: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

99A0

adresa sadržaj stoga

9990 0010 1001

9991 0000 0000

9992 1011 1101

9993 1111 0001

9994 0000 0000

9995 0000 0000

9996 0000 0000

9997 0000 0000

9998 0000 0101

9999 0000 0000

999A 0000 0000

999B 0001 0000

999C 0001 0000

999D 0000 0000

999E 0000 0000

999F 0001 0000

99A0 0001 0000

...

int main () {

int* pok;

int* ptr=new int;

pok=new int[3];

delete ptr;

ptr=pok;

int var=3;

pok=&var;

*pok=5;

ptr[0]=4;

*(ptr+1)=13;

return 0;

}

Kombiniranje 2 prethodna tipa

STOG JE PRAZAN!

Page 48: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

00000000

10110000

11100000

10101000

11101011

00001000

01000000

01000010

10101010

11111111

11011001

11101101

10000111

11100011

11000000

10001001

11101011

00001000

01000000

01000010

00000000

00000000

00000000

00001101

00000000

00000000

00000000

00000000

01000010

10101010

10110000

11101011

00000000

00000000

00000000

00000000

00000000

00000000

00000000

01000010

01011010

10110000

11100000

10101000

11101011

11101011

00001000

00000000

00000000

01000000

01000000

00001000

01000000

11100000

10110000

11100000

10101000

11101011

00001000

01000000

11100000

10101000

00000000

11101011

11100000

10101000

10101000

10101000

11101011

00001000

01000000

01000010

10101010

10110000

11100000

10101000

11101011

01000010

11100000

10110000

00001000

00000000

00000000

01000010

00000000

10110000

01000000

10101000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

10110000

11100000

10101000

11101011

11101011

00001000

10101000

01000010

11100000

10110000

11100000

10101000

11101011

00000000

10110000

10110000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

00001000

01000000

01000010

10101010

11101011

00001000

10110000

100_

101_

102_

103_

104_

105_

106_

107_

0 1 2 3 4 5 6 7 8 9 A B C D E F

Kombiniranje 2 prethodna tipa Označeni dio memorije nepotrebno zauzima memoriju nakon izvođenja programa!

Page 49: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

...

int main () {

int* pok;

int* ptr=new int;

pok=new int[3];

delete ptr;

ptr=pok;

int var=3;

pok=&var;

*pok=5;

ptr[0]=4;

*(ptr+1)=13;

delete [] ptr;

ptr=NULL;

return 0;

}

Kombiniranje 2 prethodna tipa

Postavljanje zastavice kontrolnog bloka u memoriji na 1 (oslobađanje dijela memorije)

Dobra praksa: postavljanje pokazivača na posebnu vrijednost NULL kako se dalje slučajno ne bi pristupalo memorijskoj lokaciji koja više nije označena kao korištena (al ovdje je krȁj programa pa niti nema straha da bi se njome krivo rukovalo)

Page 50: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

Vezana lista

• Apstraktna struktura podataka karakteristična zbog:• Sekvencijalnog pristupa podacima

• Veća fleksibilnost pri smještaju elemenata u memoriji

• Mogućnost naknadnog povećanja/smanjenja veličine liste

• Sastoji se od glave (koja ima ulogu lokomotive i u koju se ne smještaju putnici) i elemenata unutar tijela (vagoni unutar kojih je moguće smjestiti putnike i priključiti ih na trenutni dio vlaka)

• Ophođenje vezane liste (pristupanje elementima ili vagonima) se vrši analogno kondukterovoj provjeri karata (kreće od lokomotive do zadnjeg vagona – nema teleportiranja)

Page 51: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

Problem:

• Smjestiti 9 elemenata tipa int na gore navedeni dio memorije

Page 52: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

Korištenjem dinamičkog polja

00000000

10110000

11100000

10101000

11101011

00001000

01000000

01000010

10101010

11111111

11011001

11101101

10000111

11100011

11000000

10001001

11101011

00001000

01000000

01000010

00000000

00000000

00000000

00001101

00000000

00000000

00000000

00000000

01000010

10101010

10110000

11101011

00000000

00000000

00000000

00000000

00000000

00000000

00000000

01000010

01011010

10110000

11100000

10101000

11101011

11101011

00001000

00000000

00000000

01000000

01000000

00001000

01000000

11100000

10110000

11100000

10101000

11101011

00001000

01000000

11100000

10101000

00000000

11101011

11100000

10101000

10101000

10101000

11101011

00001000

01000000

01000010

10101010

10110000

11100000

10101000

11101011

01000010

11100000

10110000

00001000

00000000

00000000

01000010

00000000

10110000

01000000

10101000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

10110000

11100000

10101000

11101011

11101011

00001000

10101000

01000010

11100000

10110000

11100000

10101000

11101011

00000000

10110000

10110000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

00001000

01000000

01000010

10101010

11101011

00001000

10110000

100_

101_

102_

103_

104_

105_

106_

107_

0 1 2 3 4 5 6 7 8 9 A B C D E F

Dinamičko polje: int *polje[9];

U taj dio memorije je maksimalno

moguće smjestiti polje od 5 elemenata

Page 53: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

00000000

10110000

11100000

10101000

11101011

00001000

01000000

01000010

10101010

11111111

11011001

11101101

10000111

11100011

11000000

10001001

11101011

00001000

01000000

01000010

00000000

00000000

00000000

00001101

00000000

00000000

00000000

00000000

01000010

10101010

10110000

11101011

00000000

00000000

00000000

00000000

00000000

00000000

00000000

01000010

01011010

10110000

11100000

10101000

11101011

11101011

00001000

00000000

00000000

01000000

01000000

00001000

01000000

11100000

10110000

11100000

10101000

11101011

00001000

01000000

11100000

10101000

00000000

11101011

11100000

10101000

10101000

10101000

11101011

00001000

01000000

01000010

10101010

10110000

11100000

10101000

11101011

01000010

11100000

10110000

00001000

00000000

00000000

01000010

00000000

10110000

01000000

10101000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

10110000

11100000

10101000

11101011

11101011

00001000

10101000

01000010

11100000

10110000

11100000

10101000

11101011

00000000

10110000

10110000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

00001000

01000000

01000010

10101010

11101011

00001000

10110000

100_

101_

102_

103_

104_

105_

106_

107_

0 1 2 3 4 5 6 7 8 9 A B C D E F

U taj dio memorije je maksimalno

moguće smjestiti polje od 8 elemenata

Dinamičko polje: int *polje[9];

Korištenjem dinamičkog polja

Page 54: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

00000000

10110000

11100000

10101000

11101011

00001000

01000000

01000010

10101010

11111111

11011001

11101101

10000111

11100011

11000000

10001001

11101011

00001000

01000000

01000010

00000000

00000000

00000000

00001101

00000000

00000000

00000000

00000000

01000010

10101010

10110000

11101011

00000000

00000000

00000000

00000000

00000000

00000000

00000000

01000010

01011010

10110000

11100000

10101000

11101011

11101011

00001000

00000000

00000000

01000000

01000000

00001000

01000000

11100000

10110000

11100000

10101000

11101011

00001000

01000000

11100000

10101000

00000000

11101011

11100000

10101000

10101000

10101000

11101011

00001000

01000000

01000010

10101010

10110000

11100000

10101000

11101011

01000010

11100000

10110000

00001000

00000000

00000000

01000010

00000000

10110000

01000000

10101000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

10110000

11100000

10101000

11101011

11101011

00001000

10101000

01000010

11100000

10110000

11100000

10101000

11101011

00000000

10110000

10110000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

00001000

01000000

01000010

10101010

11101011

00001000

10110000

100_

101_

102_

103_

104_

105_

106_

107_

0 1 2 3 4 5 6 7 8 9 A B C D E F

U taj dio memorije je maksimalno

moguće smjestiti polje od 7 elemenata

Dinamičko polje: int *polje[9];

Korištenjem dinamičkog polja

Page 55: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

00000000

10110000

11100000

10101000

11101011

00001000

01000000

01000010

10101010

11111111

11011001

11101101

10000111

11100011

11000000

10001001

11101011

00001000

01000000

01000010

00000000

00000000

00000000

00001101

00000000

00000000

00000000

00000000

01000010

10101010

10110000

11101011

00000000

00000000

00000000

00000000

00000000

00000000

00000000

01000010

01011010

10110000

11100000

10101000

11101011

11101011

00001000

00000000

00000000

01000000

01000000

00001000

01000000

11100000

10110000

11100000

10101000

11101011

00001000

01000000

11100000

10101000

00000000

11101011

11100000

10101000

10101000

10101000

11101011

00001000

01000000

01000010

10101010

10110000

11100000

10101000

11101011

01000010

11100000

10110000

00001000

00000000

00000000

01000010

00000000

10110000

01000000

10101000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

10110000

11100000

10101000

11101011

11101011

00001000

10101000

01000010

11100000

10110000

11100000

10101000

11101011

00000000

10110000

10110000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11101011

00001000

01000000

01000010

10101010

11101011

00001000

10110000

100_

101_

102_

103_

104_

105_

106_

107_

0 1 2 3 4 5 6 7 8 9 A B C D E F

Na navedenom dijelu memorije nijemoguće smjestiti pomoću dinamičkog

polja 9 elemenata tipa int

Korištenjem dinamičkog polja

Page 56: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

Vezana listastruct telement {

int broj;

telement *sljedeci;

} *lista;

void dodaj (int i) {

telement *trenutni=lista;

while (trenutni->sljedeci!=NULL) {

trenutni=trenutni->sljedeci;

}

trenutni->sljedeci=new telement;

trenutni=trenutni->sljedeci;

trenutni->broj=i;

trenutni->sljedeci=NULL;

}

int main () {

lista=new telement;

lista->sljedeci=NULL;

for (int i=1;i<10;i++)

dodaj(i);

return 0;

}

Alokacija glave

Alokacija 9 elemenata

Vezana lista

Page 57: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

struct telement {

int broj;

telement *sljedeci;

} *lista;

...

broj *sljedeci

Apstraktni tip podataka (kombinacija više jednostavnijih) spreman za daljnje korištenje –

još nije nigdje smješten!

Definiranje strukture (građe, sastojaka) izvedenog tipa telement te naznačavanje (privilegiranje) da će upravo deklarirani pokazivač *lista biti u mogućnosti stvarati djecu-objekte tipa telement

Vezana lista

Page 58: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

...

int main () {

lista=new telement;

lista->sljedeci=NULL;

...

Konačna alokacija glave vezane liste

lista->sljedeci isto što i (*lista).sljedecidobra praksa:za statičke strukture i klase koristi se operator ‘.’,a za dinamičke (dostupne preko pokazivača) ‘->’

Naznačavanje da iza trenutnog elementa (glave) ne postoji više nijedan element

?

Vrijednost glave nije potrebno inicijalizirati jer ona niti ne služi za zapisivanje, niti za čitanje

Vezana lista

Page 59: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

for (int i=1;i<10;i++) {

telement *trenutni=lista;

while (trenutni->sljedeci!=NULL) {

trenutni=trenutni->sljedeci;

}

trenutni->sljedeci=new telement;

trenutni=trenutni->sljedeci;

trenutni->broj=i;

trenutni->sljedeci=NULL;

}

Moguće svesti na funkciju void dodaj (int i)koja se na ovom dijelu poziva jer je proces za dodavanje svakog elementa identičan i repetitivan

Vezana lista

Page 60: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

...

telement *trenutni=lista;

while (trenutni->sljedeci!=NULL) {

trenutni=trenutni->sljedeci;

}

...

Deklaracija pomoćnog pokazivača koji za sad pokazuje na glavu liste (isto kao i pokazivač lista)

Ophođenje vezane liste do zadnjeg člana na kojeg će biti dodan novi član (idi na sljedeći vagon dok se ne nađeš u onom koji nema sljedećeg)

Kod 1. iteracije: glava nema elemenata u nastavku (uvjet nije zadovoljen) -> ne izvršava se tijelo while petlje u ovom kruguKod 2. iteracije: glava ima element (bit će dodan nakon ovog isječka koda) -> pozicioniraj se na sljedeći -> da li on ima elemenata u nastavku? (NEMA) -> ne izvršava se dalje tijelo while petlje u ovom kruguKod 3. iteracije: glava ima element -> pozicioniraj se na sljedeći -> da li on ima elemenata u nastavku? (IMA) -> pozicioniraj se na sljedećga iza njega -> da li on ima elemenata u nastavku? (NEMA) -> ne izvršava se dalje tijelo while petlje u ovom krugu...

Vezana lista

Page 61: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

...

trenutni->sljedeci=new telement;

trenutni=trenutni->sljedeci;

trenutni->broj=i;

trenutni->sljedeci=NULL;

}

...

Na zadnji element liste (koji je prošlim korakom određen) pridodaj novi element

Prebaci se na trenutno stvoreni objekt

Pridodaj dijelu sa vrijednošću toga novododanog elementa vrijednost brojača for petlje (mogla mu se pridružiti i vrijednost sa ulaznog toka cin)

Naznači da će sad taj element označavati kraj liste (neće voditi dalje)

Vezana lista

Page 62: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

Prva iteracija (i=1):

#### NULL

lista lista trenutni

#### NULL

lista trenutni

#### #adresa1#

#### ####

lista trenutni

#### #adresa1#

#### ####

lista trenutni

#### #adresa1#

1 ####

lista trenutni

#### #adresa1#

1 NULL

telement *trenutni=lista;(stanje)

Vezana lista

while (trenutni->sljedeci!=NULL)trenutni=trenutni->sljedeci;

trenutni->sljedeci=new telement;

trenutni=trenutni->sljedeci; trenutni->broj=i; trenutni->sljedeci=NULL;

Page 63: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

while (trenutni->sljedeci!=NULL)trenutni=trenutni->sljedeci;

trenutni->sljedeci=new telement;

(stanje)

trenutni=trenutni->sljedeci; trenutni->broj=i; trenutni->sljedeci=NULL;

Vezana lista

Druga iteracija (i=2):

lista

#### #adresa1#

1 NULL

lista

#### #adresa1#

1 NULL

trenutni

telement *trenutni=lista;

lista

#### #adresa1#

1 #adresa2#

trenutni

#### ####

lista

#### #adresa1#

1 #adresa2#

trenutni

#### ####

lista

#### #adresa1#

1 #adresa2#

trenutni

2 ####

lista

#### #adresa1#

1 #adresa2#

trenutni

2 NULL

Page 64: Varijable i Pokazivači (Automatska i Dinamička Alokacija Memorije)

Rješenje00000000

10110000

11100000

10101000

11101011

00001000

01000000

01000010

10101010

11111111

11011001

11101101

10000111

11100011

11000000

10001001

0x0000 1014 1 0x0000 102701000010

10101010

10110000

11101011

00000000

00000000

00000000

00000000

00000000

00000000

00000000

2 0x0000 102F 3

0x0000 1037 4 0x0000 103F 5

0x0000 104901000010

10101010

6 0x0000 1051

7 0x0000 1059 8 0x0000 1072

11100000

10101000

11101011

11101011

00001000

10101000

01000010

11100000

10110000

11100000

10101000

11101011

00000000

10110000

10110000

00000000

00000000

9 0x0000 0000 (NULL)01000000

01000010

10101010

11101011

00001000

10110000

100_

101_

102_

103_

104_

105_

106_

107_

0 1 2 3 4 5 6 7 8 9 A B C D E F

Vezana lista