Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Variabile globale

c



+ Font mai mare | - Font mai mic



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



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 1454
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved