Sunteți pe pagina 1din 53

Introducere n C

B. Kernighan, D. Richie-Limbajul C 1. Despre C. Primul program


2. Variabile i expresii aritmetice 3. Instruciunea for 4. Constante simbolice 5. Citirea i scrierea caracterelor 6. Tablouri 7. Funcii 8. Tablouri de caractere 9. Variabile automatice i domenii de vizibilitate

Introducere n C
Despre C
C este un limbaj de programare cu destinaie universal. Este implementat pe majoritatea platformelor de calcul existente azi. Este cel mai popular limbaj de programare pentru scrierea de software de sistem. Este folosit la fel de bine i la scrierea altor programe de importan deosebit n domenii numeroase i diverse. Este apreciat pentru eficiena codului obiect pe care l poate genera i pentru portabilitatea sa. A fost dezvoltat la nceputul anilor 1970 de Ken Thompson i Dennis Ritchie, care aveau nevoie de un limbaj simplu i portabil pentru scrierea nucleului sistemului de operare UNIX.

Introducere n C
Despre C
n anul 1978 s-a publicat prima ediie a crii Limbajul de programare C, avndu-i ca autori pe Brian W. Kernighan i Dennis M. Richie. n 1983, Institutul Naional pentru Standarde din America (the American National Standards Institute ANSI) a nfiinat o comisie care s creeze o definiie lipsit de ambiguiti i independent de main a limbajului C, meninndu-i n acelai timp stilul. Rezultatul este standardul ANSI pentru C. Ediia a 2-a a crii Limbajul de programare C(1988) descrie limbajul C aa cum este definit de standardul ANSI. Aa cum s-a scris i n prefaa primei ediii, limbajul C devine tot mai folositor pe msura ce experiena n lucrul cu acesta crete.

Introducere n C
De ce C ? Argumente n favoarea programrii n C
Limbaj de programare structurat: permite o bun organizare a programelor Complexitatea limbajului este de nivel mediu Permite programarea la un nivel mai sczut dect alte limbaje, mai apropiat de hardware: operaii pe bii, acces direct la memorie Potrivit pentru programarea de sistem Produce un cod obiect eficient: redus ca dimensiune i rapid n execuie

Introducere n C
De ce C ? Principalul dezavantaj
Limbajul nu este foarte strict n ceea ce privete tipurile de date (conversii implicite ntre tipuri) => puine verificri i multe erori nesemnalate.

Concluzii
C este destinat specialitilor din toate domeniile de activitate, interesai nu doar de algoritmi dar i de accesul la sistemul de operare i interfaa hardware. Programarea n C presupune c programatorii tiu ce fac, ceea ce este, desigur, valabil dup o anumit experien.

Introducere n C
Primul program
Un program C, indiferent de mrime, este format din funcii i variabile. O funcie grupeaz instruciuni care precizeaz ce calcule s se efectueze atunci cnd se apeleaz funcia. Variabilele stocheaz valorile folosite n timpul efecturii calculelor. Ele sunt nume simbolice ale unor locaii de memorie. Fiecare program trebuie s conin o funcie principal numit main. Executarea programului C const, de fapt, n execuia instruciunilor acestei funcii. main va apela de obicei alte funcii, unele scrise de programator, altele din bibliotecile care sunt la dispoziie.

Introducere n C
Primul program
#include <stdio.h> main() { se include o bibliotec standard definete funcia main, fr argumente nceputul corpului funciei

printf(salut, lume\n); se apeleaz funcia printf din biblioteca standard pentru a tipri(afia) irul de caractere sfritul corpului funciei }

Introducere n C
Primul program
Programul s-ar putea scrie i astfel: #include <stdio.h> main() { printf(salut, ); printf(lume); printf(\n); } \n este notaia C pentru caracterul rnd nou. \n reprezint un singur caracter; o astfel de notaie se numete secven escape. Alte secvene escape sunt: \t pentru tab, \b pentru backspace, \ pentru ghilimele i \\ pentru backslash.

Introducere n C
Variabile i expresii aritmetice
Program care afieaz un tabel de temperaturi exprimate n grade Fahrenheit (0-300) i grade Celsius, folosind formula: 0C=(5/9)(0F-32). #include<stdio.h> /*afiseaza tab. Fahrenheit-Celsius pt. fahr=0,20,,300*/ main() { int fahr, celsius; int prim, ultim, pas; prim=0; /* limita inferioara a temperaturii */ ultim=300; /* limita superioara */ pas=20; /* marimea pasului */

Introducere n C
Variabile i expresii aritmetice
fahr = prim; while (fahr <= ultim) { celsius = 5 * (fahr-32) / 9; printf(%d\t%d\n, fahr, celsius); fahr = fahr + pas; } } /* .. */ constituie un comentariu. Toate caracterele aflate ntre /* i */ sunt ignorate de compilator. Comentariile pot fi plasate n program oriunde poate fi plasat un spaiu, un tabulator sau un caracter rnd nou.

Introducere n C
Variabile i expresii aritmetice
n C toate variabilele trebuie s fie declarate nainte de a fi folosite; declararea se face de obicei la nceputul funciei, naintea oricror instruciuni executabile. O declaraie enun proprietile variabilelor. Declaraia const dintr-un nume de tip i o list de variabile. int fahr, celsius; int prim, ultim, pas; Tipul int arat c variabilele enumerate sunt de tip ntreg reprezentate n binar. Tipul float desemneaz numere raionale n reprezentarea numit virgul mobil, adic numere ce pot avea i o parte fracionar.

Introducere n C
Variabile i expresii aritmetice
Limbajul C furnizeaz i alte cteva tipuri de date, printre care:

char short long double

caracter un singur octet ntreg scurt ntreg lung numr raional n reprezentare virgul mobil n dubl precizie.

Exist structuri de date: tablouri, structuri i uniuni formate cu componente de aceste tipuri de baz, pointeri ctre acestea i funcii care returneaz valori de aceste tipuri. n program exist cteva instruciuni de atribuire care atribuie variabilelor valori iniiale: ex. prim=0; sau rezultate din calcul. Instruciunile individuale se termin prin ;

Introducere n C
Variabile i expresii aritmetice
Ciclul while produce cte o linie a tabelului la fiecare repetiie. Cnd rezultatul testului devine fals, ciclul ia sfrit. Corpul unei instruciuni while poate consta dintr-una sau mai multe instruciuni cuprinse ntre acolade sau dintr-o singur instruciune fr acolade. Se recomand s se indenteze instruciunile din corpul ciclului. Indentarea i spaierea corespunztoare au o importan major n a face programele lizibile - uor de citit. Se recomand de asemenea, scrierea unei singure instruciuni pe o linie.

Introducere n C
Variabile i expresii aritmetice
n instruciunea de atribuire celsius = 5 * (fahr-32) / 9; dac s-ar fi nmulit cu 5/9, toate temperaturile calculate ar fi fost 0 pentru c, n C, ca i n multe alte limbaje, mprirea ntreag trunchiaz rezultatul (orice parte fracionar este nlturat). printf este o funcie pentru formatarea datelor de ieire, cu dou sau mai multe argumente: printf(%d\t%d\n, fahr, celsius); Fiecare construcie cu % din primul argument numit specificator de format, are corespondent, n ordine, n celelalte argumente. Acetia trebuie s concorde ca numr i tip, altfel se obin rezultate eronate.

Introducere n C
Variabile i expresii aritmetice
Pentru a obine o aliniere la dreapta a celor dou temperaturi, adugm fiecrui %d o anumit dimensiune: printf(%3d %6d\n, fahr, celsius); Pentru a obne rezultate mai precise ar trebui s folosim aritmetica numerelor raionale n reprezentare virgul mobil n locul celei a ntregilor. #include<stdio.h> /*afiseaza tabelul Fahrenheit-Celsius pt. fahr=0,20, , 300; versiunea in virgula mobila*/ main() { float fahr, celsius; float prim, ultim, pas;

Introducere n C
Variabile i expresii aritmetice prim=0.0; /* limita inferioara a temperaturii */ ultim=300.0; /* limita superioara */ pas=20.0; /* marimea pasului */ fahr = prim; while (fahr <= ultim) { celsius = (5.0/9.0) * (fahr-32.0); printf(%3.0f %6.2f\n, fahr, celsius); fahr = fahr + pas; } }

Introducere n C
Variabile i expresii aritmetice
Dac un operator aritmetic are operanzi ntregi, se execut o operaie cu ntregi. Dac un operator aritmetic are un operand n reprezentare virgul mobil i un operand ntreg, nainte ca operaia s fie executat, ntregul va fi convertit n numr n reprezentare virgul mobil. Specificatorii din printf au urmtoarea semnificaie: %3.0f - se tiprete un numr n reprezentare virgul mobil ntr-un cmp de cel puin 3 caractere, fr cifre zecimale. %6.2f - se tiprete un numr n reprezentare virgul mobil ntr-un cmp de cel puin 6 caractere dintre care 2 caractere dup punctul zecimal.

Introducere n C
Instruciunea for #include<stdio.h> /*afiseaza tabelul Fahrenheit-Celsius pentru fahr=0,20, , 300 */ main() { int fahr; for (fahr = 0; fahr <= 300; fahr = fahr + 20) printf(%3d %6.2f\n, fahr, (5.0/9.0) * (fahr-32)); }

Introducere n C
Instruciunea for
Au fost eliminate majoritatea variabilelor. A rmas doar fahr. Limitele inferioar i superioar precum i dimensiunea pasului apar ca i constante n instruciunea for. Expresia care calculeaz valoarea temperaturii n grade Celsius apare ca al treilea argument al lui printf: n orice context n care este permis folosirea valorii unei variabile de un anumit tip, se poate folosi o expresie orict de complicat, de acel tip. Instruciunea for, ca i instruciunea while anterioar, este, de asemenea, un ciclu. ntre paranteze exist trei pri separate prin punct i virgul: iniializarea, condiia de continuare i incrementarea (reiniializarea). Ciclul se ncheie n cazul n care condiia a devenit fals. Iniializarea, condiia i incrementarea pot fi orice expresii.

Introducere n C
Constante simbolice
Inserarea numerelor 0, 20 i 300 n program nu constituie o metod bun. Sunt greu de modificat ntr-o manier sistematic. O soluie este s se dea nume, acestor numere. Definim astfel constante simbolice sau nume simbolice: #define nume text de nlocuire Din acest moment, orice apariie a lui nume va fi nlocuit cu text-ul de nlocuire corespunztor. Numele constantelor simbolice se scriu n mod convenional cu majuscule. #include<stdio.h> #define PRIM 0 #define ULTIM 300 #define PAS 20

Introducere n C
Constante simbolice /*tipareste tabelul Fahrenheit-Celsius */ main() { int fahr; for (fahr = PRIM; fahr <=ULTIM; fahr=fahr+PAS) printf(%3d %6.2f\n, fahr, (5.0/9.0)* (fahr-32)); } Obs. La sfritul unei linii define nu apare ;

Introducere n C
Citirea i scrierea caracterelor
Datele de intrare sau de ieire sub form de text , indiferent de originea sau destinaia lor sunt tratate ca fluxuri de caractere. Un flux de text este o secven de caractere mprit n linii; fiecare linie este format din zero sau mai multe caractere urmate de un caracter rnd nou. Biblioteca standard pune la dispoziie funcii pentru citirea sau scrierea caracterelor unul cte unul. Cele mai simple sunt: getchar i putchar. Funcia getchar citete urmtorul caracter dintr-un flux de text aflat la intrare( de ex. la tastatur) i l returneaz ca valoare a sa. c = getchar(); variabila c conine urmtorul caracter al datelor de intrare.

Introducere n C
Citirea i scrierea caracterelor - copiere
Funcia putchar tiprete (afieaz) un caracter de fiecare dat cnd este apelat: putchar(c); Tiprete coninutul variabile ntregi c sub forma unui caracter, de obicei pe ecran. Program care copiaz intrarea la ieire, caracter cu caracter. Rezolvarea n pseudocod: citeste un caracter while (caracterul nu este indicatorul de sfarsit de fisier) scrie caracterul care tocmai a fost citit citeste un caracter

Introducere n C
Citirea i scrierea caracterelor - copiere
#include<stdio.h> /* copiaza intrarea la iesire; prima versiune */ main() { int c; c = getchar(); while (c != EOF) { putchar(c); c = getchar(); } } Operatorul relaional != nseamn diferit de.

Introducere n C
Citirea i scrierea caracterelor - copiere
Problema este s distingem sfritul fiierului de intrare. Atunci cnd nu mai exist date de intrare, getchar returneaz o valoare special care nu poate fi confundat cu nici un caracter autentic. Valoarea se numete EOF (End Of File). Trebuie s-l declarm pe c ca aparinnd unui tip suficient de mare pentru a stoca orice valoare pe care o returneaz getchar, inclusiv EOF. De aceea am folosit int. EOF este un ntreg definit ca i o constant simbolic n <stdio.h>. n C, orice atribuire, precum c = getchar() este o expresie i are o valoare, care este chiar valoarea, de dup atribuire, a membrului stng al expresiei. n concluzie, programul poate fi simplificat astfel:

Introducere n C
Citirea i scrierea caracterelor - copiere
#include<stdio.h> /* copiaza intrarea la iesire; a doua versiune */ main(){ int c; while ( (c = getchar() ) != EOF) putchar(c); } Programul rezultat este mai compact. n C Se va ntlni frecvent acest stil. Prezena parantezelor este necesar deoarece precedena operatorului != este mai mare dect a operatorului =.

Introducere n C
Citirea i scrierea caracterelor numrare caractere
#include<stdio.h> /* numara caracterele din fisierul de intrare; prima versiune */ main(){ long nc; nc=0; while (getchar() != EOF) ++nc; printf(%ld\n, nc); } Operatorul ++ nseamn incrementare cu unu. Operatorii ++ i --(decrementare cu unu) pot fi folosii prefixai (++nc) sau postfixai (nc++).

Introducere n C
Citirea i scrierea caracterelor numrare caractere
Se poate lucra cu numere i mai mari, folosind o variabil de tip double (float n dubl precizie). De asemenea, se va folosi o instruciune for n loc de while: #include<stdio.h> /* numara caracterele din fisierul de intrare; a doua versiune */ main() { double nc; for (nc=0.0; getchar() != EOF; ++nc) ; printf(%.0f\n, nc); }

Introducere n C
Citirea i scrierea caracterelor numrare caractere
; de dup for desemneaz o instruciune vid. Dac fiierul de intrare nu conine nici un caracter, condiia de continuare a lui while sau for devine fals chiar la primul apel al lui getchar. Att while ct i for evalueaz condiia de continuare la nceputul ciclului, nainte de a trece la execuia corpului. n consecin, programele vor aciona corect i cnd datele de intrare au lungimea zero, caz n care astfel de cicluri nu se parcurg niciodat.

Introducere n C
Citirea i scrierea caracterelor-numrare linii
Programul numr liniile din fiierul de intrare. #include<stdio.h> /* numara liniile din fisierul de intrare */ main(){ int c, nl; nl = 0; while ( (c = getchar() ) != EOF) if (c == \n) ++nl; printf(%d\n, nl); }

Introducere n C
Citirea i scrierea caracterelor-numrare linii
Instruciunea if evalueaz condiia nchis ntre paranteze i, dac acea condiie este adevrat, execut instruciunea urmt. Semnul dublu egal == este notaia C pentru este egal cu. Atenie: nceptorii n C scriu uneori = cnd se refer la ==. Un caracter scris ntre dou semne apostrof reprezint o valoare ntreag egal cu valoarea numeric a caracterului respectiv, n setul de caractere al mainii. Acesta se numete constant caracter, dei reprezint doar o alt modalitate de a scrie, n C, un ntreg mic ( ex. A este o constant caracter; n setul de caractere ASCII valoarea sa este 65). Secvenele escape folosite n constantele ir de caractere sunt acceptate i n constantele caracter (\n este valoarea caracterului rnd nou, care n ASCII are valoarea 10).

Introducere n C
Citirea i scrierea caracterelor-numrare cuvinte
Programul numr linii, cuvinte i caractere. Se consider cuvnt orice secven de caractere care nu conine un spaiu, un tabulator sau un caracter rnd nou. #include <stdio.h> #define INTERIOR 1 /* in interiorul unui cuvant */ #define EXTERIOR 0 /* in afara unui cuvant */ /* numara liniile, cuvintele si caracterele din fisierul de intrare */ main() { int c, nl, ncuv, nc, stare; stare = EXTERIOR;

Introducere n C
Citirea i scrierea caracterelor-numrare cuvinte
nl = ncuv = nc = 0; while ((c = getchar()) != EOF) { ++nc; if (c == \n) ++nl; if(c == || c == \n || c == \t) stare = EXTERIOR; else if (stare == EXTERIOR) { stare = INTERIOR; ++ncuv; } }

Introducere n C
Citirea i scrierea caracterelor-numrare cuvinte
printf(%d %d %d\n, nl, ncuv, nc); } S-au folosit constantele simbolice INTERIOR i EXTERIOR n locul valorilor exacte 1 i 0 deoarece fac programul mai lizibil. Linia nl = ncuv = nc = 0; seteaz toate cele trei variabile la zero, o consecin a faptului c atribuirea este o expresie care are o valoare. Atribuirile realizeaz asocierea de la dreapta la stnga. Operatorul || nseamn SAU logic. Expresiile conectate prin && (SI logic) sau prin || se evalueaz de la stnga la dreapta i evaluarea se oprete imediat ce este stabilit adevrul sau falsitatea expresiei.

Introducere n C
Tablouri
Program care parcurge un text i contorizeaz numrul de apariii ale fiecrei cifre (ntr-un tablou), ale caracterelor tip spaiu alb (spaiu, tabulator, rnd nou) i ale tuturor celorlalte caractere. #include <stdio.h> /* numara cifre, spatii albe, altele */ main() { int c, i, nalbe, naltele; int ncifre[10]; nalbe = naltele = 0;

Introducere n C
Tablouri
for (i = 0; i < 10; ++i) ncifre[i] = 0; while ((c = getchar()) != EOF) if (c >= 0 && c <= 9) ++ncifre[c - 0]; else if (c == || c == \n || c == \t) ++nalbe; else ++naltele;

Introducere n C
Tablouri
printf(cifre=); for (i = 0; i < 10; ++i) printf(%d, ncifre[i]); printf(, spatii albe = %d, altele = %d\n, nalbe, naltele); } Declaraia int ncifre[10]; declar variabila ncifre ca fiind un tablou de 10 ntregi. n C, indicii tablourilor ncep ntotdeauna de la 0, deci elementele sunt ncifre[0], ncifre[1], ..., ncifre[9]. Un indice poate fi orice expresie cu valoare ntreag.

Introducere n C
Tablouri
ablonul if (conditie1) instructiune1 else if (conditie2) instructiune2 .... .... else instructiunen apare frecvent n programe ca o modalitate de a exprima decizia multipl.

Introducere n C
Funcii
O funcie furnizeaz o modalitate convenabil de a ncapsula anumite calcule care pot fi utilizate(apelate) ulterior fr a ne preocupa, n momentul apelului, de modul lor de implementare. Limbajul C face folosirea funciilor uoar, convenabil i eficient. Definiia unei funcii are urmtoarea form: tipul-rezultatului numele-functiei (declaratiileparametrilor) { declaratii instructiuni }

Introducere n C
Funcii
#include <stdio.h> int putere(int m, int n); /* utilizarea functiei putere */ int main() { int i; for (i = 0; i < 10; ++i) printf(%d %d %d\n, i, putere(2,i), putere(-3, i)); return 0; }

Introducere n C
Funcii
/* putere: ridica baza la puterea n; n>=0 */ int putere(int baza, int n) { int i, p; p = 1; for (i = 1; i<= n; ++i) p = p * baza; return p; }

Introducere n C
Funcii
Prima linie a funciei int putere(int baza, int n) declar tipurile i numele parametrilor i tipul rezultatului returnat de funcie. n general, vom folosi denumirea de parametru pentru o variabil enumerat n lista nchis ntre paranteze din definiia unei funcii i cea de argument pentru valoarea folosit ntr-un apel de funcie. Valoarea calculat n funcia putere este returnat ctre main de instruciunea return. Dup return poate urma orice expresie. Nu este necesar ca o funcie s returneze o valoare.

Introducere n C
Funcii
Declaraia int putere(int m, int n); aflat naintea lui main se numete prototip de funcie i trebuie s concorde cu definiia i apelurile funciei putere. Nu este necesar ca numele parametrilor s corespund. Un prototip poate fi scris : int putere(int, int); Numele folosite n definiia efectiv a funciei putere pentru parametrii si sunt locale funciei putere i nu sunt vizibile pentru nici o alt funcie. Acest lucru este valabil i pentru variabilele locale i i p. Aceste variabile se numesc, n C, variabile automatice.

Introducere n C
Transmiterea argumentelor prin valoare
n C, toate argumentele funciilor sunt transmise prin valoare. Acest lucru nseamn c funcia apelat primete valorile argumentelor sale prin stocare n variabile temporare create n stiv special n acest scop. n acest fel, funcia nu are acces la locaiile de memorie ale variabilelor originale. n C, funcia apelat nu poate modifica direct variabila corespunztoare argumentului transmis din funcia apelant; ea nu poate modifica dect copia temporar. Apelul prin valoare conduce la programe mai compacte, cu mai puine variabile neeseniale, deoarece parametrii pot fi tratai n rutina apelat ca variabile locale, convenabil iniializate ca urmare a apelului.

Introducere n C
Simularea transmiterii prin adres
Cnd este necesar, se poate face ca o funcie s modifice o variabil din funcia apelant. Funcia apelant trebuie s furnizeze adresa variabilei ce va fi accesat (un pointer ctre acea variabil), iar funcia apelat trebuie s declare parametrul ca fiind pointer i s acceseze variabila indirect, prin intermediul acestuia(vezi capitolul despre pointeri). O alt excepie este n cazul tablourilor: cnd numele unui tablou este folosit ca argument,valoarea transmis funciei este adresa locaiei primului element al tabloului. Folosind aceast valoare ca pe o variabil cu indici, funcia poate accesa i poate modifica direct orice element al tabloului.

Introducere n C
Tablouri de caractere
Este tipul de tablou cel mai des folosit n C. Program care citete un set de linii de text i o tiprete pe cea mai lung. Pseudocod: while (exista o alta linie) if (este mai lunga decat precedenta) (salveaz-o) (salveaza-i lungimea) tipareste cea mai lunga linie Programul se mparte n mod natural n mai multe fragmente care vor fi organizate ca funcii: preluarea liniei, testarea liniei, salvarea liniei.

Introducere n C
Tablouri de caractere
#include <stdio.h> #define MAXLINIE 1000 /* dimensiunea maxima a liniei de intrare*/ int preialinie(char linie[ ], int maxlinie); void copiaza(char in[ ], char din[ ]); /* tipareste cea mai lunga linie de intrare */ int main() { int lung; /* lungimea liniei curente */ int max; /* lungimea maxima intalnita pana acum */

Introducere n C
Tablouri de caractere
char linie[MAXLINIE]; /* linia de intrare curenta */ char cea_mai_lunga[MAXLINIE]; /* pentru salvarea liniei celei mai lungi */ max = 0; while ((lung = preialinie(linie, MAXLINIE)) > 0) if (lung > max) { max = lung; copiaza(cea_mai_lunga, linie); }

Introducere n C
Tablouri de caractere
if (max > 0) /* s-a gasit o linie */ printf(%s, cea_mai_lunga); return 0; } /* preialinie: citeste o linie, o stocheaza in s si returneaza lungimea ei */ int preialinie(char s[ ], int lim) { int c, i;

Introducere n C
Tablouri de caractere
for (i= 0;i < lim-1 && (c=getchar())!=EOF && c!=\n;++i) s[ i ] = c; if (c == \n) { s[ i ] = c; ++i; } s[ i ] = \0; return i; }

Introducere n C
Tablouri de caractere
/* copiaza: copiaza din in in; presupunem ca in este suficient de mare */ void copiaza(char in[ ], char din[ ]) { int i; i=0; while (( in[ i ] = din[ i ] ) != \0) ++i; }

Introducere n C
Tablouri de caractere
Lungimea tabloului s[ ] nu este necesar n funcia preialinie, din moment ce dimensiunea sa este setat n funcia main: char linie[MAXLINIE]. Tipul int este tipul returnat implicit. Acesta poate fi omis. Unele funcii returneaz o valoare util; altele, precum copiaza, sunt folosite numai pentru efectul lor. Funcia preialinie aeaz caracterul \0 (caracterul nul, a crui valoare este zero) la sfritul tabloului pe care l creaz, pentru a marca sfritul irului de caractere. Specificatorul de format %s din printf ateapt ca argumentul corespunztor s fie un ir de caractere terminat cu \0 .

Introducere n C
Variabile automatice i domenii de vizibilitate
Variabilele din funcia main: linie, cea_mai_lunga, sunt private sau locale funciei main. Nici o alt funcie nu poate avea acces direct la acestea. Acest lucru este valabil i pentru variabilele din alte funcii (de ex. variabila i din funcia preialinie nu are legtur cu variabila i din funcia copiaz). Fiecare variabil local dintr-o funcie i ncepe existena doar cnd este apelat funcia respectiv i dispare cnd se iese din funcie. Astfel de variabile se numesc automatice. Se pot defini i variabile externe tuturor funciilor, adic variabile accesibile din orice funcie. Fiind global accesibile, pot fi folosite n locul argumentelor pentru a transmite date ntre funcii. Totui, utilizarea excesiv a acestui mod de comunicare ntre funcii este considerat duntor i contrar unui bun stil de programare.