{ C } Naučite C
// Programski jezik C

Nauči C od nule.

Step-by-step vodič s primjerima koji zapravo rade. Svaka linija koda je objašnjena — nema preskakanja, nema pretpostavki.

11 lekcija
Za početnike
Detaljno objašnjene petlje i naredbe
// lekcija 01

Tvoj prvi program

Svaki programer počinje s istim programom — ispisom teksta na ekran. Ovaj mali program uključuje gotovo sve što svaki C program mora imati. Razumijevanje ove strukture je temelj svega što slijedi.

C
#include <stdio.h>

int main() {
    printf("Zdravo, svijete!\n");
    return 0;
}
Objašnjenje — linija po linija
Linija 1
#include <stdio.h> — "include" znači uvezi biblioteku. stdio.h je standardna biblioteka za ulaz i izlaz (Standard Input/Output). Bez nje ne možemo koristiti printf. Znak # označava preprocessor direktivu — instrukciju koja se obradi prije kompajliranja.
Linija 3
int main() — svaki C program mora imati funkciju main. To je točka ulaska — odakle program počinje s izvođenjem. Riječ int znači da funkcija vraća cijeli broj (integer). Zagrade () su tu jer je main funkcija, a vitičaste zagrade { } označavaju blok koda koji pripada toj funkciji.
Linija 4
printf("Zdravo, svijete!\n")print formatted, funkcija za ispis teksta. Tekst mora biti u navodnicima. Znak \n je escape sequence za novi red — bez njega cursor ostaje na istoj liniji. Na kraju obavezno točka-zarez ; — svaka naredba u C-u završava točkom-zarezom.
Linija 5
return 0; — vraća vrijednost 0 operativnom sustavu. Po konvenciji, 0 znači uspjeh, bilo koji drugi broj znači grešku. Ovo govori OS-u da je program završio normalno.
Escape sekvence koje se često koriste:
\n — novi red  |  \t — tab  |  \\ — obrnuta kosa crta  |  \" — navodnik unutar stringa
// lekcija 02

Varijable i tipovi podataka

Varijabla je imenovana memorijska lokacija u kojoj čuvaš podatak. Svaka varijabla ima tip koji određuje koliko memorije zauzima i kakav podatak može sadržavati. C je strongly typed jezik — tip moraš navesti unaprijed i ne možeš ga promijeniti.

Tip Veličina Raspon vrijednosti Primjer
int4 bajta−2,147,483,648 do 2,147,483,64742, −7, 1000
float4 bajta~7 decimala preciznosti3.14, −1.5
double8 bajta~15 decimala preciznosti3.14159265358
char1 bajtjedan znak'A', 'z', '5'
long8 bajtaveći raspon od int9000000000
C
#include <stdio.h>

int main() {
    int godine = 20;
    float visina = 1.85;
    double pi = 3.14159265358979;
    char slovo = 'A';

    printf("Imam %d godina.\n", godine);
    printf("Visok sam %.2f metara.\n", visina);
    printf("Pi je otprilike %.10f\n", pi);
    printf("Prvo slovo: %c\n", slovo);

    return 0;
}
Objašnjenje — linija po linija
Linija 4
int godine = 20; — deklariramo varijablu tipa int s imenom godine i odmah joj dodjeljujemo vrijednost 20. Operator = je operator dodjele (ne provjera jednakosti!).
Linija 5
float visina = 1.85; — decimalni broj s jednostrukom preciznošću. Za svakodnevnu upotrebu float je dovoljno precizan.
Linija 6
double pi = 3.14159... — decimalni broj s dvostrukom preciznošću (duplo više memorije od float, duplo više decimala). Koristiti kada preciznost je važna.
Linija 7
char slovo = 'A'; — jedan znak. Pišemo u jednostrukim navodnicima (za razliku od stringa koji ide u dvostruke). Interno, char je cijeli broj (ASCII vrijednost znaka).
Linije 9–12
Format specifikatori u printf: %d — cijeli broj (int)  |  %f — decimalni broj  |  %.2f — decimalni s 2 decimale  |  %c — znak  |  %s — string  |  %ld — long int
Konvencija za imenovanje: koristi snake_case (mala slova, podvlaka između riječi): broj_studenata, ukupna_suma. Imena ne smiju početi brojem niti sadržavati razmake.
// lekcija 03

Operatori

Operatori su simboli koji govore kompajleru da izvrši određenu operaciju nad varijablama ili vrijednostima. C ima aritmetičke, relacijske, logičke i assignment operatore.

+
Zbrajanje
a + b
-
Oduzimanje
a - b
*
Množenje
a * b
/
Dijeljenje
a / b
%
Ostatak (modulo)
10 % 3 = 1
++
Inkrement
a++ (a = a+1)
--
Dekrement
a-- (a = a-1)
==
Jednako
a == b
!=
Nije jednako
a != b
>
Veće od
a > b
&&
Logičko I
a && b
||
Logičko ILI
a || b
C
#include <stdio.h>

int main() {
    int a = 10, b = 3;

    printf("%d + %d = %d\n", a, b, a + b);
    printf("%d - %d = %d\n", a, b, a - b);
    printf("%d * %d = %d\n", a, b, a * b);
    printf("%d / %d = %d\n", a, b, a / b);
    printf("%d %% %d = %d\n", a, b, a % b);

    // Inkrement i dekrement
    int x = 5;
    x++;
    printf("Nakon x++: %d\n", x);
    x--;
    printf("Nakon x--: %d\n", x);

    return 0;
}
Objašnjenje
Linija 4
int a = 10, b = 3; — možemo deklarirati više varijabli istog tipa u jednoj liniji, razdvojene zarezom.
Linija 9
a / b kada se dva cijela broja dijele, rezultat je cijeli broj (bez decimala). 10 / 3 = 3, ne 3.33. Ovo se zove integer division. Da bi dobio decimale, jedan od njih mora biti float: (float)a / b.
Linija 10
a % bmodulo operator vraća ostatak pri dijeljenju. 10 % 3 = 1 jer 10 = 3×3 + 1. Korisno za provjeru parnosti (broj % 2 == 0 = parni broj). U printf, %% ispisuje literal znak %.
Linija 14
x++post-inkrement: povećava vrijednost za 1. Ekvivalentno s x = x + 1 ili x += 1. Razlika između x++ (post) i ++x (pre) je vidljiva samo kada se koriste unutar izraza.
Česta greška: = je dodjela, == je usporedba. Pisanje if (a = 5) umjesto if (a == 5) neće dati grešku kompajliranja, ali program će raditi pogrešno.
// lekcija 04

Uvjetni iskazi — if / else

Uvjetni iskazi omogućuju programu da donosi odluke. Ovisno o tome je li neki uvjet istinit ili lažan, program izvodi različite blokove koda. U C-u, 0 je lažno, sve ostalo je istinito.

C
#include <stdio.h>

int main() {
    int rezultat = 75;

    if (rezultat >= 90) {
        printf("Odlican (5)\n");
    } else if (rezultat >= 75) {
        printf("Vrlo dobar (4)\n");
    } else if (rezultat >= 60) {
        printf("Dobar (3)\n");
    } else if (rezultat >= 50) {
        printf("Dovoljan (2)\n");
    } else {
        printf("Nedovoljan (1)\n");
    }

    // Kraći zapis za jednostavne uvjete
    int broj = 7;
    if (broj % 2 == 0) {
        printf("%d je paran broj.\n", broj);
    } else {
        printf("%d je neparan broj.\n", broj);
    }

    return 0;
}
Objašnjenje
Linije 6–16
if-else if-else lanac — C provjerava uvjete redom od gore prema dolje. Čim naiđe na prvi istinit uvjet, izvede taj blok i preskoči sve ostale. Zadnji else nema uvjet i hvata sve što nije ispunilo prethodne uvjete (fallback). Nije obavezan, ali je dobra praksa.
Linija 6
if (rezultat >= 90) — uvjet u zagradama mora biti izraz koji daje istinu (true) ili laž (false). Operatori usporedbe: == jednako, != nije jednako, > veće, < manje, >= veće ili jednako, <= manje ili jednako.
Linije 20–24
Provjera parnosti: broj % 2 == 0 — ako je ostatak pri dijeljenju s 2 jednak nuli, broj je paran. Kombiniramo dva operatora: % (modulo) i == (usporedba).
C — logički operatori
#include <stdio.h>

int main() {
    int dob = 22;
    int ima_vozacku = 1;  // 1 = true, 0 = false

    // && = I (oba uvjeta moraju biti istinita)
    if (dob >= 18 && ima_vozacku) {
        printf("Moze voziti.\n");
    }

    // || = ILI (barem jedan uvjet mora biti istinit)
    int je_vikend = 0;
    int je_praznik = 1;
    if (je_vikend || je_praznik) {
        printf("Ne radi se!\n");
    }

    // ! = negacija (obrće istinu/laž)
    int je_zatvoren = 0;
    if (!je_zatvoren) {
        printf("Dućan je otvoren.\n");
    }

    return 0;
}
Logički operatori
&& (AND)
Oba uvjeta moraju biti istinita da bi cijeli izraz bio istinit. dob >= 18 && ima_vozacku — istinito samo ako je osoba punoljetna I ima vozačku.
|| (OR)
Barem jedan uvjet mora biti istinit. Istinito ako je vikend ili praznik (ili oboje).
! (NOT)
Negacija — obrće vrijednost. !je_zatvoren znači "nije zatvoren", tj. otvoren je. !0 je istinito, !1 je lažno.
// lekcija 05

for petlja

Petlja je mehanizam koji omogućuje ponavljanje bloka koda više puta. Bez petlji, za ispis 100 redova morali bismo pisati 100 linija koda. S petljom, to je 3 linije. for petlja se koristi kada unaprijed znamo koliko puta nešto treba ponoviti.

1
Inicijalizacija — izvodi se jednom na početku. Npr. int i = 0
2
Uvjet — provjerava se prije svakog ponavljanja. Ako je lažan, petlja staje. Npr. i < 10
3
Tijelo petlje — blok koda koji se izvodi ako je uvjet istinit
4
Korak (inkrement) — izvodi se nakon svakog tijela petlje. Npr. i++ — pa nazad na korak 2
C — osnovni for
#include <stdio.h>

int main() {
    // Ispis brojeva od 1 do 5
    for (int i = 1; i <= 5; i++) {
        printf("Broj: %d\n", i);
    }

    printf("---\n");

    // Zbrajanje od 1 do 100
    int suma = 0;
    for (int i = 1; i <= 100; i++) {
        suma += i;
    }
    printf("Suma 1 do 100 = %d\n", suma);

    return 0;
}
Objašnjenje — detaljno
Linija 5
for (int i = 1; i <= 5; i++) — tri dijela odvojena točka-zarezom:
1. dio: int i = 1 — stvaramo varijablu i (brojač) i postavljamo je na 1. Izvodi se jednom.
2. dio: i <= 5 — uvjet koji se provjerava prije svakog ponavljanja. Dok je i manje ili jednako 5, petlja nastavlja.
3. dio: i++ — povećaj i za 1 nakon svakog prolaska kroz tijelo. Ovo osigurava da petlja jednom završi.
Linija 6
Tijelo petlje — sve unutar { }. Pri prvom prolasku i = 1, pa ispiše "Broj: 1". Zatim i++i = 2, provjeri uvjet (2 <= 5, istinito), ispiše "Broj: 2"... i tako dalje do i = 6 kada uvjet postaje lažan i petlja staje.
Linija 14
suma += icompound assignment operator. Ekvivalentno s suma = suma + i. Nakon svakog prolaska, dodajemo trenutnu vrijednost i na ukupnu sumu. Gauss je dokazao da je suma od 1 do 100 uvijek 5050 — provjeri!
C — napredni for
#include <stdio.h>

int main() {
    // Odbrojavanje (korak -1)
    printf("Odbrojavanje:\n");
    for (int i = 5; i >= 1; i--) {
        printf("%d...\n", i);
    }
    printf("Start!\n\n");

    // Korak od 2 (samo parni)
    printf("Parni od 2 do 10:\n");
    for (int i = 2; i <= 10; i += 2) {
        printf("%d ", i);
    }
    printf("\n\n");

    // Ugniježđene petlje (množenje tablica)
    printf("Tablica množenja (1-5):\n");
    for (int i = 1; i <= 5; i++) {
        for (int j = 1; j <= 5; j++) {
            printf("%4d", i * j);
        }
        printf("\n");
    }

    return 0;
}
Napredne tehnike
Linija 6
i-- kao korak — petlja ide unazad. Počinje od 5, smanjuje za 1 svaki put, staje kad i postane manji od 1. Uvjet sad gleda >= umjesto <=.
Linija 13
i += 2 — korak nije morao biti 1. Ovdje se i povećava za 2 svaki put pa prolazimo samo kroz parne vrijednosti. Može biti i i += 5, i *= 2 ili bilo što.
Linije 20–25
Ugniježđene petlje — petlja unutar petlje. Vanjska petlja kontrolira redak (i), unutarnja kontrolira stupac (j). Za svaki i, unutarnja petlja prođe sve vrijednosti j. Ukupno izvođenja: 5 × 5 = 25 puta. %4d — ispiši broj u polju širine 4 znaka (za poravnanje stupaca).
break i continue:
break — odmah izlazi iz petlje, prekida sve ponavljanje.
continue — preskače ostatak trenutnog prolaska i ide na sljedeći.
Primjer: if (i == 3) continue; — preskoči ispis broja 3, nastavi s 4.
// lekcija 06

while petlja

while petlja se koristi kada ne znamo unaprijed koliko puta treba nešto ponoviti — samo znamo uvjet pod kojim petlja treba nastaviti. Tipičan primjer: čekaj korisnički unos dok ne unese ispravnu vrijednost, čitaj datoteku dok ne dođeš do kraja, igraj igru dok igrač ima živote.

1
Provjeri uvjet — na samom početku. Ako je lažan od starta, tijelo se ne izvrši ni jednom.
2
Izvedi tijelo — blok koda unutar vitičastih zagrada
3
Vrati se na korak 1 — provjeri uvjet opet. Ponavljaj dok je uvjet istinit.
C — while petlja
#include <stdio.h>

int main() {
    // Dijeli broj s 2 dok ne postane manji od 1
    int broj = 100;
    printf("Pocetni broj: %d\n", broj);

    while (broj >= 1) {
        printf("%d -> ", broj);
        broj = broj / 2;
    }
    printf("kraj\n\n");

    // Digitalna suma broja (zbroj znamenki)
    int n = 12345;
    int suma = 0;
    printf("Znamenke broja %d:\n", n);

    while (n > 0) {
        int znamenka = n % 10;  // izvuci zadnju znamenku
        suma += znamenka;
        printf("  Znamenka: %d (suma: %d)\n", znamenka, suma);
        n = n / 10;             // ukloni zadnju znamenku
    }
    printf("Suma znamenki: %d\n", suma);

    return 0;
}
Objašnjenje — korak po korak
Linija 8
while (broj >= 1) — provjeri uvjet. Ako je broj veći ili jednak 1, uđi u petlju. Važno: varijabla broj mora biti deklarirana izvan petlje, jer se mijenja unutar nje i provjerava u uvjetu.
Linija 10
broj = broj / 2 — ovo je korak koji mijenja stanje. Bez ovoga, broj se nikad ne bi promijenio i dobili bismo beskonačnu petlju koja nikad ne završava. Uvijek se pitaj: "Što mijenjam unutar petlje da bi uvjet jednom postao lažan?"
Linija 20
int znamenka = n % 10 — trik za izvlačenje zadnje znamenke broja. 12345 % 10 = 5 (ostatak pri dijeljenju s 10).
Linija 22
n = n / 10 — integer division briše zadnju znamenku. 12345 / 10 = 1234 (nema decimala). Sljedeći krug: 1234 % 10 = 4, i tako dalje dok n ne postane 0.

do-while je varijanta gdje se tijelo izvodi barem jednom — bez obzira na uvjet. Provjera dolazi tek na kraju prvog prolaska.

C — do-while
#include <stdio.h>

int main() {
    int broj;
    int pokusaj = 0;

    // Simulacija unosa - korisnik mora unijeti pozitivan broj
    // (ovdje hardkodiramo -5 kao "korisnički unos" za demo)
    do {
        broj = -5;   // zamišljamo da korisnik ovo unosi
        pokusaj++;
        printf("Pokusaj %d: unesen broj %d\n", pokusaj, broj);

        if (pokusaj >= 3) break;  // za demo, izađi nakon 3 pokušaja

    } while (broj <= 0);

    printf("Petlja izvrsena %d put(a).\n", pokusaj);

    return 0;
}
do-while vs while
Linija 9
do { — tijelo petlje odmah počinje, bez provjere uvjeta. Garantira da se unutrašnjost izvrši barem jednom. Korisno za menije, validaciju unosa, i situacije gdje moraš nešto napraviti pa onda odlučiti treba li ponoviti.
Linija 16
} while (broj <= 0); — uvjet se provjerava nakon tijela. Obrati pažnju na točku-zarez na kraju — jedina petlja u C-u koja zahtijeva ; iza zatvorene zagrade.
Kada koristiti koje?
for — znaš točan broj ponavljanja (prolaz kroz niz, petlja N puta)
while — ne znaš broj ponavljanja, provjera je na početku
do-while — tijelo mora izvesti barem jednom, provjera na kraju
// lekcija 07

Funkcije

Funkcija je imenovan blok koda koji radi određenu zadaću. Umjesto da isti kod pišeš na 10 mjesta, napišeš ga jednom kao funkciju i pozoveš je gdje god trebaš. Dobar program je skup malih, jasnih funkcija — svaka odgovorna za jedno i samo jedno.

C
#include <stdio.h>

// Definicija funkcije koja prima dva broja i vraća njihov zbroj
int zbroji(int a, int b) {
    return a + b;
}

// Funkcija bez povratne vrijednosti (void)
void ispisi_liniju(int duljina) {
    for (int i = 0; i < duljina; i++) {
        printf("-");
    }
    printf("\n");
}

// Funkcija koja računa faktorijel rekurzivno
int faktorijel(int n) {
    if (n <= 1) return 1;
    return n * faktorijel(n - 1);
}

int main() {
    int x = 8, y = 3;
    printf("%d + %d = %d\n", x, y, zbroji(x, y));

    ispisi_liniju(20);

    printf("5! = %d\n", faktorijel(5));
    printf("7! = %d\n", faktorijel(7));

    return 0;
}
Objašnjenje
Linija 4
int zbroji(int a, int b) — anatomija funkcije:
int = povratni tip (što funkcija vraća)
zbroji = ime funkcije
(int a, int b) = parametri (ulazni podaci, s tipovima)
Linija 5
return a + b; — izračunaj a + b i vrati rezultat pozivaču. return odmah završava funkciju. Povratna vrijednost mora odgovarati deklariranom tipu (int).
Linija 9
void ispisi_liniju(int duljina)void znači da funkcija ne vraća nikakvu vrijednost. Koristi se za funkcije koje samo "rade nešto" (ispisuju, mijenjaju podatke) bez rezultata.
Linije 17–19
Rekurzija — funkcija koja poziva samu sebe. faktorijel(5) = 5 * faktorijel(4) = 5 * 4 * faktorijel(3)... sve dok ne dođe do faktorijel(1) koji vraća 1 (bazni slučaj). Svaka rekurzija mora imati bazni slučaj koji zaustavi pozivanje!
// lekcija 08

Nizovi (Arrays)

Niz je kolekcija varijabli istog tipa smještena uzastopno u memoriji. Umjesto 5 zasebnih varijabli ocjena1, ocjena2, ..., imaš jedan niz ocjene[5]. Svi elementi su dostupni putem indeksa koji počinje od 0.

C
#include <stdio.h>

int main() {
    // Deklaracija i inicijalizacija
    int ocjene[5] = {4, 3, 5, 4, 5};

    // Ispis svakog elementa
    for (int i = 0; i < 5; i++) {
        printf("Ocjena %d: %d\n", i + 1, ocjene[i]);
    }

    // Pronalazak maximalne ocjene
    int max = ocjene[0];
    for (int i = 1; i < 5; i++) {
        if (ocjene[i] > max) {
            max = ocjene[i];
        }
    }
    printf("Maksimalna ocjena: %d\n", max);

    // Izračun prosjeka
    int suma = 0;
    for (int i = 0; i < 5; i++) {
        suma += ocjene[i];
    }
    printf("Prosjek: %.1f\n", (float)suma / 5);

    return 0;
}
Objašnjenje
Linija 5
int ocjene[5] = {4, 3, 5, 4, 5};
int = tip elemenata, [5] = veličina niza (broj elemenata), {...} = inicijalne vrijednosti. Elementi su: ocjene[0]=4, ocjene[1]=3, ocjene[2]=5... Indeks počinje od 0! Zadnji element je ocjene[4], ne ocjene[5].
Linija 9
ocjene[i] — pristup elementu na poziciji i. For petlja s i od 0 do 4 prolazi kroz sve elemente redom. Ovo je standardan obrazac za prolaz kroz niz.
Linije 13–18
Nalaženje maksimuma — klasičan algoritam: pretpostavi da je prvi element maximum (max = ocjene[0]), zatim prođi kroz ostale. Svaki put kada nađeš nešto veće od trenutnog max, ažuriraj max.
Linija 26
(float)suma / 5cast pretvara suma iz int u float prije dijeljenja, tako da dobijemo decimalni rezultat. Bez toga, 21 / 5 = 4 (integer division), ne 4.2.
// lekcija 09

Stringovi

U C-u ne postoji poseban tip za tekst — string je zapravo niz znakova (char array) koji završava specijalnim znakom '\0' (null terminator). To je jedini način da funkcije znaju gdje string završava.

C
#include <stdio.h>
#include <string.h>

int main() {
    char ime[50] = "Ana";
    char prezime[50] = "Kovac";
    char puno_ime[100];

    // Spajanje stringova
    strcpy(puno_ime, ime);     // kopiraj "Ana" u puno_ime
    strcat(puno_ime, " ");     // dodaj razmak
    strcat(puno_ime, prezime); // dodaj "Kovac"

    printf("Ime: %s\n", puno_ime);
    printf("Duljina: %zu znaka\n", strlen(puno_ime));

    // Usporedba stringova
    char lozinka[20] = "tajno123";
    char unos[20] = "tajno123";

    if (strcmp(lozinka, unos) == 0) {
        printf("Lozinka tocna!\n");
    } else {
        printf("Pogresna lozinka.\n");
    }

    return 0;
}
Objašnjenje
Linija 2
#include <string.h> — biblioteka s funkcijama za rad sa stringovima. Bez nje ne možemo koristiti strcpy, strcat, strlen, strcmp.
Linija 5
char ime[50] = "Ana"; — niz od 50 znakova. String "Ana" zauzima samo 4 mjesta: 'A', 'n', 'a', '\0'. Ostatak niza je slobodan. Veličina mora biti dovoljno velika za sadržaj + null terminator.
Linija 10
strcpy(odrediste, izvor) — kopira string iz izvora u odredište. Ne možeš koristiti = za kopiranje stringova (to bi kopiralo pointer, ne sadržaj). Uvijek koristi strcpy.
Linije 11–12
strcat(odrediste, dodatak) — concatenate, dodaje string na kraj drugog stringa. Modifikacija je in-place — niz puno_ime se direktno mijenja.
Linija 21
strcmp(s1, s2) — uspoređuje dva stringa. Vraća 0 ako su jednaki, negativan broj ako je s1 "manji", pozitivan ako je s1 "veći" (leksikografski). Nikad ne koristi == za usporedbu stringova — to uspoređuje adrese, ne sadržaj!
// lekcija 10

Pokazivači (Pointers)

Pokazivač je varijabla koja čuva memorijsku adresu neke druge varijable, umjesto same vrijednosti. Ovo je tema koja zbunjuje mnoge početnike — ali je temelj C-a. Operativni sustavi, driveri i sve visoko-performantne strukture podataka ovise o pokazivačima.

42
0x7ffd1234
int broj
0x7ffd1234
0x7ffd5678
int *ptr

Varijabla ptr čuva adresu varijable broj, ne njenu vrijednost.

C
#include <stdio.h>

int main() {
    int broj = 42;
    int *ptr = &broj;  // ptr cuva adresu varijable broj

    printf("Vrijednost broja:      %d\n", broj);
    printf("Adresa broja:          %p\n", (void*)&broj);
    printf("Vrijednost ptr-a:      %p\n", (void*)ptr);
    printf("Dereferenciranje ptr:  %d\n", *ptr);

    // Promjena vrijednosti PUTEM pokazivaca
    *ptr = 100;
    printf("\nNakon *ptr = 100:\n");
    printf("broj = %d\n", broj);  // ispisuje 100!

    return 0;
}
Objašnjenje — dva ključna operatora
Linija 5
int *ptr = &broj;
& = address-of operator — daj mi adresu varijable broj
int * = tip "pokazivač na int" — zvjezdica je dio tipa
ptr sada sadrži memorijsku adresu gdje živi varijabla broj
Linija 10
*ptr = dereferenciranje — "idi na adresu koju ptr čuva i pročitaj vrijednost tamo". Zvjezdica ovdje znači nešto drugo nego pri deklaraciji — pri deklaraciji definira tip, pri korištenju pristupa vrijednosti na adresi.
Linija 13
*ptr = 100piši 100 na adresu gdje ptr pokazuje. Budući da ptr pokazuje na broj, ovo mijenja broj. Linija 15 ispisuje 100 iako smo mijenjali putem pokazivača, ne direktno.
NULL pointer: Uvijek inicijaliziraj pokazivač koji ne pokazuje ništa na NULL: int *ptr = NULL;. Dereferenciranje NULL pokazivača uzrokuje crash programa (Segmentation fault). Provjeri: if (ptr != NULL) { ... }
// lekcija 11

Čitanje unosa — scanf

Do sada su svi naši programi imali unaprijed zadane podatke u kodu. U stvarnosti, program mora čitati unos od korisnika. Funkcija scanf čita podatke s tipkovnice — i upravo tu se po prvi put direktno susrećemo s pokazivačima u praksi.

C
#include <stdio.h>

int main() {
    int a, b;

    printf("Unesi prvi broj: ");
    scanf("%d", &a);

    printf("Unesi drugi broj: ");
    scanf("%d", &b);

    printf("\nZbroj: %d\n", a + b);
    printf("Razlika: %d\n", a - b);
    printf("Produkt: %d\n", a * b);

    if (b != 0) {
        printf("Kolicnik: %.2f\n", (float)a / b);
    } else {
        printf("Dijeljenje s nulom nije moguce.\n");
    }

    return 0;
}
Objašnjenje
Linija 7
scanf("%d", &a) — čita cijeli broj s tipkovnice i sprema ga u varijablu a. Zašto & (ampersand)? Zato što scanf mora znati gdje u memoriji da spremi podatak. Dajemo mu adresu varijable a putem &a. Bez & program se ruši!
Linije 16–20
Provjera dijeljenja s nulom — uvijek provjeri da dijelilac nije nula prije dijeljenja. if (b != 0) je sigurnosna provjera. Dijeljenje s nulom je undefined behavior u C-u i može srušiti program ili dati nepredvidiv rezultat.
C — mini kalkulator
#include <stdio.h>

int main() {
    float a, b;
    char operacija;

    printf("=== Mini kalkulator ===\n");
    printf("Unesi racun (npr. 5 + 3): ");
    scanf("%f %c %f", &a, &operacija, &b);

    printf("%.2f %c %.2f = ", a, operacija, b);

    switch (operacija) {
        case '+': printf("%.2f\n", a + b); break;
        case '-': printf("%.2f\n", a - b); break;
        case '*': printf("%.2f\n", a * b); break;
        case '/':
            if (b != 0) printf("%.2f\n", a / b);
            else printf("Greska: dijeljenje s nulom\n");
            break;
        default:
            printf("Nepoznata operacija.\n");
    }

    return 0;
}
switch iskaz
Linija 9
scanf("%f %c %f", &a, &operacija, &b) — čita tri vrijednosti odjednom: float, char i float. Format stringa definira što se očekuje. Razmaci u formatu preskaču whitespace u unosu.
Linije 13–23
switch — elegantnija alternativa dugom if-else if lancu kada uspoređujemo jednu varijablu s više mogućih vrijednosti. Svaki case je jedna mogućnost, break izlazi iz switch bloka, default hvata sve ostalo (kao else).
Čestitamo — prošao si sve lekcije!
Sada znaš: varijable, tipove, operatore, uvjete, petlje (for/while/do-while), funkcije, nizove, stringove, pokazivače i unos s tipkovnice. To su temelji C-a — sve ostalo (strukture, dinamička alokacija, datoteke) gradi se na ovome.