Llenguatge de programació C (IX). Característiques de les variables
1991/11/01 Alegria Loinaz, Iñaki | Maritxalar, Montse Iturria: Elhuyar aldizkaria
Si bé en els capítols anteriors s'han analitzat les variables que maneja el llenguatge C i els tipus de dades corresponents, no s'han analitzat algunes característiques relatives a les variables, sent les més importants la durada i l'àmbit (scope). Combinant aquestes característiques es distingeixen els diferents tipus d'emmagatzematge de C: acte, static, extern i register.
Durada: Fixos vs Automàtics
Una variable fixa sorgeix a l'inici del programa i sobreviu fins a la finalització de l'execució d'aquest, envaint constantment la seva part de memo. Per contra, una variable automàtica està associada a una funció o bloc concret del programa. Per tant, aquesta funció o bloc només es crearà quan comenci a executar-se i desapareixerà en finalitzar l'execució del bloc. En conseqüència, una variable automàtica pot generar-se diverses vegades i si el bloc o funció corresponent a la variable no s'utilitza en una execució, la variable no es generarà.
L'anterior té una gran influència en la inicialització, ja que mentre els fixos tinguin una única inicialització, els automàtics s'inicialitzaran cada vegada que la funció o bloc es referenciï externament.
Com veurem més endavant, les variables globals seran fixes i els locals seran automàtics.
Àmbit
El marc o scope és el concepte corresponent al programa font i representa el camp de coneixement del nom d'una variable. En el llenguatge C es distingeixen quatre tipus d'àrees de coneixement:
- de programa: el nom de la variable és global, per la qual cosa pot referir-se a qualsevol funció, bloc o ordre.
- del fitxer: només es coneix en el fitxer font en el qual es defineix el nom de la variable. Per tant, quan s'utilitza compilació distribuïda, si es fa referència des d'un altre mòdul no es reconeixerà, ja que el compilador el prendrà com una altra variable.
- de la funció: el nom de la variable només es coneix en la pròpia funció o subprograma.
- el del bloqueig: un bloc és el que es troba entre les mateixes i les corresponents} i només es coneix en el bloc en el qual es defineix la variable.
L'àmbit de la variable depèn d'on es trobi, encara que l'static pot canviar les paraules clau.
Veurem alguns exemples per a il·lustrar l'anterior:
a)
Aquestes dues variables automàtiques (denominades i) són diferents ja que tenen l'àmbit del bloc.
Tot això es deu a la localització de les definicions, en estar dins de la funció la variable, tret que es digui una altra cosa, és automàtica i el seu camp és el de bloqueig.
b)
![](images/A53031-a.jpg)
j)
Tenim dues variables denominades, una global, una altra externa (fixa) i una altra local, inclosa en la funció f1.
![](images/A53031-c.jpg)
Els tres primers resultats es deuen a l'execució de la funció f1 (la inicialització és Ø quan es defineix exclusivament) i l'última al programa principal.
Tipus d'emmagatzematge
En alguns llenguatges d'alt nivell es distingeixen dos tipus d'emmagatzematge: global i local. En C és possible combinar la durada i l'àmbit de les variables, obtenint diferents tipus d'emmagatzematge, tenint en compte la ubicació de la definició de la variable i l'ús de les paraules clau extern, static, acte i register.
Vegem el significat dels següents indicadors:
extern:
quan es desitja utilitzar una variable global fora del mòdul en el qual està definida, es realitza una nova estimació de la variable, però predefinit l'indicador extern, indicant que la definició està en un altre lloc.
static:
té doble funció. Redueix la vista del programa al fitxer a les variables definides externament (globals). Canvia la durada dels definits dins de les funcions a fixos.
acte:
s'adapta a variables amb marc de blocs però definides dins de les funcions. Atès que aquestes variables, si no s'ajusten a cap indicador, adopten les mateixes característiques que l'acte indicador, aquest indicador pràcticament mai s'utilitza.
register:
Aquest indicador només es pot utilitzar amb variables amb vista bloc i la seva incidència en el temps d'execució és la ubicació de la variable en un registre general. Això permet agilitar l'execució del programa adaptant-ho a variables molt utilitzades.
En la figura 1 es recull un resum de totes les característiques.
![](images/A53031-b.jpg)
Ús
Una vegada analitzades totes les característiques, veurem l'ús que tenen els diferents tipus de variables exposades. Podem distingir quatre usos diferents:
- variables locals automàtiques: són les més utilitzades, ja que tenen el camp del bloc i la durada automàtica. La definició es realitza dins de les funcions, sense cap indicador o amb un register indicador.
- variable local fixa: si una variable que s'utilitza en una sola funció o bloc necessita mantenir el seu valor, d'una anomenada a una altra, serà d'aquest tipus. La definició es realitza igual que l'anterior però utilitzant la paraula clau static.
- variable global simple: es caracteritza per conèixer i mantenir el valor des de diferents funcions o blocs. A l'hora de definir no s'ha de col·locar cap indicador, però es defineixen separadament de les funcions. No obstant això, quan hagin de ser referenciats des d'un altre mòdul o fitxer, s'haurà de fer referència a la variable especificant l'indicador extern. La major part de les funcions (ja que s'adapta a una mena de funció) són normalment d'aquest tipus.
- variable global aïllada: a l'hora de definir nous tipus de dades resulta molt interessant que la variable sigui captable de les funcions existents en el mòdul que defineix el tipus de dada, però no d'altres mòduls. La durada és fixa i l'àmbit del fitxer és molt interessant. La definició es realitza igual que l'anterior però anteposant l'indicador static.
![](images/A53031-d.jpg)
En la figura 2 es pot veure un exemple en el qual el nou tipus de dades de pila que es defineix en la mateixa només és accessible externament mitjançant les funcions push, pop i clear.
En el mòdul en el qual s'utilitza una d'aquestes funcions es farà un esment especificant l'indicador extern. Per exemple per a utilitzar push: extern void push ( ).
Memòria dinàmica
Les variables vistes fins al moment són estàtiques, és a dir, el compilador sabrà la quantitat de memòria que ocupen i per tant pot predir la seva ubicació.
La memòria dinàmica és interessant quan la longitud de les dades que manegem és variable en funció de l'execució. Els demostradors Pascalez són dinàmics, ja que són sol·licitats i alliberats mitjançant les funcions new i dispose. En C existeix un mecanisme d'adquisició i alliberament de memòria dinàmica mitjançant les funcions de llibreria malloc, calloc, realloc i free que s'exposaran en el capítol 11.
![](https://elia.eus/static/elhuyar/img/elia_RGB.png)
Gai honi buruzko eduki gehiago
Elhuyarrek garatutako teknologia