Lekcija 4. KODIRANJE I TIPOVI PODATAKA - FESB
Lekcija 4. KODIRANJE I TIPOVI PODATAKA - FESB Lekcija 4. KODIRANJE I TIPOVI PODATAKA - FESB
Lekcija 4. KODIRANJE I TIPOVI PODATAKA Standardno se kodiraju: kardinalni brojevi unsigned integer -1 0,1,2--- 2 n -1 cijeli brojevi integer 2 n-1 ,....-3,-2-1, 0, 1, 2,3, ... 2 n-1 -1 realni brojevi float, double 1.47, 4.78 x 10 -3 znakovi char a,b, 7, &, ), A, Z nizovi znakova string "Hello" Korisnik može provesti svoj način kodiranja u specijalnim slučajevima. ASCII KOD ZA TEKSTUALNE I KONTROLNE ZNAKOVE To je sedam bitni kôd (ukupno 128 različitih znakova), od čega se prva 32 znaka koriste kao kontrolni znakovi rezličite namjene, a ostali znakovi predstavljaju slova abecede, pravopisne i matematičke simbole. 000: (nul) 016: (dle) 032: (sp) 048: 0 064: @ 080: P 096: ž 112: p 001: (soh) 017: (dc1) 033: ! 049: 1 065: A 081: Q 097: a 113: q 002: (stx) 018: (dc2) 034: " 050: 2 066: B 082: R 098: b 114: r 003: (etx) 019: (dc3) 035: # 051: 3 067: C 083: S 099: c 115: s 004: (eot) 020: (dc4) 036: $ 052: 4 068: D 084: T 100: d 116: t 005: (enq) 021: (nak) 037: % 053: 5 069: E 085: U 101: e 117: u 006: (ack) 022: (syn) 038: & 054: 6 070: F 086: V 102: f 118: v 007: (bel) 023: (etb) 039: ' 055: 7 071: G 087: W 103: g 119: w 008: (bs) 024: (can) 040: ( 056: 8 072: H 088: X 104: h 120: x 009: (tab) 025: (em) 041: ) 057: 9 073: I 089: Y 105: i 121: y 010: (lf) 026: (eof) 042: * 058: : 074; J 090: Z 106: j 122: z 011: (vt) 027: (esc) 043: + 059: ; 075: K 091: [ 107: k 123: { 012: (np) 028: (fs) 044: , 060: < 076: L 092: \ 108: l 124: | 013: (cr) 029: (gs) 045: - 061: = 077: M 093: ] 109: m 125: } 014: (so) 030: (rs) 046: . 062: > 078: N 094: ^ 110: n 126: ~ 015: (si) 031: (us) 047: / 063: ? 079: O 095: _ 111: o 127: del 4.1
- Page 2 and 3: U C jeziku se imena varijabli i fun
- Page 4 and 5: Memorija i podaci 1. Podaci, koji s
- Page 6 and 7: Deklaracije i definicije Pridjeljiv
- Page 8 and 9: I konstante C jezika indirektno u s
- Page 10 and 11: 4.4 #define - direktiva Leksička s
- Page 12 and 13: 4.5 Specifikatori printf funkcije K
- Page 14 and 15: Primjeri korištenja printf funkcij
- Page 16 and 17: Pokazivači Varijable kojima je vri
- Page 18 and 19: Važna osobina indirekcije pokaziva
- Page 20 and 21: Jednostavni programi u kojima ćemo
- Page 22: 4.8 Inicijalizacija varijabli Temel
<strong>Lekcija</strong> <strong>4.</strong> <strong>KODIRANJE</strong> I <strong>TIPOVI</strong> <strong>PODATAKA</strong><br />
Standardno se kodiraju:<br />
kardinalni brojevi unsigned integer -1 0,1,2--- 2 n -1<br />
cijeli brojevi integer 2 n-1 ,....-3,-2-1, 0, 1, 2,3, ... 2 n-1 -1<br />
realni brojevi float, double 1.47, <strong>4.</strong>78 x 10 -3<br />
znakovi char a,b, 7, &, ), A, Z<br />
nizovi znakova string "Hello"<br />
Korisnik može provesti svoj način kodiranja u specijalnim slučajevima.<br />
ASCII KOD ZA TEKSTUALNE I KONTROLNE ZNAKOVE<br />
To je sedam bitni kôd (ukupno 128 različitih znakova), od čega se prva 32 znaka koriste kao kontrolni znakovi rezličite<br />
namjene, a ostali znakovi predstavljaju slova abecede, pravopisne i matematičke simbole.<br />
000: (nul) 016: (dle) 032: (sp) 048: 0 064: @ 080: P 096: ž 112: p<br />
001: (soh) 017: (dc1) 033: ! 049: 1 065: A 081: Q 097: a 113: q<br />
002: (stx) 018: (dc2) 034: " 050: 2 066: B 082: R 098: b 114: r<br />
003: (etx) 019: (dc3) 035: # 051: 3 067: C 083: S 099: c 115: s<br />
004: (eot) 020: (dc4) 036: $ 052: 4 068: D 084: T 100: d 116: t<br />
005: (enq) 021: (nak) 037: % 053: 5 069: E 085: U 101: e 117: u<br />
006: (ack) 022: (syn) 038: & 054: 6 070: F 086: V 102: f 118: v<br />
007: (bel) 023: (etb) 039: ' 055: 7 071: G 087: W 103: g 119: w<br />
008: (bs) 024: (can) 040: ( 056: 8 072: H 088: X 104: h 120: x<br />
009: (tab) 025: (em) 041: ) 057: 9 073: I 089: Y 105: i 121: y<br />
010: (lf) 026: (eof) 042: * 058: : 074; J 090: Z 106: j 122: z<br />
011: (vt) 027: (esc) 043: + 059: ; 075: K 091: [ 107: k 123: {<br />
012: (np) 028: (fs) 044: , 060: < 076: L 092: \ 108: l 124: |<br />
013: (cr) 029: (gs) 045: - 061: = 077: M 093: ] 109: m 125: }<br />
014: (so) 030: (rs) 046: . 062: > 078: N 094: ^ 110: n 126: ~<br />
015: (si) 031: (us) 047: / 063: ? 079: O 095: _ 111: o 127: del<br />
<strong>4.</strong>1
U C jeziku se imena varijabli i funkcija označavaju nizom znakova, stoga se za označavanje znakovne konstante<br />
koriste jednostruki navodnici, primjerice u C iskazu:<br />
a = ’a’;<br />
Važno je razlikovati slijedeće iskaze:<br />
1) a = 8;<br />
2) a = ’8’;<br />
Neki znakovi iz ASCII skupa se ne mogu zapisati u izvornom kodu, jer za njih ne postoji oznaka na standardnoj<br />
tipkovnici.<br />
\b oznaka za povrat unatrag - backspace BS<br />
\f oznaka za stranicu unaprijed - form feed FF<br />
\n oznaka nove linije - new line NL<br />
\r oznaka za povrat na početak reda CR<br />
\t oznaka za horizontalni tab HT<br />
\v oznaka za vertikalni tab<br />
\” uznaka za dvostruki navodnik<br />
\‘ oznaka za jednostruki navodnik<br />
\\ oznaka za znak \ - backslash<br />
‘\ooo‘ znak kojem je ASCII kod zapisan oktalnim znamenkama ooo.<br />
‘\0xhh‘ znak kojem je ASCII kod zapisan heksadecimalnim znamenkama hh.<br />
Primjerice, ekvivalentna su tri zapisa znaka A:<br />
‘A‘ ‘\0x41‘ ‘\101‘<br />
Zapamtimo: u C jeziku se znakovne konstante zapisuju unutar jednostrukih zagrada znakovima iz ASCII<br />
skupa (ili kontrolnom sekvencom). Može ih se tretirati i kao numeričke vrijednosti cjelobrojnog tipa na način<br />
da je vrijednost znakovne konstante jednaka ASCII kodu znaka.<br />
<strong>4.</strong>2
String<br />
Kada se u C jeziku koriste literalne konstante koje predstavljaju string (niz znakova) one se zapisuju unutar dvostrukih<br />
navodnika, primjerice<br />
"Hello World!\n".<br />
Unutar stringa kontrolne znakove se zapisuje bez navodnika. U ovom primjeru na kraju stringa je zapisan znak za<br />
prijelaz u novu liniju.<br />
Kodiranje logičkih vrijednosti<br />
Vrijedi pravilo: svaka numerička vrijednost može se tretirati kao logička vrijednost “istina” ako je različita od<br />
nule, odnosno “laž” ako je jednaka nuli.<br />
Primjerice, u izrazu<br />
a = x > y;<br />
varijabli a se pridjeljuje vrijednost 1 ako je izraz na desnoj strani istinit (ako je x veće od y), u suprotnome, pridjeljuje<br />
se vrijednost 0.<br />
Ako je x == y x != y x > y x < y x = y<br />
x-y > 0 0 1 1 0 0 1<br />
x-y = 0 1 0 0 0 1 1<br />
x-y < 0 0 1 0 1 1 0<br />
Tablica <strong>4.</strong>5 Izvršavanje relacijskih operacija C jezika<br />
<strong>4.</strong>3
Memorija i podaci<br />
1. Podaci, koji se nalaze na nekoj adresi u memoriji, nazivaju se memorijski objekti.<br />
2. Adresa se opisuje kardinalnim brojem koji opisuje položaj temeljne memorijske čelije, veličine 8 bita, u linearno<br />
uređenom prostoru memorije.<br />
3. Podaci su najčešće kodirani tako da pripadaju skupu numeričkih vrijednosti ili skupu znakova koji su kodirani<br />
prema ASCII standardu, ili pak skupu logičkih vrijednosti ({true, false} odnosno {1,0}).<br />
<strong>4.</strong> Memorijskim objektima procesor može mijenjati sadržaj i s njima obavljati aritmetičko-logičke operacije.<br />
5. Memorijske objekte s kojima procesor operira kao s cjelinom nazivamo varijablama.<br />
<strong>4.</strong>3 Prosti tipovi podataka<br />
U programskim se jezicima pripadnost skupu koji ima zajedničke karakteristike naziva tipom. Tip varijable određuje<br />
način njenog kodiranja, način kako ona zauzima memoriju računala i operacije koje su nad tom varijablom dozvoljene.<br />
Tipovi varijabli (ili konstanti) koji se koriste u izrazima određuju tip kojim rezultira taj izraz.<br />
U većini programskih jezika standardni su tipovi podataka:<br />
• numerički (cjelobrojni ili realni)<br />
• logički<br />
• znakovni<br />
a nazivaju se i primitivni ili prosti tipovi jer predstavljaju nedjeljive cjeline i imaju izravan prikaz u memoriji<br />
računala.<br />
<strong>4.</strong>4
tip<br />
znakovni tip<br />
cjelobrojni tip<br />
kardinalni tip<br />
realni tip<br />
(jednostruki<br />
format)<br />
realni tip<br />
(dvostruki<br />
format)<br />
logički tip<br />
(samo u C++)<br />
Oznaka u<br />
C i C++ jeziku<br />
[signed] char<br />
unsigned char<br />
[signed] int<br />
[signed] short<br />
[signed] long<br />
unsigned [int]<br />
unsigned short<br />
unsigned long<br />
float<br />
interval<br />
vrijednosti<br />
-127 .. 128<br />
0 .. 255<br />
-2147483648.. 2147483647<br />
-32768 .. 32767<br />
-2147483648.. 2147483647<br />
0 .. 4294967295<br />
0 .. 65535<br />
0 .. 4294967295<br />
min ± 1.175494351e-38<br />
maks ± 3.402823466e+38<br />
zauzeće<br />
memorije<br />
1 bajt<br />
1 bajt<br />
4 bajta<br />
2 bajta<br />
4 bajta<br />
4 bajta<br />
2 bajta<br />
4 bajta<br />
4 bajta<br />
double<br />
min<br />
± 2.2250738585072014e-308<br />
maks.<br />
± 1.7976931348623158e+308<br />
8 bajta<br />
bool false ..true 1<br />
Uz pojam varijable uvijek su vezani pojmovi: tip i ime.<br />
Ime predstavlja oznaku adrese varijable u memoriji, pa se zove i referenca varijable, ili referenca<br />
memorijskog objekta. Tip označava skup vijednosti varijable, veličinu zauzeća memorije, način kodiranja i<br />
operacije koje se mogu primijeniti.<br />
<strong>4.</strong>5
Deklaracije i definicije<br />
Pridjeljivanje oznake tipa nekoj varijabli naziva se deklaracija varijable, a ako se pod tom deklaracijom<br />
podrazumijeva i rezerviranje memorijskog prostora u kojem će biti smještena kodirana vrijedanost varijable,<br />
onda se kaže da je deklaracijom izvršena i definicija varijable. U C i C++ jeziku uvijek mora biti deklariran tip<br />
varijable prije nego sa ona upotrijebi u programskim iskazima.<br />
U programu, imena area1.c, izvršit ćemo jednostavni proračun površine kruga. Upotrijebit ćemo dvije varijable tipa<br />
double: s r ćemo označiti radijus, a s area ćemo označiti površinu. Uzet ćemo da je radijus poznat i da iznosi 2.1 m.<br />
Rezultat proračuna ćemo ispisati pomoću printf funkcije. Evo kako se može napisati taj program<br />
/* area1.c - Program koji računa površinu kruga radijusa 2.1 m */<br />
#include <br />
int main()<br />
{<br />
double r, area; /* deklaracija varijabli r i area */<br />
r = 2.1; /* zadana vrijednost radijusa 2.1m*/<br />
area = r*r*3.14; /* proračun površine kruga */<br />
printf( "\n Povrsina kruga = %f m", area);<br />
return 0;<br />
}<br />
Kada se program kompajlira i izvrši dobije se ispis:<br />
Povrsina kruga = 13.847400 m<br />
• Deklaraciju varijabli se uvijek zapisuje na način da se oznaka tipa napiše ispred imena varijabli.<br />
• Ako se istovremeno deklarira više varijabli istoga tipa, njihova se imena odvajaju zarezom. Zapis deklaracije<br />
završava znakom točka-zarez.<br />
<strong>4.</strong>6
* sizeof.c-ispisuje zauzeće memorije za proste tipove C jezika */<br />
#include <br />
int main()<br />
{<br />
printf( "\nSizeof(char) = %d", sizeof( char ));<br />
printf( "\nSizeof(int) = %d", sizeof( int ));<br />
printf( "\nSizeof(short) = %d", sizeof( short ));<br />
printf( "\nSizeof(long) = %d", sizeof( long ));<br />
printf( "\nSizeof(float) = %d", sizeof( float ));<br />
printf( "\nSizeof(double) = %d", sizeof( double ));<br />
printf( "\nSizeof(unsigned char) = %d",sizeof( unsigned char ));<br />
printf( "\nSizeof(unsigned int) = %d",sizeof( unsigned int ));<br />
printf( "\nSizeof(unsigned short) = %d",sizeof( unsigned short ));<br />
printf( "\nSizeof(unsigned long) = %d\n",sizeof( unsigned long ));<br />
return 0;<br />
}<br />
Kada se kompajlira i izvrši, program daje ispis:<br />
Sizeof(char) = 1<br />
Sizeof(int) = 4<br />
Sizeof(short) = 2<br />
Sizeof(long) = 4<br />
Sizeof(float) = 4<br />
Sizeof(double) = 8<br />
Sizeof(unsigned char) = 1<br />
Sizeof(unsigned int) = 4<br />
Sizeof(unsigned short) = 2<br />
Sizeof(unsigned long) = 4<br />
<strong>4.</strong>7
I konstante C jezika indirektno u svom zapisu sadrže oznaku tipa. Evo primjera:<br />
char ’A’<br />
’a’<br />
ili ’\035’<br />
’\x29’<br />
int ’\n’<br />
int 156<br />
0234<br />
0x9c<br />
unsigned 156U<br />
0234U<br />
0x9cU<br />
float 15.6F<br />
1.5e1F<br />
double 15.6L<br />
1.5E1L<br />
znakovna konstanata a<br />
znakovna konstanata A<br />
znakovna konstanata 35 oktalno,<br />
znakovna konstanata 29 heksadecimalno,<br />
nova linija<br />
decimalna notacija<br />
oktalna notacija cjelobrojne konstante<br />
heksadecimalna notacija<br />
Decimalno<br />
oktalno (prefiks U određuje kardinalni broj)<br />
heksadecimalno<br />
realni broj – jednostruki format<br />
određen primjenom sufiksa F ili f<br />
konstante su tipa "double" ukoliko se ne<br />
koristi prefiks F. Nije nužno pisati sufiks<br />
L.<br />
<strong>4.</strong>8
Znakovne konstante su kompatibilne i s znakovnim i s cjelobrojnim tipom.<br />
/* CHARSIZE.C-Program kojim se ispituje tip znakovne konstante */<br />
#include <br />
int main()<br />
{<br />
char c; /* deklaracija varijable c tipa char */<br />
int x; /* deklaracija varijable x tipa int */<br />
}<br />
c = 'A'; /* varijablama može se pridijeliti */<br />
x = 'A'; /* vrijednost znakovne konstante 'A' */<br />
printf( "\n c = %c", c);<br />
printf( "\n Sizeof c = %d", sizeof (c) );<br />
printf( "\n x = %d", x);<br />
printf( "\n Sizeof x = %d", sizeof(x));<br />
printf( "\n Sizeof 'A' = %d", sizeof('A'));<br />
return 0;<br />
koji daje ispis:<br />
c = A<br />
Sizeof c = 1<br />
x = 65<br />
Sizeof x = 4<br />
Sizeof 'A' = 4<br />
<strong>4.</strong>9
<strong>4.</strong>4 #define - direktiva<br />
Leksička se vrijednost numeričkih, znakovnih i literalnih konstanti, pa i samog programskog teksta, može pridijeliti<br />
nekom simboličkom imenu pomoću pretprocesorske direktive #define. Primjerice ako se zapiše:<br />
#define PI 3.141592653589793<br />
to ima efekt da kada se u tekstu programa, koji slijedi iza ove direktive, zapiše PI, vrijedi kao da smo zapisali<br />
3.141592653589793.<br />
Općenito #define direktiva ima oblik:<br />
#define IME supstitucijski_tekst<br />
gdje IME predstavlja proizvoljan naziv zapisan neprekinutim nizom znakova (obično se zapisuje velikim slovima i<br />
podvlakom), a supstitucijski_tekst može sadržavati i isprekidani niz znakova.<br />
<strong>4.</strong>10
Primjerice,<br />
#include <br />
#define MESSAGE "Vrijednost broja pi = "<br />
#define PI 3.141592653589793<br />
#define PR_NL printf("\n")<br />
int main( void)<br />
{<br />
printf(MESSAGE);<br />
printf("%f" ,PI);<br />
PR_NL;<br />
return 0;<br />
}<br />
Nakon izvršenja dobije se ispis<br />
Vrijednost broja pi = 3.141592653589793<br />
Kasnije će biti detaljnije pojašnjen rad s pretprocesorskim direktivama.<br />
Iza direktive se ne piše znak točka-zarez.<br />
<strong>4.</strong>11
<strong>4.</strong>5 Specifikatori printf funkcije<br />
Kada se ispis vrši po unaprijed određenom obliku i rasporedu kažemo da se vrši formatirani ispis. Sada ćemo pokazati<br />
kako se zadaje format ispisa pomoću printf() funkcije.<br />
Općenito format se zadaje pomoću šest polja:<br />
%[prefiks][širina_ispisa][. preciznost][veličina_tipa]tip_argumenta<br />
Format mora započeti s znakom % i završiti s oznakom tipa argumenta. Sva ostala polja su opciona (zbog toga su<br />
napisana unutar uglatih zagrada).<br />
Polje prefiks može sadržavati jedan znak koji ima slijedeće značenje:<br />
- Ispis se poravnava prema lijevoj granici ispisa<br />
+ Pozitivnim se vrijednostima ispisuje i ‘+’ predznak.<br />
razmak Ako je vrijednost positivna, dodaje se razmak prije ispisa<br />
0 Mjesta razmaka ispunjuju se znakom 0.<br />
# Alternativni stil formatiranja<br />
Polje .preciznost određuje broj decimalnih znamenki iza decimalne točke ispisa realnog broja, minimalni broj<br />
znamenki cijelog broja, maksimalni broj znakova stringa.<br />
<strong>4.</strong>12
%[prefiks][širina_ispisa][. preciznost][veličina_tipa]tip_argumenta<br />
Polje tip_argumenta može sadržavati samo jedan od slijedećih znakova znakova:<br />
c Argument se tretira kao int koji se ispisuje kao znak iz ASCII skupa.<br />
d, i Argument se tretira kao int, a ispisuje se decimalnim znamenkama.<br />
e, E Argument je float ili double, a ispis je u eksponentnom formatu.<br />
f Argument je float ili double, a ispis je prostom decimalnom formatu. Ako je prefiks<br />
# i preciznost .0, tada se ne ispisuje decimalna točka.<br />
g, G Argument je float ili double, a ispis je prostom ili u eksponencijalnom formatu<br />
o Argument je unsigned int, a ispisuje se oktalnim znamenkama.<br />
p Argument se tretira kao pokazivač tipa void *<br />
s Argument mora biti literalni string odnosno pokazivač tipa char *.<br />
u Argument je unsigned int, a ispisuje se decimalnim znamenkama.<br />
x, X Argument je unsigned int, a ispisuje se heksadecimalnim znamenkama. Ako se<br />
zada prefiks # , ispred heksadecimalnih znamenki se ispisuje 0x ili 0X.<br />
Polje veličina_tipa može sadržavati samo jedan znak neposredno ispred oznake tipa.<br />
h<br />
l<br />
L<br />
Pripadni argument tipa int tretira se kao short int ili unsigned short int.<br />
Pripadni argument je long int ili unsigned long int.<br />
Pripadni argument realnog tipa je long double.<br />
<strong>4.</strong>13
Primjeri korištenja printf funkcije:<br />
/* printf.c - primjer korištenja printf funkcije */<br />
#include<br />
int main()<br />
{<br />
printf("%d, %5d, %-5d, %05d, %5.5d\n", 1, 2, 3, 4, 5);<br />
printf("%o %x %X %#o %#x\n", 171, 171, 171, 171, 171);<br />
printf("%f %e %g\n", 3.14, 3.14, 3.14);<br />
printf("%s, %.5s!\n", "Hello", "worldly");<br />
printf("%0*d, %.*f, %*.*s\n", 2, 3, 4, 5.6, 7, 3, abcdef");<br />
return 0;<br />
}<br />
Ovaj pogram daje ispis:<br />
1, 2, 3 , 00004, 00005<br />
253 ab AB 0253 0xab<br />
3.140000 3.140000e+000 3.14<br />
Hello, world!<br />
03, 5.6000, abc<br />
U prethodnim tablicama za oznake tipa argumenata ‘p’ i ‘s’ naglašeno je da su argumenti funkcije pokazivači. Što je to<br />
pokazivač, bit će objašnjeno u slijedećem odjeljku.<br />
<strong>4.</strong>14
<strong>4.</strong>6 Pristup podacima pomoću pokazivača<br />
C jezik omogućuje korištenje numeričke vrijednosti adresa varijabli i funkcija za indirektno manipuliranje s podacima i<br />
izvršenjem programa. Koriste se operatori :<br />
& - adresni operator<br />
* - operator indirekcije<br />
te specijalni tip varijabli koje se nazivaju pokazivači ili pointeri.<br />
Adresni operator & se koristi kao unarni operator tako da se zapisuje ispred imena varijable. Takofvi izraz<br />
daje vrijednost jednaku adresi varijable:<br />
int main()<br />
{<br />
int y;<br />
y = 777;<br />
printf("\n Vrijednost varijable je %d", y);<br />
printf("\n Adresa varijable je %#p", &y);<br />
return 0;<br />
}<br />
Ispis is programa može izgledati ovako:<br />
Vrijednost varijable y je 777<br />
Adresa varijable y je 0x0063FDF4<br />
Operator indirekcije * daje vrijednost koja se nalazi na nekoj adresi<br />
ako je y jednako 777<br />
onda je *(&y) također jednako 777<br />
<strong>4.</strong>15
Pokazivači<br />
Varijable kojima je vrijednost adresa neke druge varijable ili funkcije nazivaju se pokazivači ili pointeri. Pokazivači<br />
moraju biti deklarirani, jer C kompajler mora znati kakovi će tip podatka biti na adresi koju oni sadrže, ili kako se češće<br />
kaže, mora biti poznat tip objekta na kojeg oni pokazuju.<br />
int *p; /* p je pokazivač na objekt tipa int */<br />
unsigned *q; /* q je pokazivač na objekt tipa unsigned */<br />
Pokazivače prije upotrebe treba inicijalizirati, odnosno mora im se pridjeliti vrijednost adrese postojećeg<br />
memorijskog objekta. Pri tome, tip pokazivača mora biti jednak tipu memorijskog objekta. To se ostvaruje<br />
adresnim operatorom '&'.<br />
int suma; /* deklaracija varijable suma */<br />
int *p; /* deklaracija pokazivača na objekt tipa int */<br />
sum = 777; /* inicijaliziranje varijable suma */<br />
p = &suma; /* p inicijaliziran na adresu varijable suma */<br />
Ako bi dalje koristili naredbi<br />
printf ("%d", suma);<br />
printf ("%d", *p);<br />
dobili bi isti ispis, jer se indirekcijom pokazivača dobiva vrijednost na koju on pokazuje, a to je vrijednost varijable<br />
suma (*p ⇔*&suma).<br />
<strong>4.</strong>16
U skladu s ovakovom simbolikom prije opisane operacije se mogu predstaviti slijedećom slikom:<br />
Slika <strong>4.</strong><strong>4.</strong> Prikaz operacija s pokazivačem na varijablu<br />
Operacija<br />
int suma;<br />
int *p;<br />
suma = 777;<br />
Stanje<br />
suma p<br />
? ?<br />
suma p<br />
777 ?<br />
p = &suma;<br />
suma p<br />
777<br />
memorijska<br />
adresa<br />
0x09A8<br />
0x09AC<br />
0x09B0<br />
......<br />
......<br />
......<br />
0x1000<br />
0x1004<br />
sadržaj<br />
memorije<br />
......<br />
777<br />
......<br />
......<br />
......<br />
......<br />
0x09AC<br />
......<br />
ime<br />
varijable<br />
......<br />
suma<br />
......<br />
......<br />
......<br />
......<br />
p<br />
......<br />
Slika <strong>4.</strong>3. Prikaz memorijskog sadržaja i adresa varijabki i pokazivača<br />
<strong>4.</strong>17
Važna osobina indirekcije pokazivača je da se može koristiti u svim izrazima u kojima se koriste i obične varijable.<br />
Primjerice, ekvivalentne su naredbe<br />
p = &suma;<br />
*p = 678; je isto suma = 678;<br />
U slučaju kada se pokazivač koristi samo za bilježenje adresa i kad nije predviđeno da se koristi u izrazima on se može<br />
deklarirati posebnom oznakom tipa<br />
void *p;<br />
što znači da je deklariran pokazivač koji pokazuje na “bilo što”, ili da je deklariran “netipski” pokazivač.<br />
Koristiti se i naziv nul pokazivač za pokazivače kojima je vrijednost jednaka nuli.<br />
Upamti: Imena označavaju fiksni položaj u memorija i često se za njih kaže da predstavljaju referencu memorijskog<br />
objekta ili referencu. U skladu s ovim nazivom, kada se ispred pokazivača primijeni operator indirekcije, kaže se da je<br />
to dereferencirani pokazivač.<br />
Rad s pokazivačima predstavlja važan element programiranja C jezikom. Slučajevi kada se oni koriste i zašto se koriste<br />
biti će objašnjeni tek kada se upoznaju ostali temeljni elementi programiranja C jezikom.<br />
<strong>4.</strong>18
<strong>4.</strong>7 Unos podataka u memoriju računala<br />
Postoje razni načini unosa podataka: pomoću tipkovnice, pomoću miša, očitanjem sadržaja datoteka koje su spremljene<br />
na optičkim i magnetskim medijima ili iz mrežnih resursa. Sada ćemo upoznati funkciju C jezika imena scanf koja<br />
omogućuje da se dobave podaci koje korisnik programa unosi pomoću tipkovnice.<br />
Najčešći oblik korištenja scanf funkcije je:<br />
scanf(format_unosa, lista_adresnih_izraza);<br />
gdje:<br />
format_unosa je literalni string u kojem se zadaju specifikatori tipa objekta čija se vrijednost unosi. Oni su gotovo<br />
identični specifikatorima ispisa kod printf().<br />
lista_adresnih_izraza je niz izraza odvojenih zarezom, čija vrijednost predstavlja adresu postojećeg memorijskog<br />
objekta. Tip objekta mora odgovarati specifikaciji tipa prethodno zapisanog u formatu_unosa.<br />
<strong>4.</strong>19
Jednostavni programi u kojima ćemo koristiti funkciju scanf imat će slijedeći oblik:<br />
/* scanf1.c – obrazac unosa podataka pomoću scanf*/<br />
#include <br />
int main(void)<br />
{<br />
/* 1. definiraj varijablu čija vrijednost se unosi*/<br />
int unos;<br />
/* 2. ispiši poruku korisniku: */<br />
printf("Molim otipkajte jedan cijeli broj >");<br />
/* 3. Pozovi funkciju scan s agumentom: adresa varijabe */<br />
scanf("%d", &unos);<br />
/* <strong>4.</strong> obavi radnje s tom varijablom ......*/<br />
/* 5. ispiši rezultat obrada*/<br />
printf("\nOtkucali ste broj %d.\n", unos);<br />
}<br />
return 0;<br />
Kada pokrene ovaj program, na monitoru se ispisuje poruka:<br />
c:> Molim otipkajte jedan cijeli broj >_<br />
i program čeka da korisnik otkuca jedan broj. Unos završava kada korisnik pritisne tipku . Primjerice, ako<br />
korisnik otipka 12345, program će završiti s porukom:<br />
Otkucali ste broj 12345.<br />
<strong>4.</strong>20
Obično se u format_unosa ne upisuje nikakovi dodatni tekst, kao što je to bio slučaj kod printf funkcije, iako je to<br />
dozvoljeno. Primjerice, ako bi koristili naredbu<br />
scanf("Broj=%d", &unos);<br />
i ako korisnik želi unijeti brijednost 25, onda bi on morao otipkati “Broj=25”. Ako bi otkucao samo broj<br />
25, funkcija scanf() ne bi dala ispravan rezultat.<br />
Pomoću scanf funkcije može se odjednom unijeti više vrijednosti, primjerice unos jednog cijelog broja, jednog realnog<br />
broja i jednog znaka, može se ostvariti samo s jednim pozivom funkcije scanf;<br />
int i;<br />
double x;<br />
char c;<br />
....<br />
scanf("%d%f %c", &i, &x, &c);<br />
Pri unosu cjelih i realnih brojeva, scanf funkcija podrazumjeva da unos pojedinog broja završava tzv. “bijelim”<br />
znakovima (razmak, tab, nova linija). Svi bijeli znakovi uneseni ispred broja se odbacuju. To nije slučaj kada se unosi<br />
znak, jer i bijeli znakovi predstavljaju znak. Stoga se pri unosu znaka treba eksplicitno u formatu zapisa zadati razmak<br />
od prethodnog unosa.<br />
Navedeni problemi su razlogom da programeri rijetko koriste scanf funkciju za komuniciranje s korisnikom. Kasnije<br />
ćemo pokazati da je za unos znakova pogodnije koristiti neke druge funkcije. Također, pokazat ćemo kako<br />
dijagnosticirati da li je izvršen unos koji odgovara zadanom tipu varijable.<br />
<strong>4.</strong>21
<strong>4.</strong>8 Inicijalizacija varijabli<br />
Temeljni uvjet korištenja neke varijable je da ona prethodno mora biti deklarirana. Samom deklaracijom nije određeno<br />
kakova će biti početna (inicijalna) vrijednost varijable.<br />
int main()<br />
{<br />
int y, x; /* deklaracija varijabli x i y */<br />
x = 77; /* početna vrijednost varijable x */<br />
y = x + 7; /* početna vrijednost varijable y */<br />
...<br />
Kada ne bi bila određena vrijednost od x, program bi se kompajlirao bez dojave pogreške, ali tada bi pri izvršenju<br />
programa bila neodređena vrijednost varijable y.<br />
U C jeziku se početna vrijednost varijable može odrediti i u samoj deklaraciji. Primjerice, prethodni program se može<br />
napisati u obliku:<br />
int main()<br />
{<br />
int y, x = 77; /* deklaracija varijabli x i y */<br />
/* i inicijalizacija x na vrijednost 77 */<br />
y = x + 7; /* početna vrijednost varijable y */<br />
Zapamti: Inicijalizacija varijable je deklaracija u kojoj se određuje početna vrijednost varijable.<br />
<strong>4.</strong>22