CATEGORII DOCUMENTE |
DOCUMENTE SIMILARE |
|
TERMENI importanti pentru acest document |
|
: | |
Variabile globale
Spre deosebire de variabilele locale, variabilele globale sunt cunoscute intregului modul program si pot fi utilizate de orice parte a programului. De asemenea, variabilele globale vor pastra valorile lor pe durata executiei complete a programului, deci se stocheaza in memoria statica.
Variabilele globale se creeaza prin declararea lor in afara oricarei functii (inclusiv main()). Variabilele globale pot fi plasate in orice parte a programului, evident in afara oricarei functii, si inainte de prima lor utilizare. De obicei, variabilele globale se plaseaza la inceputul unui program, mai exact inaintea functiei main().
Exemplu:
int count; /* count este global */
void main (void)
func1() /* Se defineste functia func1() */
func2() /* se defineste functia func2() */
Se observa ca, desi nici functia main() si nici functia func1() nu au declarat variabila count, ambele o folosesc. Functia func2() a declarat o variabila locala count. Cand se refera la count, func2() se va referi numai la variabila locala count si nu la variabila globala count declarata la inceputul programului.
Reamintim ca, daca o variabila globala si o variabila locala au acelasi nume, toate referirile la numele variabilei in interiorul functiei in care este declarata variabila locala se vor efectua numai asupra variabilei locale si nu vor avea nici un efect asupra variabilei globale. Deci, o variabila locala ascunde o variabila globala.
Variabilele globale sunt memorate intr-o zona fixa de memorie destinata special acestui scop (memoria statica), ramanand in aceasta zona pe parcursul intregii executii a programului.
Variabilele declarate explicit extern sunt tot variabile globale, dar accesibile nu numai modulului program in care au fost declarate, ci si tuturor modulelor in care au fost declarate de tip extern.
Un alt exemplu util si pentru intelegerea lucrului cu pointeri este urmatorul: se declara o variabila globala x, si apoi doua variabile locale cu acelasi nume, x, care se vor "ascunde" una pe cealalta. Pentru a vedea si modul in care se stocheaza in memorie aceste variabile, vom afisa si locatiile de memorie pentru fiecare tip de variabila x, precum si pentru pointerul p corespunzator.
Retinem ca, in general, daca:
p = &x => p = &x = &(*p) = (&*)p = p
*p = *(&x) = (*&)x = x
Faptul ca * respectiv & sunt operatiuni complementare (inverse una celeilalte) se observa din relatiile de mai sus, din care deducem ca:
&* = *& = identitate
&(*z)= z; // z este pointer
*(&z) = z; // z este o variabila de un anume tip
(z este de alt tip in fiecare din egalitatile de mai sus, pointer sau variabila).
# include <stdio.h>
int x = 34; /* x este global */
void main(void)
In urma executiei programului, obtinem urmatorul rezultat:
x=34 &x=00426A54 *p=34 p=00426A54 &p=0065FDF4
x=1 &x=0065FDE8 *p=1 p=0065FDE8 &p=0065FDF4
x=2 &x=0065FDE4 *p=2 p=0065FDE4 &p=0065FDF4
q=0065FDF4 *q=0065FDE4 **q=2 &q=0065FDEC
Prin declaratia int *p = &x; variabila p este declarata variabila pointer catre o data de tip intreg si este initializata cu adresa variabilei spre puncteaza, anume x. Pointerul q este declarat ca un pointer la un alt pointer.
Caracteristici ale variabilei |
Caracteristici ale variabilei pointer atasate |
|||||
Adresa &x |
Valoare x |
Adresa &p |
Valoarea p |
*p |
||
int x |
globala |
00426A54 |
34 |
0065FDF4 |
00426A54 |
34 |
int x |
locala |
0065FDF0 |
1 |
0065FDF4 |
0065FDF0 |
1 |
int x |
locala |
0065FDEC |
2 |
0065FDF4 |
0065FDEC |
2 |
p |
pointer local |
p = &x |
*p = x | |||
q |
pointer local |
q = &p |
*q = p |
&q= 0065FDEC |
q= 0065FDF4 |
**q= 2 |
Acelasi lucru se face pentru celelalte doua variabile locale. Din interpretarea rezultatelor de mai sus putem trage urmatoarele concluzii. Spre exemplu,
printf("%d",x); este echivalenta cu printf("%d",*p);
scanf("%d",&x); este echivalenta cu scanf("%d",p);
daca in prealabil s-a facut atribuirea p = &x;
Se mai observa cum pointerul p, care initial indica spre variabila globala x, este incarcat cu adresa de memorie 4336176 (00426A54 H), pe cand in cazurile cand indica variabilele locale x se alocau adresele de memorie 6684140 (0065FDF0 H) si 6684144 (0065FDEC H), adrese adiacente, la un interval de 4 octeti, atat cat sunt alocati pentru variabila de tip intreg. Se observa ca variabila globala se afla intr-o alta zona de memorie decat variabilele locale.
Modul de lucru cu pointerii este scos in evidenta prin instructiunile:
q=&p; // q retine adresa pointerului p
r=*q; // r retine valoarea de la adresa q
// q=&p => r = *(&p) = p => *r = *p = x
printf('q=%p *q=%p **q=%d &q=%pn',q,*q,*r,&q
prin care se initializeaza pointerul q cu adresa pointerului p, apoi pointerul r va primi valoarea *q, adica valoarea p.
Una din principalele caracteristici a limbajelor structurate o constituie compartimentarea codului si a datelor. In C, compartimentarea se realizeaza folosind variabile si functii. De exemplu, pentru scrierea unei functii mul() care determina produsul a doi intregi se pot utiliza doua metode, una generala si una specifica, astfel:
General : Specific :
mul (x, y) int x, y;
int x, y mul ()
Cand se doreste realizarea produsului a oricaror doi intregi x si y se utilizeaza varianta generala a functiei, iar cand se doreste produsul numai al variabilelor globale x si y se utilizeaza varianta specifica.
Exemplu:
# include <stdio.h>
# include <string.h>
int count; // count este global intregului program
play(); // Prototipul pentru functia play()
void main(void)
play(char *p) // Se declara functia play()
// int a, b nu sunt cunoscute sau evidente aici
else if(!strcmp(p,'beep')) printf('%c',7); }
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1545
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved