Sunteți pe pagina 1din 13

Capitolul 9 Clase de memorare pentru variabile

200

A=a cum s-a v[zut, tipul variabilei determin[ semnifica\ia valorilor pe care la poate lua variabila =i opera\iile permise asupra sa. Clasa de memorare a unei variabile indic[ locul unde i se va aloca spa\iu =i durata de via\[ a zonei de memorie asociate. Declara\ia complet[ a unei variabile are forma:
specificator_clasa tip variabila;

PECIFICATORII CLASELOR DE MEMORARE Exist[ patru specificatori pentru clase de memorare: auto, register, static, extern respectiv pentru clasele automatic, register, static, extern. Atunci c`nd declara\ia variabilei nu con\ine n mod explicit clase de memorare, aceasta este stabilit[ implicit pe baza locului unde este declarat[ variabila. !ariabilele din clasa automatic sunt declarate n interiorul func\iilor =i nu sunt recunoscute n afara blocului de declarare "sunt locale blocului respectiv#. Durata de via\[ a unei astfel de variabile coincide cu timpul de execu\ie al blocului$ ea este creat[ la intrarea n bloc =i distrus[ la ie=irea din bloc. %ocul de memorare al variabilelor auto este stiva$ la nceputul execu\iei unui bloc ele sunt create pe stiv[, iar la sf`r=itul execu\iei distruse prin desc[rcarea stivei. &n mod uzual locul de declarare al variabilelor locale este la nceputul blocului format din corpul ntre'ii func\ii, ns[, exist[ =i posibilitatea de a declara variabile n blocuri strict incluse n corpul func\iei. !ariabilele declarate n interiorul unei func\ii care nu au specificat[ clasa de memorare sunt considerate n mod implicit ca apar\in`nd clasei automatic.

Capitolul 9 Clase de memorare pentru variabile

201

Func\ia citeste() din programul urm[tor cite=te un num[r ]ntreg x dac[ n=1 =i n numere ]ntregi ( n<=100) pe care le depune ]ntr-un vector x[100] dac[ n>1
#include "stdio.h" #include "conio.h"

void citeste(int n); void main(void) { int n; printf("\n n="); scanf("%i",&n); citeste(n); getch(); void citeste(int n) { if (n==!) { int "; printf("\n "="); scanf("%i",&"); else { int "#!$$%,i; for (i=$;i&n;i'') { printf("\n "#%i%= ",i); scanf("%i",&"#i%); printf("\n ()au alocat %i octeti ",si*eof(int)+n);

(e observ[ c[ alocarea memoriei at`t pentru ntre'ul x c`t =i pentru vectorul x se face condi\ionat. Avanta)ul declar[rii ntr-un bloc condi\ional const[ n faptul c[ se va aloca memorie numai dac[ este nevoie. *olosirea aceluia=i nume x pentru cele dou[ zone

Capitolul 9 Clase de memorare pentru variabile

202

alocate este posibil[ deoarece aloc[rile se fac n blocuri diferite. +arametrii formali ai unei func\ii apar\in de asemenea clasei automatic. Ei se comport[ ca orice variabil[ local[ func\iei respective av`nd n plus posibilitatea de a primi valorile corespunz[toare ale parametrilor actuali. , variabil[ din clasa automatic sau register poate fi ini\ializat[$ ini\ializarea se face la fiecare intrare n bloc. (pecificatorul de clas[ register este indicat a se aplica variabilelor locale =i parametrilor formali ai unei func\ii care sunt frecvent utiliza\i de pro'ram. &n mod normal, o variabil[ care apar\ine clasei register ar trebui s[ fie memorat[ n re'i=trii unit[\ii centrale =i nu n memoria -A., fapt de natur[ s[ mbun[t[\easc[ substan\ial viteza opera\iilor f[cute asupra sa. /otu=i, este evident c[, de=i putem declara oric`te variabile cu specificatorul register, doar o parte din ele vor avea loc n re'i=trii unit[\ii centrale. De asemenea, n 'eneral, specificatorul are efect doar asupra variabilelor de tip char sau int. Din motive de portabilitate, cele care sunt n plus vor fi tratate normal. Datorit[ specificului lor "sunt folosite intens, sunt de obicei de tip ntre'# variabilele contor se preteaz[ destul de bine, pentru a fi declarate cu specificatorul register. 0nei variabile din clasa register nu i se poate aplica operatorul de luare a adresei 1 "nu are adres[ proprie#. Asem[n[tor cu variabilele din clasa automatic, variabilele din clasa register sunt create la intrarea n bloc. !ariabilele auto =i register care nu sunt ini\ializate explicit con\in valori ini\iale nedefinite. Exist[ situa\ii c`nd este necesar ca o variabil[ local[ s[-=i p[streze valoarea de la un apel la altul al func\iei n care este declarat[. &n acest caz variabila trebuie s[ fie declarat[ cu specificatorul

Capitolul 9 Clase de memorare pentru variabile

203

static. Ea este recunoscut[, de asemenea, numai n interiorul func\iei unde a fost declarat[, doar c[ memorarea sa se va face n loca\ii fixe de memorie, iar durata sa de via\[ coincide cu durata de execu\ie a pro'ramului. , variabil[ declarat[ static poate fi ini\ializat[, dar ini\ializarea se face o sin'ur[ dat[, la compilare. Calculul sumei primelor n numere impare folosind o variabil[ declarat[ static
#include "stdio.h" #include "conio.h" suma(void);

void main(void) { int n,i,,; printf("\n -umarul de elemente din suma="); scanf("%i",&n); for (i=!,,=!;i&n;i'') ,'=suma(); printf("\n (uma primelor %i numere impare este %i",n,,); getch(); suma(void) { static int s=!; s'=.; return s;

Avanta)ul folosirii variabilelor locale const[ n imposibilitatea de a modifica o astfel de variabil[ n afara blocului unde a fost declarat[. *olosirea n plus a specificatorului static permite crearea unor func\ii

Capitolul 9 Clase de memorare pentru variabile

204

independente "vezi exemplul func\iei suma() de mai sus# ce pot fi inserate, f[r[ probleme, n biblioteci. Alternativa la folosirea specificatorului static pentru a p[stra valoarea sumelor par\iale ntre dou[ apeluri era folosirea unei varia ile glo ale . , varia il! glo al! se declar[ totdeauna n afara oric[rei func\ii " nainte de prima sa utilizare, dar cel mai frecvent la nceputul pro'ramului#. Ea poate fi folosit[ n orice func\ie din pro'ram =i are o adres[ fix[ de memorie. Drept exemplu consider[m Calculul sumei primelor n numere impare folosind o variabil[ global[
#include "stdio.h" #include "conio.h" /+ varia0ila glo0ala s +/ int s=!;

pro'ramul anterior, u=or modificat.

suma(void); void main(void) { int n,i,,; printf("\n -umarul de elemente din suma="); scanf("%i",&n); for (i=!,,=!;i&n;i'') ,'=suma(); printf("\n (uma primelor %i numere impare este %i",n,,); getch(); suma(void) { s'=.; return s;

Capitolul 9 Clase de memorare pentru variabile

205

(e observ[ c[ valorile intermediare ale sumei calculate sunt memorate succesiv n variabila 'lobal[ s, unde sunt p[strate de la un apel la altul al func\iei suma(). *olosirea variabilelor 'lobale este recomandat[ n cazul n care func\iile care le folosesc sunt n num[r mare. Ele pot servi ca valori de comunicare ntre func\ii. Deoarece pot fi folosite de orice func\ie, exist[ ns[ pericolul s[ fie alterate accidental. Dac[ la acest lucru ad[u'[m faptul c[ variabilele 'lobale ocup[ memorie pe toat[ durat[ execu\iei pro'ramului, c2iar =i dup[ ce nu mai sunt necesare, tra'em concluzia c[, n 'eneral, nu se va prefera o variabil[ 'lobal[ n locul unei variabile locale. !ariabilele 'lobale afecteaz[ aspectul de sine st[t[tor al unei func\ii: func\ia va face referire nu numai la variabile declarate n corpul s[u, ci =i la variabile declarate n afara sa. !ariabilele 'lobale fac parte implicit din clasa extern. Exist[ posibilitatea ca un pro'ram 3 s[ fie alc[tuit din func\ii editate n fi=iere separate " "rogram multi#i$ier #. 3a o variabil[ 'lobal[ declarat[ ntr-un fi=ier s[ fie recunoscut[ =i n func\iile celorlalte fi=iere trebuie ca n acestea din urm[ s[ fie folosit n mod explicit, la declarare, specificatorul extern. &n felul acesta se evit[ alocarea de memorie pentru aceea=i variabil[ n fiecare fi=ier, fapt ce ar produce eroare la lin4editarea modulelor de pro'ram. , variabil[ 'lobal[ poate fi ini\ializat[, iar ini\ializarea ei trebuie f[cut[ o sin'ur[ dat[ =i anume n fi=ierul n care apare declarat[ f[r[ specificatorul extern. +entru exemplificare s[ transform[m pro'ramul anterior ntr-un "rogram multi#i$ier presupun`nd c[ func\ia main() va fi editat[ n fi=ierul princ.c, iar

func\ia suma() n fi=ierul sum.c.

Capitolul 9 Clase de memorare pentru variabile

206

Exemplu de program multifi=ier


/+ fisierul princ.c +/ #include "stdio.h" #include "conio.h" /+ varia0ila glo0ala s +/ int s=!; suma(void); void main(void) { int n,i,,; printf("\n -umarul de elemente din suma="); scanf("%i",&n); for (i=!,,=!;i&n;i'') ,'=suma(); printf("\n (uma primelor %i numere impare este %i",n,,); getch(); /+ fisierul sum.c +/ /+ varia0ila glo0ala s +/ e"tern int s; suma(void) { s'=.; return s;

(e observ[ c[ variabila 'lobal[ s a fost definit[ "declarat[ =i ini\ializat[# n fi=ierul princ.c, unde i se aloc[ =i memorie, iar n fi=ierul sum.c a fost declarat[ folosind specificatorul extern "f[r[ a i se mai aloca memorie#.

Capitolul 9 Clase de memorare pentru variabile

207

, variabil[ extern[ declarat[ ntr-un pro'ram multifi=er poate fi recunoscut[ doar de fi=ierul n care a fost declarat[ "ascuns[# dac[ i se aplic[ specificatorul static. Avanta)ul este c[ func\iile din celelalte fi=iere nu pot afecta accidental valoarea unei astfel de variabile. 3a o consecin\[, declararea n dou[ fi=iere distincte a aceleia=i variabile externe cu specificatorul static va avea ca efect ob\inerea a dou[ entit[\i distincte: modificarea uneia dintre ele nu va afecta cealalt[ entitate. +entru a exemplifica efectul specificatorului static asupra unei variabile 'lobale modific[m problema anterioar[, cer`nd ca func\ia suma() s[ poat[ calcula la cerere fie suma primelor n numere naturale pare, fie suma primelor n numere naturale impare. &n acest scop, ad[u'[m o func\ie de ini\ializare a variabilei s, init(). *unc\iile init() =i suma() vor face parte dintr-un fi=ier distinct sum_init.c, iar variabila 'lobal[ s va fi declarat[ static n scopul de a fi recunoscut[ doar n aceste dou[ func\ii. Acest lucru permite definirea n fi=ierul princ.h a variabilei 'lobale s f[r[ nici o le'[tur[ cu variabila s declarat[ n fi=ierul sum_init.c. Programul ilustrea [ efectul specificatorului static asupra unei variabile globale
/+ fisierul princ.c +/ #include "stdio.h" #include "conio.h" /+ varia0ila glo0ala s +/ int s=$; suma(void); void init(int); void main(void)

Capitolul 9 Clase de memorare pentru variabile

208

{ int n,i; printf("\n 1oriti suma primelor numere pare(2) sau impare(3)4 "); if (toupper(getche()) == 525 ) init().); else init()!); printf("\n -umarul de termeni ai sumei="); scanf("%i",&n); for (i=$;i&n;i'') s'=suma(); printf("\n (uma numerelor este %i",s); getch(); /+ fisier sum6init.c +/ static int s; suma(void) { s'=.; return s; void init(int v6init) { s=v6init;

!ariabilele locale sau 'lobale declarate static =i neini\ializate explicit sunt ini\ializate implicit cu valoarea 0. Dac[ o variabil[ extern[ =i o variabil[ local[ "sau parametru formal# au acelea=i nume, n func\ia unde este declarat[ variabila local[ referirea la numele

comun are n vedere variabila local[.

Programul afi=ea [ valoarea declarat[ local! adic[ x=1.42


#include "stdio.h"

variabilei

x!

Capitolul 9 Clase de memorare pentru variabile

209

#include "conio.h"

/+ varia0ila glo0ala " +/ int "=!; void main(void) { /+ varia0ila locala " +/ float "=!.7.; printf("\n "=%..f","); getch();

&n 'eneral, declara\iile f[cute ntr-un bloc asupra unei variabile sunt mai puternice dec`t cele f[cute asupra aceleia=i variabile n exterior, n sensul c[ referirea la variabil[ n cadrul blocului vizeaz[ declara\ia local[ blocului. Programul ilustrea [ faptul c[ declara\ia unei variabile ]ntr-un bloc interior este mai puternic[ dec"t declara\ia sa ]ntr-un bloc exterior# se va afi=a succesiv
x=4.13 x=3
#include "stdio.h" void main(void) { float "=7.!8; printf("\n "=%..f","); { int "=8; printf("\n "=%i","); getch();

Capitolul 9 Clase de memorare pentru variabile

210

, func\ie poate s[ apar\in[ clasei extern sau static. Dac[ specificatorii extern sau static sunt omi=i, func\ia se consider[ implicit n clasa extern. , func\ie care apar\ine clasei extern este recunoscut[ "vizibil[# n fi=ierul unde este definit[ sau declarat[, ca =i n toate fi=ierele care alc[tuiesc pro'ramul. , func\ie declarat[ static este recunoscut[ doar n fi=ierul unde este declarat[, nu =i n celelalte fi=iere ale pro'ramului. &ntr-un "rogram multi#i$ier , pot exista dou[ func\ii cu acela=i nume cu condi\ia s[ fie declarate static n fi=iere diferite. /E(/E DE 3,5/-,% %&' %ocul de memorare al variabilei auto este: a# stiva b# memoria 2eap %&( 3lasa de memorare auto a# trebuie declarat[ explicit ntotdeauna b# este considerat[ implicit pentru variabilele care sunt declarate n interiorul unei func\ii =i care nu au specificat[ clasa de memorare %&) Apelul func\iei
void f(void) float i=1; int i=!; printf("#n $d",i);

%
a# b# c#

produce eroare, deoarece variabila i este declarat[ at`t de tip #loat c`t =i de tip int are ca efect afi=area valorii ! are ca efect afi=area valorii 1

Capitolul 9 Clase de memorare pentru variabile

211

%&* (ecven\a de pro'ram


re&ister int x=10; int 'p; p=(x;

a# este corect[, deoarece atribuie unui pointer de tip int adresa unei variabile de tip int b# este incorect[, deoarece variabilelor care au clasa de memorare register nu li se poate aplica operatorul ( %&+ 3are din afirma\iile urm[toare sunt adev[rate6 a# ini\ializarea unei variabile din clasa auto sau register se face de fiecare dat[ c`nd se execut[ blocul n care sunt declarate b# ini\ializarea unei variabile din clasa static se face o sin'ur[ dat[ =i anume la compilare c# afirma\iile a# =i b# sunt adev[rate %&, , variabil[ din clasa de memorare static a# este memorat[ n stiv[ b# este memorat[ n loca\ii cu adrese fixe c# este recunoscut[ doar n interiorul func\iei unde a fost declarat[ d# =i p[streaz[ valoarea de la un apel la altul al func\iei %&- , variabil[ este numit[ 'lobal[ atunci c`nd a# este declarat[ n afara func\iei main./ b# este declarat[ n afara oric[rei func\ii %&0 !ariabilele 'lobale fac parte implicit din clasa a# register b# auto c# extern %&% 3are din afirma\iile urm[toare sunt adev[rate6 a# o variabil[ 'lobal[ declarat[ ntr-un fi=ier al unui pro'ram multifi=ier este recunoscut[ automat =i n func\iile celorlalte fi=iere

Capitolul 9 Clase de memorare pentru variabile

212

b# ntr-un pro'ram multifi=ier, o variabil[ 'lobal[ trebuie declarat[ identic n toate fi=ierele pro'ramului c# pentru a fi recunoscut[ de toate func\iile pro'ramului multifi=ier, o variabil[ 'lobal[ trebuie declarat[ obi=nuit ntrunul din fi=iere, iar n celelalte declara\ii trebuie s[ fie precedat[ de specificatorul extern d# precedat[ de specificatorul static, o variabil[ 'lobal[ este recunoscut[ doar de func\iile fi=ierului n care este declarat[ $%&P'(&'$) 7.8-a 7.9-b 7.=-b, c, d 7.>-b 7.:-b 7.?-c 7.;-b 7.<-a, b, c 7.7-c, d

S-ar putea să vă placă și

  • Instructiuni Instalare
    Instructiuni Instalare
    Document2 pagini
    Instructiuni Instalare
    Barosz
    Încă nu există evaluări
  • Sub
    Sub
    Document3 pagini
    Sub
    Barosz
    Încă nu există evaluări
  • Versiondog CH
    Versiondog CH
    Document7 pagini
    Versiondog CH
    Barosz
    Încă nu există evaluări
  • Functionare Turbosuflanta
    Functionare Turbosuflanta
    Document3 pagini
    Functionare Turbosuflanta
    Alex
    Încă nu există evaluări
  • Capitol Ul 13
    Capitol Ul 13
    Document17 pagini
    Capitol Ul 13
    Barosz
    Încă nu există evaluări
  • Versiondog - AP - Ro
    Versiondog - AP - Ro
    Document27 pagini
    Versiondog - AP - Ro
    Barosz
    Încă nu există evaluări
  • Sub
    Sub
    Document3 pagini
    Sub
    Barosz
    Încă nu există evaluări
  • Plante
    Plante
    Document1 pagină
    Plante
    Barosz
    Încă nu există evaluări
  • Sesiune Examene-1
    Sesiune Examene-1
    Document1 pagină
    Sesiune Examene-1
    Barosz
    Încă nu există evaluări
  • Tipuri de Traductoare
    Tipuri de Traductoare
    Document20 pagini
    Tipuri de Traductoare
    alexandra_dutescu
    100% (2)
  • ADA Layout Manual
    ADA Layout Manual
    Document8 pagini
    ADA Layout Manual
    Annemarie Hansen
    Încă nu există evaluări
  • Adresgfha Service Samsung
    Adresgfha Service Samsung
    Document1 pagină
    Adresgfha Service Samsung
    Barosz
    Încă nu există evaluări
  • Capitol Ul 5
    Capitol Ul 5
    Document16 pagini
    Capitol Ul 5
    Barosz
    Încă nu există evaluări
  • Capitol Ul 10
    Capitol Ul 10
    Document20 pagini
    Capitol Ul 10
    Barosz
    Încă nu există evaluări
  • Capitol Ul 11
    Capitol Ul 11
    Document14 pagini
    Capitol Ul 11
    Barosz
    Încă nu există evaluări
  • Teorie Masurare Debite
    Teorie Masurare Debite
    Document38 pagini
    Teorie Masurare Debite
    Razvan Preda
    Încă nu există evaluări
  • Capitol Ul 12
    Capitol Ul 12
    Document17 pagini
    Capitol Ul 12
    Barosz
    Încă nu există evaluări
  • Capitol Ul 8
    Capitol Ul 8
    Document51 pagini
    Capitol Ul 8
    Barosz
    Încă nu există evaluări
  • Capitolul 4 ISSC
    Capitolul 4 ISSC
    Document15 pagini
    Capitolul 4 ISSC
    Barosz
    Încă nu există evaluări
  • Capitol Ul 6
    Capitol Ul 6
    Document18 pagini
    Capitol Ul 6
    Barosz
    Încă nu există evaluări
  • Capitol Ul 4
    Capitol Ul 4
    Document38 pagini
    Capitol Ul 4
    Barosz
    Încă nu există evaluări
  • Capitol Ul 7
    Capitol Ul 7
    Document26 pagini
    Capitol Ul 7
    Barosz
    Încă nu există evaluări
  • Capitol Ul 3
    Capitol Ul 3
    Document43 pagini
    Capitol Ul 3
    Barosz
    Încă nu există evaluări
  • Capitolul 3
    Capitolul 3
    Document21 pagini
    Capitolul 3
    baratkyy5555
    100% (1)
  • Capitol Ul 2
    Capitol Ul 2
    Document13 pagini
    Capitol Ul 2
    Barosz
    Încă nu există evaluări
  • Capitolul 1 - Cibernetica
    Capitolul 1 - Cibernetica
    Document36 pagini
    Capitolul 1 - Cibernetica
    alexandru_roman_9
    Încă nu există evaluări
  • Capitol Ul 1
    Capitol Ul 1
    Document8 pagini
    Capitol Ul 1
    Barosz
    Încă nu există evaluări
  • Reprez Grafica
    Reprez Grafica
    Document1 pagină
    Reprez Grafica
    Barosz
    Încă nu există evaluări
  • Mat A
    Mat A
    Document1 pagină
    Mat A
    Barosz
    Încă nu există evaluări