Professional Documents
Culture Documents
Uvod U Pokazivace
Uvod U Pokazivace
Pokazivai u C-u
Memorija raunala
Jednostavan primjer:
(32bit)
00000000
00000001
...
0001C702
0001C703
0001C706
0001C704
0001C705
0001C707
0001C708
...
FFFFFFFE
FFFFFFFF
00
00
...
1A
00
34
00
00
00
00
...
00
00
00000000
Definicija varijabli
00000001
...
0001C702
a
a je "na adresi"
0001C702(16)
0001C703
0001C704
0001C705
b
c
0001C706
0001C707
0001C708
...
FFFFFFFE
FFFFFFFF
00
00
...
01
00
00
00
02
03
00
...
00
00
Operator &
Kako saznati adresu od x ?
int x=0,y=10;
020BC40A
020BC40B
020BC40C
020BC40D
020BC40E
&x
&y
020BC40A
020BC40E
020BC40F
020BC410
020BC411
00
00
00
00
0A
00
00
00
Operator &
0001C702
Primjer:
0001C703
0001C704
0001C705
int a;
0001C706
a = 1;
0001C707
0001C708
printf("adresa od a %x\n",&a);
Ispis:
a = 1, adresa od a je 1C702
01
00
00
00
02
03
00
Pokaziva (pointer)
Kamo pohraniti adresu?
... u pokaziva!
int *pa;
/* pokazivac na int
*/
pa = &a;
Definiranje pokazivaa
(primjeri)
short a, *pa;
a
a = 5;
0001C702
0001C703
pa = &a;
0001C704
printf("%x ",a);
0001C705
printf("%x ",&a);
printf("%x\n",pa);
Ispis:
pa
0001C706
0001C707
0001C708
05
00
02
C7
01
00
00
5 1C702 1C702
Definiranje pokazivaa
int a;
int *pa;
/* pokazivac na int
*/
*/
pa = &a;
/* ok
*/
pb = &a;
/* nije dopusteno!
*/
Operator *
(dereferenciranje pokazivaa)
imamo pokaziva koji pokazuje na varijablu a:
/* sada pa pokazuje na a */
printf("%i",*pa);
Ispis:
25
pristupamo sadraju od a
Operator *
(dereferenciranje pokazivaa)
imamo pokaziva koji pokazuje na varijablu a:
DEFINICIJA
/* pa pokazuje na a */
printf("%i",*pa);
Ispis:
25
PRISTUP SADRZAJU
(dereferencing)
pristupamo sadraju od a
Operator *
(primjeri)
char x=1,y=2;
Ispis:
char *p;
p=&x;
printf("%i",*p);
p=&y;
printf("%i",*p);
y=3;
printf("%i",*p);
Operator *
(primjeri)
char x=5,*p;
p=&x;
/* p pokazuje na x */
Ispis:
printf(*p);
printf(x);
*p=3;
printf(*p);
printf(x);
5
5
3
3
Operator *
(primjeri)
char x=5,*p;
p=&x;
/* p pokazuje na x */
Ispis:
printf(*p);
printf(x);
5
5
Primjeri
adresa od a je
1B60
int a=1,b=2;
int *pa, *pb;
pa=&a;
pb=pa;
*pb=15;
b=*pa+5;
pa
pb
Primjeri
adresa od a je
1B60
int a=1,b=2;
pa=&a;
pb=pa;
*pb=15;
b=*pa+5;
pa
pb
Primjeri
adresa od a je
1B60
int a=1,b=2;
pa=&a;
pb=pa;
*pb=15;
b=*pa+5;
pa
pb
1B60
Primjeri
adresa od a je
1B60
int a=1,b=2;
pa=&a;
pb=pa;
*pb=15;
b=*pa+5;
pa
pb
1B60
1B60
1B60
Primjeri
adresa od a je
1B60
pa
pb
int a=1,b=2;
pa=&a;
1B60
pb=pa;
1B60
1B60
*pb=15;
15
1B60
1B60
b=*pa+5;
Primjeri
adresa od a je
1B60
pa
pb
int a=1,b=2;
pa=&a;
1B60
pb=pa;
1B60
1B60
*pb=15;
15
1B60
1B60
b=*pa+5;
15
20
1B60
1B60
int a=1,b=2;
pa=&a;
pb=pa;
pb=pa+1;
pa
pb
1B60
1B60
1B60
pa
pb
int a=1,b=2;
pa=&a;
1B60
b=a+1;
1B60
1B60
pb=pa+1;
1B60
1B64
Aritmetika pokazivaa
char
short
int
float
*pc
*ps
*pi
*pf
printf("%x
printf("%x
printf("%x
printf("%x
=
=
=
=
0x00001000;
0x00002000;
0x00003000;
0x00004000;
",pc+1);
",ps+1);
",pi+1);
",pf+1);
Ispis:
1001
2002
3004
4004
Polja i pokazivai
...
a[0]
a[1]
10
a[2]
4
a[3]
2
25
...
int x, a[4]={10,4,2,25};
int *pa;
pa = &a[0];
/* pa pokazuje na a[0] */
x = *pa;
/* x = sadrzaj od a[0] */
to sadri x = *(pa+2) ?
Polja i pokazivai
...
a[0]
10
*pa
a[1]
a[2]
a[3]
4
*(pa+1)
2
*(pa+2)
25
*(pa+3)
...
int x, a[4]={10,4,2,25};
int *pa;
pa = &a[0];
/* pa pokazuje na a[0] */
Ispis: 25
Polja i pokazivai
...
a[0]
*a
10
*pa
a[1]
*(a+1)
4
*(pa+1)
a[2]
*(a+2)
2
*(pa+2)
a[3]
*(a+3)
25
*(pa+3)
...
Primjer:
int a[4]={10,4,2,25};
int *pa=a;
/* a <=> &a[0] */
for(int i=0;i<4;i++)
printf("%i ",*(pa+i));
Ispis:
10 4 2 25
Najee greke
1) Sintaksa
int x, y = 5;
/* y je na adresi 1BA0 */
int *p = &y;
x = p;
/* mozda greska? */
/* ispravno je x = *p; */
Najee greke
2) Inicijalizacija
VANO: kada se definira pokaziva on ne pokazuje
nigdje, mora se inicijalizirati prije koritenja!
int *p;
*p = 100;
int *p;
int x;
p = &x;
*p = 100;
Ok!
Najee greke
3) Kontrola prije pristupa sadraju
Kada sami ne inicijaliziramo pokaziva, prije pristupa
sadraju valja uvijek kontrolirati ispravnost adrese.
Opasno:
int *p;
p = fun(); /* neka funkcija koja vraca adresu */
*p = 100;
Bolje:
int *p;
p = fun(); /* neka funkcija koja vraca adresu */
if (p!=NULL) *p = 100;
Saetak
Zakljuci
Kristijan Lenac
klenac@gmail.com
Polja i pokazivai
Ispis ?
Polja i pokazivai
Ispis: Rijeka