Prvi primer
Pogledajte primer:
#include
void main (void);
void main ()
{
printf ( «Prost primer u C-u.»);
}
Ovaj program poziva standardnu C-ovsku funkciju PRINTF. Deklaracija funkcije printf se nalazi u fajlu STDIO.H (što je skraćenica od STANDARD INPUT OUTPUT). Direktivom #include, uključujemo odgovarajući heder fajl: u suštini, to je običan tekstualni fajl i pomoću direktive inklud, praktično, sadržaj celog heder fajla, u ovom slučaju stdio.h, ubacujete u vaš program. Kompajler će pronaći deklaraciju za funkciju PRINTF unutar heder fajla i zato je u programu ne deklarišemo eksplicitno. Znači, bibliotečke funkcije se deklarišu implicitno, navođenjem odgovarajućih heder fajlova pomoću direktive inklud.
Prvi primer - komentar
Već smo rekli da u C programu mora da postoji jedna funkcija MAIN. Funkciju MAIN, kao i svaku drugu, treba deklarisati. S obzirom, da u navedenom primeru funkcija MAIN ne vraća ništa, ispred MAIN-a stoji ključna reč VOID (oznaka da ne postoji povratna vrednost). Funkcija MAIN, dalje, nema ni jedan parametar, pa je lista parametara prazna.
Pojedini autori, verovatno sa razlogom, smatraju da nema opravdanja za korišćenje procedura unutar nekog koda (odnosno, programa) sa argumentacijom (obrazloženjem) da ako deo koda ništa ne izračunava ili ne prenosi izlazni status drugim programima, onda nema ni potrebe za pisanjem takvih delova koda. Takvi autori čak insistiraju da i relativno bezazleni delovi koda treba da imaju povratnu vrednost, čak iako se nigde neće koristiti. Ova preporuka predstavlja lepu i korisnu programersku praksu i uvek treba da vam bude navika da pišete funkcije, a ne procedure.
Izlazni status
#include
int main (void);
int main ()
{
int status;
printf ( «Prost primer u C-u.»);
return ( status=0 );
}
Komentar prethodnog primera
Koja je razlika u odnosu na primer sa slike 1: funkcija MAIN ima povratnu vrednost i to tipa INTIDŽER. Funkcija MAIN i dalje nema ni jedan argument. Deklarisali smo jednu lokalnu promenljivu IZ_STATUS pomoću koje zadajemo izlazni status.
Uveli smo dve novine: prva je ta da funkcija MAIN ima povratnu vrednost, a druga je deklaracija promenljive za izlazni status unutar bloka za MAIN. Svaka promenljiva koja je deklarisana unutar bloka, to jest, unutar one dve velike zagrade, se naziva lokalna promenljiva, u smislu da je vidljiva samo unutar bloka u kom je definisana. Ako imate funkciju X i unutar nje definisanu lokalnu promenljivu Y, onda važi da samo unutar funkcije X je vidljiva promenljiva Y i nigde drugde. Precizno je reći da lokalne promenljive zadržavaju svoju vrednost samo unutar bloka u kome su definisane.
Tipovi promenljivih
Najčešće korišćeni tipovi promenljivih su karakter, integer, long, float i double. Koliko je dužina pojedinog tipa? To zavisi od hardverske platforme i najčešće je tip karakter dugačak jedan bajt (char), tip integer dva bajta (int), tip long četiri bajta. Karakter služi za rad sa ASCII vrednostima ili stringovima, integer i long služe za rad sa celim brojevima, dok float i double služe za rad sa brojevima u pokretnom zarezu, odnosno sa realnim brojevima: float je za manju preciznost, a double za veću preciznost. Prva tri tipa char, int i long mogu se dalje deliti na sign (znak) i unsign (nemaju znak). SIGN promenljive uzimaju u obzir i pozitivne i negativne vrednosti dok UNSIGN uzimaju u obzir samo pozitivne vrednosti: u C-u je podrazumevana vrednost SIGN. Ako deklarišemo neku promenljivu kao integer, to je isto kao da ste je deklarisali kao SIGN integer, a to je od -32KB do 32KB. Ukoliko ste promenljivo eksplicitno naveli UNSIGN INT onda su njene vrednosti u opsegu od 0KB do 64KB-a.
Nizovi
Nizovi su specijalni tipovi promenljivih i to su izvedeni tipovi promenljivih iz već postojećih: služe nam za rad sa većim brojem promenljivih istog tipa. Recimo,
int aaa [100];
char cc [20];
float fff [10];
Uzmimo za primer niz aaa: taj niz se sastoji od 100 memorijskih lokacija, a svaka je tipa integer; prema tome niz aaa zauzima 200 bajta u memoriji računara. Dalje, cc je niz od 20 memorijskih lokacija tipa karaktera, i on, ukupno, zauzima 20 bajta. Niz fff je niz od 10 lokacija tipa float svaka i on, ukupno, zauzima 40 bajta. Za deklaraciju nizova koristimo srednje zagrade unutar kojih je upisan broj koji označava koliko promenljivih zadanog tipa ima u nizu. Drugačije rečeno, definišemo dužinu niza.
String
String je niz karaktera terminiran null karakterom (odnosno, nulom). Sve funkcije koje rade sa stringovima očekuju da se na kraju stringa nalazi nula. Zamislite jedan primer: da treba da iskopiramo jedan string u drugi. Funkcija koja to treba da izvrši ne zna unapred kolika je dužina stringova, nego kopira string sve dok ne dođe do karaktera nula. Ako ne bi postojala nula na kraju, funkcija bi kopirala podatke koji ne pripadaju tom stringu i velika je verovatnoća da biste prebrisali neke, tuđe, podatke i izazvali nepravilno izvršavanje programa.
Pointeri
Pointer je specijalan tip promenljive koji ukazuje na drugu promenljivu, tj. sadrži adresu druge promenljive. Operator & predstavlja adresu promenljive ispred koje se primenjuje. Operator * predstavlja sadržaj memorijske lokacije ispred koje se primenjuje. VAŽNO: da bi vam pointerska aritmetika pravilno radila, pointerske promenljive moraju biti eksplicitno deklarisane da ukazuju na odgovarajući tip promenljive. Česta je greška kod početnika da ne inicijalizuju pointerske promenljive. Neinicijalizovan pointer je čest izvor greške u programu.
Pointeri – primer
Pogledajmo primer:
int aaa [100]; /* niz */
int * p_aaa; /* pointer na int */
void xx ( void );
void xx ()
{
p_aaa = aaa; /* isto kao i p = & aaa[0]; */
for ( i=0;i<100;i++ )
{
*p_aaa = i;
p_aaa++;
}
}
Promenljiva p_aaa je pointer. Simbol zvezda (*) nam kaže da je promenljiva pointerskog tipa, a int ispred nje da pointuje na promenljivu koja je tipa integer. Red u kome piše p = aaa je inicijalizacija pointera i to je isto kao kada bismo napisali da je p_aaa = & aaa[0] i aaa[0] predstavlja adresu prvog člana iz niza. Inicijalizovan pointer znači da je njegova vrednost jednaka adresi promenljive kojoj želimo da pristupimo. Želimo da u niz upišemo vrednosti od 0 do 99: član niza sa indeksom i da ima vrednost i. To je u primeru realizovano petljom for.
Pointerska aritmetika
Uočite red: p_aaa++. U tom redu se inkrementira vrednost pointerske promenljive, da bi pokazivala na sledeću vrednost. Zapamtite: pointerska promenljiva se uvećava za onoliko kolika je dužina tipa promenljive na koju ukazuje.
Strukture
Struktura je jedan tip podataka u C-u i on služi da više promenljivih različitog tipa, ali povezanih u neku logičku celinu, definišemo kao jednu promenljivu .
struct
{
char ime [20];
char prezime [20];
char pol;
int godine;
.....
} L_PODACI;
Struktura se deklariše preko ključne reči STRUCT i na kraju se definiše ime za tip te strukture. Ovde se još uvek ne definiše sama promenljiva nego se definiše samo tip strukture. Ovako napisan kod ne zauzima kod u memoriji, jer je to tek naznaka da može da se deklariše promenljiva ovog tipa koja će zauzeti prostor u memoriji. U strukturi koja se zove L_PODACI nalazi se niz od 20 karaktera za ime, niz od 20 karaktera za prezime, jedan bajt koji određuje pol i integer koji određuje godine.
Članovi strukture
Pojedinim članovima strukture pristupamo direktno pomoću operatora koji se zove tačka.
l_podaci.ime, l_podaci.prezime, l_podaci.pol
Strukture i pointeri
Mnogo je jednostavnije i efikasnije pristupati strukturama preko pointera. U ovom slučaju pristup članovima strukture je pomoću operatora arrow (strelica: ->).
ll->ime, ll->prezime