varijable i pokazivači (automatska i dinamička alokacija memorije)
Post on 24-Dec-2015
19 Views
Preview:
DESCRIPTION
TRANSCRIPT
Varijable i pokazivači
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;)
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
#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
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)
#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
#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
#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
#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
#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
#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
#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
#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
#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
#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
#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
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
• 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
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
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
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
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
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
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
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
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!)
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
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
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;...
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)
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)
...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
...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)
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)
...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
...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)
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)
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)
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
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
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)
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)
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;...
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;...
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;...
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;...
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!
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!
...
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)
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)
Problem:
• Smjestiti 9 elemenata tipa int na gore navedeni dio 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
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
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
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
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
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
...
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
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
...
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
...
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
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;
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
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
top related