FUNKCIJE U C PROGRAMSKOM JEZIKU
Programski jezik C poznaje samo jednu vrstu potprograma koje se nazivaju funkcijama.
Primere iz funkcija možete naći na sledećoj web strani: Funkcije u C/C++ jeziku -primeri
- Deklaracija funkcija
- Definisanje funkcija
- Pozivanje funkcija
Deklaracija funkcija
povratni_tip ime_funkcije(tip_argumenta1 argument1, tip_argumenta2 argument2, ...);
// Deklaracija funkcije koja računa zbir dva broja
int zbir(int a, int b);
int main() {
printf("Zbir je: %d\n", rezultat); // Ispis rezultata na ekran
return 0; // Kraj programa
// Definicija funkcije zbir koja vraća zbir dva broja
int zbir(int a, int b) {
Definisanje funkcija
- Naredbe funkcije
- zaglavlje funkcije
- telo funkcije
Prva, u ovom slučaju int, predstavlja tip podatka povratne vrednosti. Ova metoda koja računa veći broj između dva cela broja, vraća taj broj čiji je tip int. To je tip povratne vrednosti.
Druga, predstavlja naziv metode, koji programer bira sam i koji treba da sugeriše svrhu metode.
Telo metode se predstavlja vitičastim zagradama. U telu se nalaze naredbe funkcije.
U zaglavlju funkcije(metode) se, posle naziva, unutar običnih zagrada pišu parametri(argumenti) funkcije. To su podaci koje treba dostaviti funkciji da bi ona mogla da završi postavljen zadatak. U prethodnom primeru zadatak koji funkcija treba da izvrši je određivanje maksimuma između dva cela broja, a podaci koje funkciji preko parametra treba dostaviti su ta dva broja, u ovom slučaju označena kao a i b. Na sledećoj slici je prikazana detaljnije ova metoda.
Ukoliko metoda ne vraća vrednost, neće imati u telu naredbu return podatak, ali može imati samo return. kao tip povratne vrednosti se u tom slučaju piše reč void.
U programu mora postojati najmanje jedna funkcija i to je funkcija main(glavna). Primer main funkcije iz prethodnog primera prikazana je na slici ispod.
Pozivanje funkcija
Jedina funkcija koja se automatski pozove prilikom startovanja aplikacije je main
funkcija.
Naredbe u main
se izvršavaju redom, odozdo na dole, i kada se završi poslednja naredba, program se završava. Ako u projektu imamo definisano još funkcija, one se neće izvršiti same od sebe. Da bi program iz main
nastavio izvršenje u nekoj drugoj funkciji, jedna od naredbi u main
mora biti poziv te funkcije.
U primeru na slici 3 poziva se funkcija max
:
printf("Veći broj je %d\n", max(A, B));
Deklaracija poziva funkcije, u opštem slučaju, izgleda:
naziv_funkcije(parametar1, parametar2, ...);
Parametri koji se prosleđuju funkciji se kopiraju redom u parametre definisane u funkciji (vidi sliku 2). U definiciji funkcije, ispred naziva parametra stavlja se tip podatka.
int max(int a, int b)
Ovde se zapravo rezerviše nova memorija označena sa a
i b
, koja prima kopije vrednosti parametara iz poziva funkcije:
max(A, B);
U pozivu se ispred parametra ne stavlja tip podatka. Kopiranje parametra je prikazano na slici 5.
Primer: Odeđivanje maksimuma dva broja-rešenje u jeziku c
Učitati dva cela broja i odrediti njihov maksimum koristeći prethodno definisanu funkciju.
Prosleđivanje parametra po vrednosti i po referenci
Ovo možemo ilustrovati kroz sledeći primer:
Primer 2: Zamena vrednosti podatku
Napravimo funkciju koja će promeniti vrednost poslatom podatku:
// Deklaracija funkcije koja menja vrednost lokalno
void promeni_vr(int x);
int main() {
int broj = 20;
printf("Početna vrednost: %d\n", broj);
// Poziv funkcije koja menja vrednost lokalno
promeni_vr(broj);
printf("Nakon promene u main: %d\n", broj);
return 0; // Završetak programa
// Definicija funkcije koja menja vrednost lokalno
void promeni_vr(int x) {
x = 200;
printf("Vrednost unutar funkcije: %d\n", x);
Ova vrednost se jeste promenila unutar funkcije promeni_vr, ali se ova promena ne odražava na podatke u glavnoj funkciji.
Da bi ovo bilo ispravno, parametri se moraju preneti po pokazivaču.
Prenos parametara funkcije po pokazivaču
Više o pokazivačima vidi u lekciji Pokazivači u jeziku C.
Prethodni primer sada izgleda kao na slici 10:
Primeri funkcija sa različitim tipovima povratnih vrednosti i argumentima
Primer:
void pozdrav() {
int main() {
return 0;
Objašnjenje:
- Funkcija pozdrav nema povratnu vrednost jer koristi povratni tip void.
- Izvodi samo jednu akciju - ispisuje poruku.
2. Funkcija sa povratnom vrednošću tipa int
Kod:
int zbir(int a, int b) {
int main() {
printf("Zbir je: %d\n", rezultat);
return 0;
Funkcija zbir uzima dva argumenta (a i b) i vraća njihov zbir kao rezultat.
3. Funkcija sa povratnom vrednošću tipa double
Kod:
double povrsinaKruga(double r) {
int main() {
double povrsina = povrsinaKruga(r);
printf("Površina kruga je: %.2lf\n", povrsina);
return 0;
4. Funkcija sa povratnom vrednošću tipa string
void pozdravPoruka(char ime[], char rezultat[]) {
int main() {
char rezultat[50]; // Prostor za rezultat
pozdravPoruka(ime, rezultat);
printf("%s\n", rezultat);
return 0;
- Funkcija pozdravPoruka prihvata tekstualni argument i vraća personalizovanu poruku.
Rekurzivne funkcije
Rekurzivne funkcije su funkcije koje pozivaju same sebe, direktno ili indirektno. Ovaj pristup omogućava rešavanje problema koji se prirodno mogu podeliti na manje podprobleme.
Za detaljnije objašnjenje i praktične primere, posetite našu stranicu: Rekurzivni algoritmi.
Naprednije funkcije
1. Funkcija koja vraća pokazivač
#include <stdio.h>
#include <stdlib.h>
int* kreirajNiz(int n) {
if (niz == NULL) {
return NULL;
for (int i = 0; i < n; i++) {
return niz;
int main() {
int* niz = kreirajNiz(n);
if (niz != NULL) {
for (int i = 0; i < n; i++) {
printf("\n");
free(niz); // Oslobađanje memorije
return 0;
- Funkcija kreirajNiz dinamički alocira niz i vraća pokazivač na prvi element.
- main funkcija koristi ovaj pokazivač da bi pristupila i ispisala vrednosti u nizu.
- Nakon korišćenja, memorija se oslobađa pomoću free(niz).
2. Korišćenje funkcijskih pokazivača
// Deklaracija funkcije koja sabira dva broja
int saberi(int a, int b) {
// Funkcija koja oduzima dva broja
int oduzmi(int a, int b) {
// Funkcija koja prima pokazivač na funkciju
int obradi(int x, int y, int (*operacija)(int, int)) {
int main() {
printf("Sabiranje: %d\n", obradi(a, b, saberi));
printf("Oduzimanje: %d\n", obradi(a, b, oduzmi));
return 0;
- Definisane su dve funkcije: saberi i oduzmi.
- obradi funkcija prima pokazivač na funkciju kao argument i poziva odgovarajuću operaciju.
- U main funkciji se poziva obradi sa različitim operacijama.
3. Funkcija koja sortira niz pomoću pokazivača na funkciju
// Funkcija za poređenje rastućeg reda
int rastuce(int a, int b) {
// Funkcija za poređenje opadajućeg reda
int opadajuce(int a, int b) {
// Implementacija bubble sort algoritma sa pokazivačem na funkciju
void bubbleSort(int arr[], int n, int (*compare)(int, int)) {
arr[j] = arr[j + 1];
arr[j + 1] = temp;
// Ispis niza
void prikaziNiz(int arr[], int n) {
printf("\n");
int main() {
int n = sizeof(niz) / sizeof(niz[0]);
printf("Originalni niz: ");
prikaziNiz(niz, n);
bubbleSort(niz, n, rastuce);
printf("Sortiran rastuće: ");
prikaziNiz(niz, n);
bubbleSort(niz, n, opadajuce);
printf("Sortiran opadajuće: ");
prikaziNiz(niz, n);
return 0;
- bubbleSort funkcija prima pokazivač na funkciju compare, što omogućava menjanje kriterijuma sortiranja bez menjanja koda sortiranja.
- U main funkciji se niz sortira prvo rastuće, a zatim opadajuće.
Primeri sa funkcijama i njihova memorijska organizacija
1. Osnovni primer funkcije sa objašnjenjem memorijske organizacije
Pogledaćemo kako se podaci prenose u memoriji.
// Funkcija koja prima dva cela broja i vraća njihov zbir
int saberi(int a, int b) {
return rezultat; // Povratna vrednost se skladišti u registar (ili stek u zavisnosti od arhitekture)
int main() {
int zbir = saberi(x, y); // Poziv funkcije - argumenti se stavljaju na stek ili u registre
printf("Zbir: %d\n", zbir);
return 0;
Šta se dešava u memoriji prilikom poziva saberi(x, y)?
Alokacija memorije na steku
- x i y su promenljive u main funkciji i čuvaju se na steku.
- Kada se pozove saberi(x, y), vrednosti x i y se stavljaju na stek ili prosleđuju putem registara (zavisi od kompajlera).
Izvršavanje funkcije
- Funkcija saberi dobija kopije vrednosti x i y.
- Nova promenljiva rezultat se kreira na steku i dodeljuje joj se zbir a + b.
Vraćanje rezultata
- Povratna vrednost funkcije se skladišti u posebnom registru procesora (npr. EAX u x86 arhitekturi) ili na steku.
- Nakon povratka iz funkcije, zbir u main funkciji dobija ovu vrednost.
Čišćenje steka
- Memorija zauzeta parametrima i promenljivom rezultat se oslobađa kada funkcija završi.
2. Funkcija sa pokazivačima i promene u memoriji
// Funkcija koja menja vrednosti preko pokazivača
void zameni(int* a, int* b) {
*a = *b; // Menja vrednost na adresi a
*b = temp; // Menja vrednost na adresi b
int main() {
printf("Pre zamene: x = %d, y = %d\n", x, y);
zameni(&x, &y); // Prosleđujemo adrese promenljivih
printf("Posle zamene: x = %d, y = %d\n", x, y);
return 0;
Šta se dešava u memoriji prilikom zameni(&x, &y)
?
Alokacija memorije na steku
x
i y
su promenljive smeštene na steku main
funkcije.
Kada pozovemo zameni(&x, &y)
, u stek funkcije zameni
se smeštaju pokazivači na x
i y
.
Manipulacija podacima kroz pokazivače
*a
pokazuje na vrednost x
, a *b
na y
.
Zamena se odvija direktno u memoriji, tako da se x
i y
u main
funkciji menjaju.
Povratak iz funkcije
Po završetku zameni
, memorija zauzeta parametrima i temp
promenljivom se oslobađa.
Pošto su vrednosti x
i y
promenjene na originalnim adresama, rezultat je trajna promena.
3. Funkcija sa dinamičkom alokacijom memorije
#include <stdlib.h>
// Funkcija koja kreira dinamički niz i vraća pokazivač na njega
int* kreirajNiz(int n) {
if (niz == NULL) {
return NULL;
for (int i = 0; i < n; i++) {
return niz; // Vraćamo pokazivač na prvi element
int main() {
int* niz = kreirajNiz(n);
if (niz != NULL) {
for (int i = 0; i < n; i++) {
printf("\n");
free(niz); // Oslobađanje memorije
return 0;
Šta se dešava u memoriji?
Poziv kreirajNiz(5)
- Alocira se memorija na HEAP-u za
n
celih brojeva. - Pokazivač
niz
ukreirajNiz
pokazuje na početak tog bloka memorije.
Vraćanje pokazivača
- Pokazivač
niz
se prenosi nazad umain
, gde se koristi za ispis vrednosti.
Oslobađanje memorije (free(niz)
)
- Memorija na HEAP-u ostaje zauzeta sve dok eksplicitno ne pozovemo
free(niz)
. - Bez
free
, imali bismo curenje memorije (memory leak).
Povezivanje sa srodnim temama
Da biste stekli dublje razumevanje funkcija u C jeziku, preporučujemo da pogledate sledeće srodne teme:
- Pokazivači u C jeziku – Osnovni koncepti pokazivača, njihova uloga u funkcijama i rad sa dinamičkom memorijom.
- Dinamički nizovi u C – Objašnjenje alokacije i dealokacije memorije pomoću
malloc
,free
i drugih funkcija. - Rekurzija u C – Kako funkcije mogu pozivati same sebe i kada je rekurzija korisna.
- Nizovi u C jeziku – Prolazak nizova kroz funkcije i razlike između prolaza vrednošću i referencom.
Ove teme su usko povezane sa funkcijama i omogućavaju bolje razumevanje kako funkcije upravljaju podacima i memorijom u C jeziku.