Mint láttuk, a C programok több, külön fordítható modulból épülhetnek fel. Jogosan merül fel a kérdés, hogy az egyik modulban definiált tárolási egységre tudunk-e hivatkozni egy másik modulból, másrészt kíváncsiak lehetünk arra is, hogy milyen a program egyes részeinek hierarchiája, "elrejthetünk-e" változókat más modulok elõl, stb. Ahhoz, hogy ezekre a kérdésekre válaszolni tudjunk, tovább kell boncolgatnunk a C programok szerkezetét. Említettük, hogy a modulokban vannak kódgeneráló egységek, a függvények. Minden függvény törzse egy blokkból áll, amelyen belül újabb blokkokat alakíthatunk ki. (A blokk más elnevezése: összetett utasítás). A blokkszerkezet tehát a modulszerkezettel ellentétben hierarchikus, hiszen minden blokknak lehet alblokkja, és minden alblokk alá van rendelve az õt magában foglaló blokknak, míg a modulok azonos
hierarchiaszinten vannak, tehát egymás mellé vannak
rendelve. Minden blokk két részre osztható: deklarációkra
és adatdefiníciókra, valamint végrehajtható
utasításokra (ez utóbbiak tartalmazhatják az
alblokkokat). Egy blokk két része közül a deklarációs/definiciós
rész el is maradhat. Mivel blokk belsejében nem lehet függvénydefiníció,
ezért a C nyelvben minden kódgeneráló tárolási
egység azonos hierarchia-szintû (mint a modulok). Természetesen
a függvények között van egy logikai függõségi
rendszer, hiszen a függvények egymást adott szisztéma
szerint hívják (például ha egy fv1
hív egy fv2-t, akkor ritkán fordul elõ, hogy
fv2 is hívja fv1-et). Logikailag mindig van egy
vezetõ függvény, amelyik a program indulásakor
legelsõként kapja meg a vezérlést. A C, illetve
C++ nyelvben ennek a vezetõ függvénynek a neve kötelezõen
a main (lásd a 1.11-es
részt).