Professional Documents
Culture Documents
OR2010 Pred 08
OR2010 Pred 08
OR2010 Pred 08
Memorijske klase
Najvanije svojstvo neke varijable je njen tip
tip.
Meutim, mogue je jo detaljnije definirati karakteristike zadane varijable
pomou svojstva varijabli koje se naziva memorijska klasa.
Strane u skripti:
37 41
57-59
149-156
Aritmetika pokazivaa
173-185
Pokazivai i polja
Jednodimenzionalno polje kao argument
funkcije
Napomena:
Pokazivai i stringovi
Primjeri
Registarske varijable
int f1(int a)
{
auto int b,i;
i=0;
while(i<10)
{
int c;
..
i++;
}
}
Preporuka
P
k kompajleru
k
jl
d
da kkoristi
i ti registre
i t procesora sa pohranjivanje
h ji
j varijabli
ij bli
oynaenih kao registarske.
g
kojij koriste registarske
g
varijable
j
su krai i bri jjer se tedi vrijeme
j
Programi
pristupa memoriji poto varijabla nije smjetena na nekoj lokaciji u memoriji ve u
nekom od registara procesora.
int b,i;
Statike varijable
Koriste se za lokalizaciju podruja djelovanja varijabli
varijabli.
Primjer deklaracije:
static
int
a;
Primjer 9.1
#include <stdio.h>
#include <stdio.h>
void f1()
{
int a=0;
a++;
printf("\na=%d",a);
}
void f1()
{
static int a=0;
a++;
printf("\na=%d",a);
}
void main()
{
f1();
f1();
f1();
}
void main()
{
f1();
f1();
f1();
}
Program e ispisati:
a=1
a=1
a=1
Program e ispisati:
a=1
a=2
a=3
prog.c
j
su zajednike
j
za sve funkcije
j unutar p
programa.
g
Eksterne varijable
Globalne varijable su dostupne samo funkcijama koje se nalaze u
datoteci u kojoj je globlna varijabla deklarirana.
Eksterne varijable su dostupne svim funkcijama u kojima je eksterna
varijabla deklarirana.
#i l d <stdio.h>
#include
di h
int a,b;
int f1(int x){
.
}
void main(){
int c;
.
}
b
c
a
dat2.c
#include <stdio.h>
extern int a;
int d;
(
x){
){
int f2(int
.
}
i t f3 (i
int
(int
t y){
){
.
}
Adresa moe biti adresa na kojoj je zapisana vrijednost neke druge varijable
Takoer,
T k adresa
d
moe
biti i vrijednost
ij d
t adrese
d
na kkojoj
j j jje zapisana
i
ffunkcija.
k ij
U radu s pokazivaima vano je upoznati se sa unarnim operatorima:
&
j s adrese koja
j jje p
pridruena varijabli
j
vraa sadrajj memorije
ispred koje se nalazi operator *.
tip *ime_pok_varijable;
tip
*
Na primjer:
int *p;
deklarira pokaziva p na cjelobrojnu varijablu.
iintt a,b;
b
int *p;
0100000
0100002
0100004
Definicijom
D fi i ij
iinteger
t
varijabli rezerviran je
odgovarajui prostor u
e o j
memoriji.
0100000
0100002
0100004
Definicijom pokazivaa
rezerviran je odreeni
prostor u memoriji (npr. 4
bajta).
0100000
Izrazom:
Sve varijable koje se definiraju kao pokazivake zauzimaju istu koliinu memorije.
p=&a;
pokaziva
k i p sadri
d i adresu
d
varijable
ij bl a.
Naredbom:
b=*p;
vrijednost varijable b e biti jednaka vrijednosti koja je zapisana na lokaciji na
koju pokazuje pokaziva p a to je 24.
0100000
24
0100002
24
void main()
{
int a=30;
f1(& )
f1(&a);
}
0100004
30 50
0100000
Primjer 9.2
(Poreenje prenosa preko vrijednosti i prenosa preko adrese)
#include <stdio.h>
void dodaj2(int c, int d)
{
c c+2;
c=c+2;
d=d+2;
}
void dodaj3(int *p1, int*p2)
{
Program e ispisati:
*p1=*p1+3;
*p2=*p2+3;
Nakon poziva funkcije dodaj2():a=1,b=2
}
Nakon poziva funkcije dodaj3():a=4,b=5
int main()
{
int a=1,b=2;
dodaj2(a,b);
printf("\nNakon poziva funkcije dodaj2():a=%d,b=%d",a,b);
dodaj3(&a,&b);
printf("\nNakon
printf(
\nNakon poziva funkcije dodaj3():a=%d,b=%d",a,b);
dodaj3():a %d,b %d ,a,b);
return 0;
}
Primjer 9.3
ta
e ispisati slijedei program:
glavni program
stog
adrese
povratna adresa
122FF6C a
122FF68
#include <stdio.h>
(
*a,
, int b)
)
int f(int
{
int c;
c=*a+b;
*a *a+5;
*a=*a+5;
b=b+5;
return c;
}
void main()
{
int a=1, b=1,c;
printf("\nPrije
printf(
\nPrije funkcije f:a=%d,
f:a=%d b=%d
b=%d",a,b);
a b);
c=f(&a,b);
printf("\nPoslije funkcije f: a=%d, b=%d c=%d",a,b,c);
}
Odgovor:
Primjer 9.4
Aritmetika pokazivaa
Operatori koji se mogu primijeniti na pokazivae su: + i -
ta e ispisati program:
ta e ispisati program:
#include <stdio.h>
void main()
{
int p[5]={1,2,3,4,5};
int *pp;
pp=p;
printf("%d",*(pp+2));
}
#include <stdio.h>
void main()
{
int p[5]={1,2,3,4,5};
int *pp;
pp=&p[2];
printf("%d",*(pp+1));
}
Odgovor: 3
Odgovor: 4
pc+1
pi+1
pf+1
char
*pc;
int
*pi;
float *pf;
adresa se poveava za vrijednost koja predstavlja broj bajtova koje
zauzima znakovni tip (jedan bajt)
adresa se poveava za vrijednost koja predstavlja broj bajtova koje
j
j tip ((ovisi o implementacijij C-a).
)
zauzima cjelobrojni
adresa se poveava za vrijednost koja predstavlja broj bajtova koje
zauzima realni tip float (etiri bajta)
#include <stdio.h>
int main()
{
char a=3;int
b=3;float c=1.0;
char *pc; int *pi;float *pf;
pc=&a;pi=&b;pf=&c;
printf("\npc=%x",pc);
printf("\npi=%x",pi);
printf("\npf=%x",pf);
printf("\npc+1=%x",pc+1);
printf("\npi+1=%x",pi+1);
printf("\npf+1=%x",pf+1);
printf("\npc+2=%x"
printf(
\npc+2 %x ,pc+2);
pc+2);
printf("\npi+2=%x",pi+2);
printf("\npf+2=%x",pf+2);
getch();
return 0;
int a[5]={1
a[5]={1, 3,
3 5,
5 7
7, 9}
x=a[0];
x=a[1];
x=a[2];
xx=a[3];
a[3];
x=a[4];
x=*p;
x=*(p+1);
x=*(p+2);
xx=*(p+2);
(p+2);
x=*(p+2);
int *p;
1
p=p+1;
postiemo da pokaziva p pokazuje na slijedei element polja a.
p
p
1
9
1
Pokazivai i stringovi
Primjer 9.7
Napisati funkciju koja kao argument uzima neki string a vraa broj znakova od
Primjer:
int
duzina(char
*string)
Naredbama:
p=a;; ili p
p
p=&a[0];
[ ];
pokaziva p se postavlja na prvi element polja a.
p
p+1
p+4
n
Rjeenje:
p+9
j
printf(%c,*(p+1));
ispisat e znak a
printf(%c,*(p+4));
(
, (p ));
p
ispisat
p
e znak s
printf(%c,*(p+9));
ispisat e znak c
Primjer 9.8
Primjer 9.9
Napisati funkciju koja kao argument uzima neki string, te ispisuje taj string na
standardnom izlazu. Funkcija ne vraa nita. Prototip funkcije je:
void
ispis(char
*string)
Napisati funkciju koja kao argument uzima neki string i neki znak c,
c te vraa
vrijednost koja pokazuje koliko se puta znak c pojavljuje u stringu.
Na primjer, ako je string Danas je cetvrtak a znak c=a, funkcija treba vratiti
vrijednost 3.
Prototip funkcije je:
int izbroji (char *string, char c)
Rjeenje:
Rjeenje:
void ispis(char *string)
{
while(*string!='\0')
{
printf("%c",*string);
string++;
}
}