C (programski jezik)

Iz Vikipedije, slobodne enciklopedije
Skoči na: navigacija, pretraga

Programski jezik C (čita se: "ce" - C je latinično slovo) je proceduralni programski jezik, nastao 1972. godine. Autor jezika je Denis Riči, a nastao je u istraživačkom centru Bell Laboratories u Nju Džersiju za potrebe operativnog sistema UNIX.

Nastanak[uredi]

Prve verzije operativnog sistema UNIX su bile, zbog neophodne brzine izvršavanja, pisane koristeći asembler, ali se ovaj projekat brzo približavao svom kraju jer je programski kod asemblera izrazito velik i težak za održavanje. Arhitektama UNIX-a je bio potreban programski jezik koji bi zadržao efikasnost asemblera, ali istovremeno pružio i komfor već postojećih viših programskih jezika, poput Paskala, Kobola i dr. Ideja je bila načiniti programski jezik koji bi imao sve ovo, ali čija arhitektura i logika ne bi mnogo odudarala od asemblerske. Zbog toga C-ove kontrolne strukture nalikuju na asemblerske, a postoje i izrazi koji direktno pozivaju odgovarajuće asemblerske instrukcije. Tako, izraz x++ direktno poziva asemblersku instrukciju INC. Jezik je bio potpun uspeh, i koristio se za pisanje svih budućih verzija UNIX-a. U gradnji projekta je učestvovao kao glavni projektant Denis Riči, koji je uostalom bio i jedan od vodećih projektanata za operativni sistem UNIX. Programski jezik С je jezik opšte namene. Iako je razvijan kao „jezik za sistemsko programiranje“, podjednako dobro se koristi za pisanje značajnih programa u različitim oblastima. С je takođe veoma uticao na mnoge druge popularne programe, posebno na C++, koji je originalno razvijan kao nadgradnja С-a.

K&R C[uredi]

Brajan Kernigen (engl. Brian Kernighan) i Denis Riči (engl. Dennis Ritchie) su 1978. objavili prvo izdanje knjige Programski jezik C (engl. The C Programming Language). Ova knjiga, poznata С programerima kao „K&R“, služila je mnogo godina kao neslužbena specifikacija jezika. Verzija С-а koju ona opisuje često se naziva „K&R С“. Drugo izdanje ove knjige pokriva kasniji S89 ANSI C standard. Američki nacionalni institut za standarde (American National Standard Institute (ANSI)) je 1983 formirao komitet, X3J11, da ustanovi standard za С. Standard je ratifikovan 1989 kao ANSI X3.159-1989 „Programming Language C“. Ova verzija С-а se često naziva ANSI C, Standard С, ili ponekad С89. ANSI C standard je sa nekoliko manjih modifikacija 1990. prihvatila „Međunarodna organizacija za standardizaciju“ (ISO)}- kao ISO/IEC 9899:1990. Ova verzija se ponekad naziva С90. Zbog toga se pojmovi „C89“ i „C90“ odnose na suštinski isti jezik.

ANSI C i ISO C[uredi]

Tokom kasnih 70-ih i 80-ih, verzije С-a su implementirane za različite mainframe računare, miniračunare i mikroračunare, uključujući IBM PC, tako da je njegova popularnost značajno porasla. Godine 1999. objavljen je standard ISO/IEC 9899:1999. Ovaj standard se često naziva С99. С99 uvodi nekoliko novih osobina, od kojih su mnoge već bile implementirane u nekoliko kompajlera:

  • inline funkcije
  • nekoliko novih tipova podataka, uključujući long long int, boolean tip podataka, complex tip podataka za predstavljanje kompleksnih brojeva
  • nizove promenljive veličine
  • nove biblioteke funkcija, kao što je snprintf
  • podršku za komentare u jednoj liniji koji počinju sa //
  • poboljšana podrška za IEEE 754 računanje u pokretnom zarezu - izračunavanje realnih brojeva može biti urađeno i sa jednostrukom tačnošću

С je nezavisan od od konkretne arhitekture računarskog sistema. Standard čini sve aspekte prenosivosti eksplicitnim.

Podrška kompajlera[uredi]

GCC i drugi С kompajleri sada imaju podršku za mnoge nove osobine С99 standarda. Ipak, postoji slabija podrška proizvođača kao što su Majkrosoft i Borland koji su se uglavnom koncentrisali na С++, koji obezbeđuje slična funkcionalna poboljšanja.

Uprkos značajnoj podršci za C99, GCC nije potpuno saglasna implementacija standarda; nekoliko ključnih osobina nije implementirano ili ne rade korektno[1].

Prema tvrdnjama kompanije Sun Microsystems, Sun Studio (koji je besplatan za preuzimanje) sada podržava kompletni С99 standard[2].

Otkrivanje (detekcija) verzije[uredi]

Standardni makro __STDC_VERSION__ je definisan sa vrednošću 199901L koja ukazuje da je podržan C99 standard. Kao i __STDC__ makro za C90, __STDC_VERSION__ makro može biti korišćen da se napiše kod koji će se kompajlirati različito za С90 i С99 kompajlere. Primer:

#if __STDC_VERSION__ >= 199901L
  /* "inline" je ključna reč */
#else
# define inline /* ništa */
#endif

Primena[uredi]

Denis Riči je C originalno kreirao i primenio na UNIX operativnom sistemu na DEC-ovom PDP-11. Operativni sistem, C kompajler i svi UNIX-ovi aplikativni programi su napisani na C-u. Jezik se nakon svoje primarne upotrebe proširio na sve sfere programiranja. Proslavivši se svojom brzinom, postao je jezik izbora za mnoge buduće projekte, poput različitih verzija Windows-a i UNIX-a, ali i u aplikativnom programiranju za mnogobrojne aplikacije tokom decenija. I danas se koristi u velikoj meri, prvenstveno za sistemsko programiranje. Još jedna posledica široke prihvaćenosti i efikasnosti C-a je ta da su kompajleri, biblioteke i interpretatori drugih programskih jezika visokog nivoa često napisani na C-u.

Organizacija jezika[uredi]

Organizacione celine C-a su funkcije. Početna tačka izvršavanja programa je tzv. „glavna funkcija“ (engl. main), a celokupan program se organizuje u određeni broj drugih funkcija, u zavisnosti od potrebe. Funkcije se posmatraju kao odvojene, izolovane celine čime se postiže modularnost koda koji je kao takav lak za održavanje i dalje razvijanje.

Svaka funkcija ima svoj imenski prostor i nema direktan pristup promenljivama drugih funkcija. Indirektan pristup promenljivama drugih funkcija je obezbeđen mehanizmom pokazivača i argumenata funkcije.

Telo funkcije je ograničeno vitičastim zagradama, kako bi joj se označili početak i kraj. Unutar funkcija delovi koda mogu biti odvojeni u funkcijske podblokove.

Program se izvršava počev od prve linije koda funkcije main. Ona može pozivati druge funkcije ili samu sebe (vidi rekurzija). Po završetku funkcije main, čitav program se završava i oslobađa iz memorije.

Uz standardni C se distribuiraju i standardne biblioteke. To su datoteke koje sadrže mnoštvo korisnih alata koji se koriste u svakodnevnom radu. Programer može da uključi jednu ili više ovih biblioteka u svoj program, a može i sam da piše biblioteke za svoje potrebe.

C operatori[uredi]

C podržava bogat skup operatora. C ima aritmetičke operatore, operatore poređenja (relacijske), logičke, bitske (operatore za manipulisanje bitovima), operatore dodele, uvećanja i umanjenja za jedan, referenciranja i dereferenciranja, uslovni operator, operator promene tipa (konverzije)...

Operator        Primer          Opis/Značenje  

(typecast)      (double)n       cast(op. konverzije); U ovom primeru konvertuje vrednost n u double
 
()              f()             Poziv funkcije 
 
[]              n[10]           Referenca niza 
 
->              s->x            Pristup određenom članu strukture ili unije 
.               s.x             Pristup određenom članu strukture ili unije

+ [unarni]      +x              Vrednost operanda x 
- [unarni]      -x              Negativna vrednost operanda x  

* [unarni]      *x              Indirekcija ili dereferentni operator
& [unarni]      &x              Operacija adresiranja;Adresa operanda x 

++ [prefiks]    ++x             Vrednost operanda x posle inkrementiranja  
++ [postfiks]   x++             Vrednost operanda x pre inkrementiranja  
-- [prefiks]    --x             Vrednost operanda x posle dekrementiranja
-- [postfiks]   x--             Vrednost operanda x pre dekrementiranja  

sizeof          sizeof (t1)     Veličina operanda u bajtovima objekta tipa t1  
sizeof          sizeof e        Veličina operanda u bajtovima objekta tipa izraza e 
 
+ [binarni]     x + y           x plus y
- [binarni]     x - y           x minus y
* [binarni]     x * y           x puta y
/               x / y           x podeljeno sa y
%               x % y           Ostatak pri deljenju x/y  

>>              x >> y          Pomeranje sadržaja operanda x za u bitova udesno
<<              x << y          Pomeranje sadržaja operanda x za u bitova ulevo

<               x< y            Operator poređenja- manje;1 ako je x< y; 0 inače
>               x> y            Operator poređenja- veće;1 ako je x> y; 0 inače
<=              x<= y           Operator poređenja- manje ili jednako;1 ako je x <= y; 0 inače
>=              x >= y          Operator poređenja- veće ili jednako;1 ako je x >= y; 0 inače
==              x == y          Operator poređenja- jednako;1 ako je x jednako y; 0 inače
!=              x != y          Operator poređenja- različito;1 ako x nije jednako y; 0 inače 

& [bitski]      x & y           Bitsko AND nad bitovima operanada x i y
| [bitski]       y           Bitsko OR nad bitovima operanada x i y
^ [bitski]      x ^ y           Bitsko XOR (ekskluzivno OR) nad bitovima operanada x i y
~               ~x              Komplementiranje svakog bita operanda x 

&&              x && y          Logičko AND nad x i y ( daje vrednost 0 ili 1)
||              | y          Logičko OR operanada x i y (daje vrednost 0 ili 1) 
!               !x              Logičko NOT (logička negacija) operanda x (daje vrednost 0 ili 1)

?:              x ? e1 : e2     Uslovni op.; Izraz e1 ako x nije nula (istinit je); inače izraz e2 

=               x = y           Operator pridruživanja; x, nakon što mu je dodeljen у
+=              x += y          x plus y (dodeljeno operandu x)
-=              x -= y          x minus y (dodeljeno operandu x)
*=              x *= y          x puta y (dodeljeno operandu x)
/=              x /= y          x podeljeno sa y (dodeljeno operandu x)
%=              x %= y          Ostatak pri deljenju x/y (dodeljeno operandu x)
>>=             x >>= y         x, pomeren sadržaj operanda x za у bitova udesno(dodeljeno operandu x)
<<=             x <<= y         x, pomeren sadržaj operanda x za у bitova ulevo(dodeljeno operandu x)
&=              x &= y          x AND y (dodeljeno operandu x)
|=              = y          x OR y (dodeljeno operandu x)
^=              x ^= y          x XOR y (dodeljeno operandu x)
,               e1,e2           e2 (prvo se izračuna e1)

Prioritet i asocijativnost operatora:

Kategorija       Operator                              Asocijativnost
  
Postfiks         () [] -> . ++ --                      sleva nadesno
Unarni           ! ~ ++ -- + - * & (type) sizeof       zdesna nalevo
Aritmetički      * / %                                 sleva nadesno
Aritmetički      + -                                   sleva nadesno
Pomeranja         << >>                                 sleva nadesno
Relacioni        < <= > >=                             sleva nadesno
Jednakosti       == !=                                 sleva nadesno
Bitski           AND  &                                sleva nadesno
Bitski           XOR  ^                                sleva nadesno
Bitski           OR  |                                 sleva nadesno
Logički          AND  &&                               sleva nadesno
Logički          OR  ||                                sleva nadesno
Uslovni          ?:                                    zdesna nalevo
Dodele           = += -= *= /= %= >>= <<= &= ^= |=     zdesna nalevo
Zarez            ,                                     sleva nadesno

Primeri[uredi]

Ovo je najmanji mogući С program.

main()
{
}

Primer koji sledi je kratak Hello World program, napisan na programskom jeziku C. Ovaj primer je postao model za uvodni primer za mnoge programske jezike. On štampa poruku „Zdravo svete“.

#include <stdio.h>
/* uključujemo biblioteku koja nam omogućava
   rad sa tastarurom i ekranom */
 
int main(void) /* započinjemo funkciju main */
{
    printf("Zdravo svete\n");  /* koristeći funkciju printf iz biblioteke
                                stdio.h, štampamo poruku na ekran */
    return 0;                /* program se završava */
}

Svaki С program se sastoji od funkcija i promenljivih. main funkcija je posebna - svaki program mora sadržati ovu funkciju jer se program izvršava od početka main funkcije. Prva linija našeg programa #include <stdio.h> je pretprocesorska direktiva koja govori da treba usvojiti informaciju o standardnoj ulazno-izlaznoj biblioteci. Korišćenjem oznaka /* */ smo ubacili komentare u program. main funkcija poziva printf funkciju iz standardne biblioteke, kojom se ispisuje poruka na ekran. Kako funkcija printf posle završenog ispisa ne prelazi automatski u novi red, prethodni program možemo napisati i na sledeći način:

#include <stdio.h>
int main(void)
{
printf("Dobar ");
printf("dan.");
printf("\n");
return 0;
}

Možemo primetita da kada želimo da pređemo u novi red, koristimo specijalni znak \n. Na kraju, naredbom return 0, main funkcija vraća vrednost nula u pozivni program.

Kontrolne strukture[uredi]

Program se izvršava instrukciju po instrukciju, počevši od prve a završavajući se poslednjom instrukcijom funkcije main. Program se može završiti i ranije, koristeći ključnu reč return ili bibliotečku funkciju exit. Pored imperativnih instrukcija, u programskom jeziku C postoje i instrukcije koje kontrolišu tok programa, tzv. kontrolne strukture. One se dele na grananja i petlje.

Grananje[uredi]

Pošto se program uvek poziva u drugačijem okruženju (drugačije vrednosti promenljivih, drugačiji sistem na kome se program izvršava, momenat izvršavanja i želje korisnika programa), postoji potreba da se u zavisnosti od određenih uslova izvrše različite instrukcije. Operacija grananja predstavlja instrukciju da se pod određenim uslovima izvrši jedan blok instrukcija, pod drugim uslovima drugi itd. Postoje dve načina implementiranja ovakvog ponašanja: koristeći kontrolnu strukturu if...else i koristeći kontrolnu strukturu switch.

if...else na engleskom jeziku znači „ako...u suprotnom“. Sledi primer:

if ( n < 10 ) {
    printf( "n je manje od 10" );
} else {
    printf( "n je veće ili jednako 10" );
}

Ako je n u trenutku izvršavanja bilo manje od 10, biće odštampana samo prva poruka ("n je manje od 10"). U suprotnom, ako je n bilo veće ili jednako 10, biće odštampana samo druga poruka.

switch se najčešće koristi kod višestrukih grananja, tj. u situacijama kada razlikujemo nekoliko uslova pod kojim se izvršavaju različite instrukcije. Sledi primer za ovu kontrolnu strukturu:

switch ( n ) {
    case 1: printf( "n je jednako jedan" );
            break;
    case 2: printf( "n je jednako dva" );
            break;
    default: printf( "n nije jednako ni jedan ni dva" );
}

Petlje[uredi]

Petlje se koriste u situacijama kada je potrebno da se određeni deo koda izvršava više puta. Sastavni delovi petlje su uslov petlje i blok petlje - dok je uslov tačan, blok petlje se ponavlja. Kada zadati uslov postane netačan, ponavljanje se prekida i program nastavlja sa izvršavanjem. Postoje i petlje kod kojih se blok koda ponavlja sve dok je određeni uslov netačan. Kada postane tačan, ponavljanje se prekida. U programskom jeziku C postoje sledeće vrste petlji:

  • while petlja
  • do...while petlja
  • for petlja

Sintaksa while petlje:

while (izraz)
     iskaz;

U ovoj petlji se izračunava izraz. Ako vrednost izraza nije nula, iskaz se izvršava i izraz se ponovo izračunava. Ciklus se nastavlja sve dok izraz ne postane nula, a onda se izlazi iz ciklusa i izvršavanje se nastavlja posle iskaza.

Sintaksa do...while petlje:

do
  iskaz;
while (izraz);

Dok while i for petlje testiraju uslov na početku petlje, pa se može dogoditi da se iskaz ne izvrši nijednom, petlja do...while testira uslov posle prolaska kroz telo petlje, pa se iskaz bar jednom izvršava.

Sintaksa for petlje:

for(izraz1;izraz2;izraz3)
    iskaz;

Tri komponente ove petlje su izrazi. Najčešće su izraz1 i izraz3 pozivi funkcija ili dodeljivanja, a izraz2 je relacioni izraz. Bilo koji od ova tri dela može nedostajati, čak i sva tri. Gornja for petlja je ekvivalentna sa:

izraz1;
while (izraz2){
     iskaz;
     izraz3;
}

Sledi primer beskonačne petlje:

for(;;) {
...
}

Ova petlja može biti prekinuta npr. pomoću naredbi break ili return.

Vrste promenljivih[uredi]

Poseban članak: promenljiva.

U programskom jeziku C, tipovi promenljivih se dele na sledeće:

  • elementarni tipovi
  • nizovi
  • tipovi koje definiše korisnik i
  • pokazivačke promenljive

Elementarni tipovi[uredi]

Elementarni tipovi promenljivih se dele po različitim kriterijumima. Po vrsti podataka koje čuvaju dele se na sledeće:

  • celobrojne (označavaju se ključnom rečju int)
  • znakovne (char)
  • realne (označavaju se ključnim rečima float - realni brojevi u pokretnom zarezu sa jednostrukom tačnošću i double - realni brojevi u pokretnom zarezu sa dvostrukom tačnošću)

Po količini memorije koju zauzimaju, a samim tim i po rasponu vrednosti, dele se na:

  • kratke (označavaju se ključnom rečju short) i
  • duge (long)

Po mogućnosti postojanja negativnih vrednosti, dele se na sledeće:

  • označene (ključna reč signed, koja se ne mora pisati jer se podrazumeva) i
  • neoznačene (ključna reč unsigned)

Ključne reči za označavanje tipova se mogu kombinovati, u zavisnosti od toga kojoj grupi, prema različitim kriterijumima, tip promenljive pripada. signed i unsigned mogu biti pridruženi celobrojnom i znakovnom tipu. Tako, jedna promenljiva x može biti celobrojna po vrsti podataka, duga po veličini memorije i neoznačena po mogućnosti postojanja negativnih vrednosti; u tom slučaju bi se označavala na sledeći način:

unsigned long int x;

Reč int se može izostaviti u deklaracijama ovog tipa. Minimalne i maksimalne vrednosti promenljivih određenog tipa zavise od računara. Zato postoje sistemska zaglavlja <limits.h> i <float.h> i kojima su definisane granične vrednosti.

Nizovi[uredi]

Poseban članak: niz.

Nizovi predstavljaju složene tipove podataka, i baziraju se na ostalim tipovima promenljivih. Nizovi predstavljaju skupine elemenata istog tipa obeležene jednim imenom. Niz u С-u je uvek jednodimenzionalan i, tradicionalno, fiksne, statičke veličine definisane u vreme kompilacije. (noviji С90 standard takođe dopušta formu niza promenljive dužine.) Ipak, korišćenjem malloc funkcije iz standardne biblioteke, moguće je alocirati blok memorije u vreme izvršavanja programa. Za dinamičku alokaciju memorije može se kristiti i funkcija calloc. Memoriju alociranu pomoću ovih funkcija neophodno je osloboditi (dealocirati) pomoću funkcije free. Memorijski prostor se oslobađa čim više nije potreban. Svakom elementu niza se može pristupiti preko njegovog celobrojnog indeksa, odnosno rednog broja u nizu. Indeksi počinju rednim brojem 0. Sledi primer deklaracije i korišćenja niza celih brojeva:

int niz[40]; /* deklarišemo statički niz veličine 40 */
int x;
x = niz[0]; /* promenljivoj x dodeljujemo vrednost prvog elementa niza */

Mogu se kreirati nizovi promenljivih bilo kog tipa, uključujući sve tipove iz nabrojane liste tipova promenljivih, ali svi elementi u jednom nizu moraju biti istog tipa.

Karakterističnost C-a je i njegov odnos prema nizovima i pokazivačima. Nizovi se u C-u implementiraju preko pokazivača. Zapis x[i] može takođe biti korišćen kada je x pokazivač; tada ovaj zapis označava da se pristupa (i+1)-om od nekoliko uzastopnih objekata podataka na koje pokazuje x, gde je objekat na koji pokazuje x (to je x[0]) prvi element niza.

Formalno, x[i] je isto što i *(x+i). Kako je kompajleru u vreme kompajliranja poznat tip pokazivača koji se koristi, adresa na koju pokazuje x+i nije adresa na koju pokazuje x uvećana za i bajtova, već uvećana za i pomnoženo sa veličinom elementa na koji pokazuje. Veličina ovih elemenata može biti određena koristeći operator sizeof.

Sledi zanimljiva demonstracija mogućnosti uzajamne zamene pokazivača i nizova. Četiri dodele su ekvivalentne i svaka predstavlja tačan С kod. Primetimo da poslednja linija sadrži čudan kod koji ima naizgled zamenjen položaj indeksne promenljive i i nizovne promenljive n.

x[i]=1; 
*(x+i)=1;
*(i+x)=1;
i[x]=1; /* čudno, ali tačno: i[x] je ekvivalentno sa *(i+x)*/

Ipak, moramo napraviti razliku između nizovnih i pokazivačkih promenljivih. Iako se ime niza u većini izraza konvertuje u pokazivač (na njegov prvi element), ovaj pokazivač sam po sebi ne zauzima memorijski prostor. Dakle, ne može se promeniti ono na šta niz pokazuje, i nemoguće je dodeliti ga nizu. (Nizovi se ipak mogu kopirati korišćenjem funkcije memcpy, na primer.)

Tipovi koje definiše korisnik[uredi]

Korisnik definiše svoje tipove koristeći ključnu reč struct, i takvi tipovi se nazivaju strukture. Svaka struktura zapravo predstavlja uniju jedne ili više promenljivih čiji tip takođe mora biti jedan od tri nabrojana (elementarni, korisnički ili pokazivački). Strukture imaju sve mogućnosti kao elementarni tipovi, osim mogućnosti korišćenja operatora +, -, *, /, %, &, &&, |, ||, <, >, <<, >>, !, != i ?:, kao ni njihovih derivata +=, -=, ++, --, *=, >>=, itd. Operator dodele (=) je moguć, ali se dodela vrši „bajt po bajt“, što u slučaju dinamičke memorije nije dovoljno. Takođe, strukture uvode i još dva operatora: tačku - operator za pristup pojedinačnim elementima strukture (.) i „strelicu“ - operator za pristup elementima strukture preko pokazivača na strukturu (strelica se zapravo sastoji od znaka minusa i znaka veće - ->).

Strukture, poput elementarnih tipova, mogu biti prosleđivane kao argumenti funkcija, mogu biti mereni pomoću operatora sizeof, biti odredište pokazivača itd. Sledi primer deklaracija i korišćenja strukture koja sadrži godine, pol, stručnu spremu i ime i prezime radnika:

/* definišemo tip Radnik */
struct Radnik {
    short int godine; /* godine se predstavljaju celobrojnom vrednošću, i zbog malog
                         opsega vrednosti ih ograničavamo ključnom rečju short */
    char pol; /* pol može biti muški i ženski, pa ćemo ih obeležavati znakovima ‘m’ i ‘z’ */
    char str_sprema[30], ime_i_prezime[40]; /* stručnu spremu i ime i prezime predstavljamo
                                               nizovima znakovnih promenljivih od po trideset
                                               i četrdeset elemenata, tim redom */
};
 
/* deklarišemo promenljivu r tipa struct Radnik */
struct Radnik r;
 
/* dodeljujemo vrednosti pripadajućim elementima strukture */
r.godine = 44;
r.pol = 'm';
strcpy( r.str_sprema, "Srednja strucna sprema" );
strcpy( r.ime_i_prezime, "Petar Petrovic" );
 
/* ispisujemo podatke o radniku */
printf( "%s \"%s\" ima %d godina, i ima strucnu spremu \"%s\"",
    r.pol=='m'?"Radnik":"Radnica", r.ime_i_prezime, r.godine, r.str_sprema );

Pokazivačke promenljive[uredi]

Poseban članak: pokazivač.

Svaka promenljiva deklarisana u programskom jeziku С ima svoju memorijsku adresu. Tu adresu možemo dobiti pomoću unarnog operatora &. Operator & se odnosi samo na objekte u memoriji - promenljive i elemente polja. Ne može se primeniti na izraze, konstante ili register promenljive. Pokazivačke promenljive predstavljaju specijalan tip promenljivih koje imaju za osnovnu svrhu da čuvaju vrednost adrese drugih promenljivih u programu (tj. pokazivač je promenljiva koja sadrži adresu druge promenljive). Pokazivačke promenljive se dele prema tipu promenljivih čije adrese čuva odnosno na koje pokazuje. Tako, mogu postojati celobrojni pokazivači (odnosno pokazivači na celobrojne promenljive), realni, strukturni itd. Svaki pokazivač mora da pokazuje na određenu vrstu objekta. Izuzetak je „pokazivač na void“. Pokazivači se u programskom jeziku C označavaju znakom zvezdice (*), kako pri deklaraciji, tako i pri pristupu vrednostima na koje pokazuju. Unarni operator * je indirekcija ili dereferentni operator. Kada se primeni na pokazivač, on pristupa objektu na koji pokazivač ukazuje. Sledi primer deklaracije celobrojne vrednosti n, pokazivačke promenljive np koja pokazuje na n i korišćenja:

int n = 2; /* deklaracija celobrojne promenljive n sa vrednošću 2*/
int *np; /* deklaracija pokazivača np koji može da pokazuje samo na celobrojne promenljive */
np = &n; /* dodela adrese promenljive n pokazivaču np */
printf( "%d", *np ); /* štampanje vrednosti promenljive n koristeći pokazivač np */

Upravljanje memorijom[uredi]

Jedna od najbitnijih funkcija programskog jezika je da obezbedi mogućnost rukovanja memorijom i objektima koji su sačuvani u memoriji. С obezbeđuje tri različita načina da se alocira (dodeli, rezerviše) memorija za objekte:

  • Statička alokacija memorije
  • Automatska alokacija memorije
  • Dinamička alokacija memorije

Svaki od ova tri prilaza predstavlja odgovarajuće rešenje u različitim situacijama i ima mnogobrojne primene.

Kada je to moguće, automatska ili statička alokacija su poželjnije jer je upravljanje memorijom ostavljeno kompajleru, što oslobađa programera od mogućnosti da napravi grešku pri alociranju i oslobađanju memorije. Ipak, mnoge strukture podataka se uvećavaju tokom izvršavanja programa, i kako statička alokacija (i automatska alokacija u С89 i С90 standardima) treba da imaju fiksiranu veličinu u vreme kompajliranja, postoje mnoge situacije u kojima je neophodna dinamička alokacija.

Ključne reči[uredi]

Jedan broj reči, tzv. ključne reči, imaju posebno značenje u jeziku i zato se ne mogu koristisi kao identifikatori. Ključne reči prema C90 standardu su:


auto      extern    sizeof
break     float     static
case      for       struct
char      goto      switch
const     if        typedef
continue  int       union
default   long      unsigned
do        register  void
double    return    volatile
else      short     while
enum      signed

Standard C99 je uveo i sledeće ključne reči[3]:


inline    _Bool      _Imaginary
restrict  _Complex

U određenim verzijama jezika postoje i sledeće (nestandardne) ključne reči:


ada       far       near
asm       fortran   pascal
entry     huge

Imena koja počinju sa znakom _ treba izbegavati jer su rezervisana za promenljive i funkcije iz standardne biblioteke.

Biblioteke[uredi]

Programski jezik С koristi biblioteke kao osnovni način proširivanja svoje funkcionalnosti. U С-u, biblioteka je skup funkcija. Svaka biblioteka obično ima zaglavlje (header file), koje sadrži prototipove funkcija, sadržanih u biblioteci, koje može da koristi program, i deklaraciju specijalnih tipova podataka i makroa koje koriste ove funkcije. Da bi program koristio biblioteku, mora da uključi zaglavlje biblioteke, i biblioteka mora biti povezana (linked) sa programom.

Najpoznatija С biblioteka je С standardna biblioteka, koja je određena ISO i ANSI C standardima i uključena je u svaku С implementaciju. Funkcije, tipovi i makroi standardne biblioteke su deklarisani u standardnim zaglavljima:

<assert.h>    <ctype.h>    <errno.h>    <float.h>    <limits.h>    <locale.h>    
<math.h>      <setjmp.h>   <signal.h>   <stdarg.h>   <stddef.h>    <stdio.h>
<stdlib.h>    <string.h>   <time.h>

Nova zaglavlja koja je uključio standard C99 su:

<complex.h>   <fenv.h>     <inttypes.h>
<stdbool.h>   <stdint.h>   <tgmath.h>

Zaglavlju možemo pristupiti pomoću: #include<заглавље>

Još jedan poznat skup С bibliotečnih funkcija je onaj namenjen aplikacijama koje rade pod UNIX-om, posebno funkcija koje obezbeđuju interfejs sa kernelom. Ove funkcije su opisane u različitim standardima kao što su POSIX i Single UNIX Specification.

Kako postoji veliki broj programa napisanih u С-u, postoji veliki broj dostupnih biblioteka. Biblioteke su često napisane na С-u zato što С kompajleri generišu efikasan objektni kod.

Uticaj[uredi]

Sintaksa C-a je imala veliki uticaj na veliki broj programskih jezika koji su nastajali posle njega. Tako, danas postoje sledeći programski jezici koji su, direktno ili indirektno, preuzeli kompletnu sintaksu od C-a:

Često se zbog toga kaže da je C „pobedio“ u programerskom svetu, pri čemu se misli na Paskal, Kobol i druge kako proceduralne tako i neproceduralne programske jezike u vreme njegovog nastanka. Ovakav epitet C duguje svojoj arhitekturi koja omogućava veliku brzinu programa, ali i velikim novinama koje je uveo u svet programiranja što se tiče kratkoće koda (operatori ++, --, vitičaste zagrade za ograničavanje bloka za razliku od Paskalovih ključnih reči BEGIN i END itd.), intenzivne upotrebe pokazivača itd.

Reference[uredi]

  1. ^ „Status of C99 features in GCC“. Free Software Foundation, Inc.. 22. 11. 2007. Приступљено 9. 1. 2008.. 
  2. ^ „Sun Studio 12: C Compiler 5.9 Readme“. Sun Microsystems, Inc.. 31. 5. 2007. Приступљено 9. 1. 2008.. 
  3. ^ Podržane karakteristike C99, sun.com

Literatura[uredi]

Spoljašnje veze[uredi]