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.
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.
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:
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)
j)
Tenim dues variables denominades, una global, una altra externa (fixa) i una altra local, inclosa en la funció f1.
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.
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.
Una vegada analitzades totes les característiques, veurem l'ús que tenen els diferents tipus de variables exposades. Podem distingir quatre usos diferents:
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 ( ).
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.