Professional Documents
Culture Documents
p11 Pokazivaci Funkcije
p11 Pokazivaci Funkcije
POKAZIVAČI I FUNKCIJE
int main(){
int x = 1, y = 2;
swap1(x, y);
printf("%d %d\n", x, y);
return 0;
}
SWAP1 - KRIVO
#include <stdio.h>
int main(){
int x = 1, y = 2;
swap1(x, y);
printf("%d %d\n", x, y);
return 0;
}
SWAP1 - KRIVO
#include <stdio.h>
int main(){
int x = 1, y = 2;
swap1(x, y);
printf("%d %d\n", x, y);
return 0;
}
SWAP1 - KRIVO
#include <stdio.h>
int main(){
int x = 1, y = 2;
swap1(x, y);
printf("%d %d\n", x, y);
return 0;
}
SWAP1 - KRIVO
#include <stdio.h>
int main(){
int x = 1, y = 2;
swap1(x, y);
printf("%d %d\n", x, y);
return 0;
}
POKAZIVAČI I MEMORIJA
char *ptr;
Ime Vrijednost Adresa
varijable
ptr ? 0xDABA
POKAZIVAČI I MEMORIJA
char *ptr;
Ime Vrijednost Adresa
char c; varijable
ptr ? 0xDABA
c ? 0xDEE0
POKAZIVAČI I MEMORIJA
char *ptr;
Ime Vrijednost Adresa
char c; varijable
c = ‘9’; ptr ? 0xDABA
c 57 0xDEE0
POKAZIVAČI I MEMORIJA
char *ptr;
Ime Vrijednost Adresa
char c; varijable
c = ‘9’; ptr 0xDEE0 0xDABA
int main(){
int x = 1, y = 2;
swap1(&x, &y);
printf("%d %d\n", x, y);
return 0;
}
POKAZIVAČI – ARGUMENTI FUNKCIJA
void swap1(int* pA, int* pB){ Ime Vrijednost Adresa
... varijable
} x 1 0xAAC0
y 2 0xAAC4
pA 0xAAC0 0xDD00
int main(){
pB 0xAAC4 0xDD04
int x = 1, y = 2;
swap1(&x, &y);
printf("%d %d\n", x, y);
return 0;
}
POKAZIVAČI – ARGUMENTI FUNKCIJA
void swap1(int* pA, int* pB){ Ime Vrijednost Adresa
int t = *pA; varijable
*pA = *pB; x 1 0xAAC0
*pB = t; y 2 0xAAC4
} pA 0xAAC0 0xDD00
pB 0xAAC4 0xDD04
t 1 0xEEEE
int main(){
int x = 1, y = 2;
swap1(&x, &y);
printf("%d %d\n", x, y);
return 0;
}
POKAZIVAČI – ARGUMENTI FUNKCIJA
void swap1(int* pA, int* pB){ Ime Vrijednost Adresa
int t = *pA; varijable
*pA = *pB; x 2 0xAAC0
*pB = t; y 2 0xAAC4
} pA 0xAAC0 0xDD00
pB 0xAAC4 0xDD04
t 1 0xEEEE
int main(){
int x = 1, y = 2;
swap1(&x, &y);
printf("%d %d\n", x, y);
return 0;
}
POKAZIVAČI – ARGUMENTI FUNKCIJA
void swap1(int* pA, int* pB){ Ime Vrijednost Adresa
int t = *pA; varijable
*pA = *pB; x 2 0xAAC0
*pB = t; y 1 0xAAC4
} pA 0xAAC0 0xDD00
pB 0xAAC4 0xDD04
t 1 0xEEEE
int main(){
int x = 1, y = 2;
swap1(&x, &y);
printf("%d %d\n", x, y);
return 0;
}
POKAZIVAČI – ARGUMENTI FUNKCIJA
void swap1(int* pA, int* pB){ Ime Vrijednost Adresa
int t = *pA; varijable
*pA = *pB; x 2 0xAAC0
*pB = t; y 1 0xAAC4
}
int main(){
int x = 1, y = 2;
swap1(&x, &y);
printf("%d %d\n", x, y);
return 0;
}
DEMISTIFICIRANI SCANF
char ch;
int numx;
float numy;
scanf("%c %d %f", &ch, &numx, &numy);
ADRESE I POZIVI FUNKCIJA
x = funk1(&a,b) + funk2(&a,b);
int num = 5;
int *p1num = #
int *p2num = NULL;
p2num = p1num;
*p2num = 7;
printf("%d\n", num);
char c;
char *pc = &c;
printf("%p\n", pc);
pc++;
printf("%p\n", pc);
Element b[3]
• Može mu se pristupiti kao *( bPtr + 3 )
• Može mu se pristupiti i kao bPtr[ 3 ]
– Pokazivač/indeks notacija: bPtr[ 3 ] isto kao i b[ 3 ]
• Budući je ime polja pokazivač, aritmetika pokazivača
može se primijeniti i na samo polje: *( b + 3 )
POKAZIVAČI I POLJA
Ime svakog deklariranog polja jest konst.
pokazivač
return;
}
POLJE KAO ARGUMENT FUNKCIJE
void ucitajPolje(int *p, int n)
int main () { {
int polje[10]; int i;
for(i = 0; i < n; i++)
int n, i; scanf("%d", p+i);
scanf("%d", &n); }
return;
}
POLJE KAO ARGUMENT FUNKCIJE
Postoje 2 načina pisanja prototipa funkcije sa
poljem kao argumentom:
povratna_vrijednost funkcija(tip_polja x[])
Ili koristeći pokazivače:
povratna_vrijednost funkcija(tip_polja *x)
...
...
0x200080FD
...
0x200080FB
0x200080FC
... ... ... 0x20 0x00 0x20 0x00 ...
BIG ENDIAN
• Prvo najznačajniji bajt
• Na kraju najmanje značajni bajt
• BIG ENDIAN
...
...
0x200080FD
...
0x200080FB
0x200080FC
... ... ... 0x20 0x00 0x20 0x00 ...
BIG ENDIAN
• Vrijednost 511 pohranjena BIG ENDIAN
mehanizmom (00 00 01 FF)
...
...
0x200080FD
...
0x200080FB
0x200080FC
... ... ... 0x00 0x00 0x01 0xFF ...
LITTLE ENDIAN
• Prvo najmanje značajni bajt
• Na kraju najznačajniji bajt
• LITTLE ENDIAN
...
...
0x200080FD
...
0x200080FB
0x200080FC
... ... ... 0x20 0x00 0x20 0x00 ...
LITTLE ENDIAN
• Vrijednost 511 pohranjena LITTLE ENDIAN
mehanizmom (00 00 01 FF)
...
...
0x200080FD
...
0x200080FB
0x200080FC
... ... ... 0xFF 0x01 0x00 0x00 ...
REKURZIJA
• Pogodan način za rješavanje nekih problema: svojstvo
algoritma da poziva samog sebe sa promjenjenim
argumentima ≈ indukcija.
• Funkcija mora moći pozvati samu sebe: moguće je ako
programski jezik to dopušta (u C-u su moguće rekurzivne
funkcije).
• Funkciju treba napisati kao rekurzivnu.
• Broj poziva nije neograničen i zavisi od veličine stoga (OS,
prevodioc)
REKURZIJA
void incrementAndPrint(int n)
{
n++;
printf("%d ", n);
int main()
{
incrementAndPrint(5);
return 0;
}
REKURZIJA - PRIMJER
n !=n⋅(n−1)!
0!=1
• Faktorijel od n se dobije tako da se n pomnoži sa faktorijelom
od n-1 (ne moramo ga znati izračunati već možemo ponovo
pozvati funkciju = rekurzija).
• U svakom koraku tj. pozivu funkcije n se smanji za 1 i na kraju
dolazimo do 0 za koju je prema definiciji 0! = 1.
• Vraćamo se unatrag odakle su funkcije pozvane i svaki puta
množimo rezultat sa brojem više
REKURZIJA - PRIMJER
double fakt(int n)
{
double rez = 1; Primjer izračuna faktorijela bez
for(i = 1; i <= n; i++) rekurzije
rez *= i;
return rez;
}
int main()
{
printf("%g\n", fakt(5));
return 0;
}
REKURZIJA - PRIMJER
double fakt(int n)
{
if (n==0)
return 1;
else
return n * fakt(n-1);
}
int main()
{
printf("%g\n", fakt(5));
return 0;
}