Linguaxe de programación C (IX). Características das variables

Quedan por analizar algunhas características relativas ás variables que manexa a linguaxe C, sendo as máis importantes a duración e o ámbito.

Aínda que nos capítulos anteriores analizáronse as variables que manexa a linguaxe C e os tipos de datos correspondentes, non se analizaron algunhas características relativas ás variables, sendo as máis importantes a duración e o ámbito (scope). Combinando estas características distínguense os diferentes tipos de almacenamento de C: auto, static, extern e register.

Duración: Fixos vs Automáticos

Una variable fixa xorde ao comezo do programa e sobrevive até a finalización da execución do mesmo, invadindo constantemente o seu parte de memo. Pola contra, una variable automática está asociada a unha función ou bloque concreto do programa. Por tanto, esta función ou bloque só se creará cando comece a executarse e desaparecerá ao finalizar a execución do bloque. En consecuencia, una variable automática pode xerarse varias veces e si o bloque ou función correspondente á variable non se utiliza nunha execución, a variable non se xerará.

O anterior ten una gran influencia na inicialización, xa que mentres os fixos teñan una única inicialización, os automáticos se inicializarán cada vez que a función ou bloque se referencie externamente.

Como veremos máis adiante, as variables globais serán fixas e os locais serán automáticos.

Ámbito

O marco ou scope é o concepto correspondente ao programa fonte e representa o campo de coñecemento do nome dunha variable. Na linguaxe C distínguense catro tipos de áreas de coñecemento:

  1. de programa: o nome da variable é global, polo que pode referirse a calquera función, bloque ou orde.
  2. do ficheiro: só se coñece no ficheiro fonte no que se define o nome da variable. Por tanto, cando se utiliza compilación distribuída, si faise referencia desde outro módulo non se recoñecerá, xa que o compilador tomarao como outra variable.
  3. da función: o nome da variable só se coñece na propia función ou subprograma.
  4. o do bloqueo: un bloque é o que se atopa entre as mesmas e as correspondentes} e só se coñece no bloque no que se define a variable.

O ámbito da variable depende de onde se atope, aínda que o static pode cambiar as palabras crave.

Veremos algúns exemplos paira ilustrar o anterior:

a)

Estas dúas variables automáticas (denominadas i) son diferentes xa que teñen o ámbito do bloque.

Todo iso débese á localización das definicións, ao estar dentro da función a variable, salvo que se diga outra cousa, é automática e o seu campo é o de bloqueo.

b)

j)

Temos dúas variables denominadas, una global, outra externa (fixa) e outra local, incluída na función f1.

O tres primeiros resultados débense á execución da función f1 (a inicialización é Ø cando se define exclusivamente) e a última ao programa principal.

Tipos de almacenamento

Nalgunhas linguaxes de alto nivel distínguense dous tipos de almacenamento: global e local. En C é posible combinar a duración e o ámbito das variables, obtendo diferentes tipos de almacenamento, tendo en conta a localización da definición da variable e o uso das palabras crave extern, static, auto e register.

Vexamos o significado dos seguintes indicadores:

extern:

cando se desexa utilizar una variable global fose do módulo no que está definida, realízase una nova estimación da variable, pero predefinido o indicador extern, indicando que a definición está noutro lugar.

static:

ten dobre función. Reduce a vista do programa ao ficheiro ás variables definidas externamente (globais). Cambia a duración dos definidos dentro das funcións a fixos.

auto:

adáptase a variables con marco de bloques pero definidas dentro das funcións. Dado que estas variables, se non se axustan a ningún indicador, adoptan as mesmas características que o auto indicador, este indicador practicamente nunca se utiliza.

register:

Este indicador só se pode utilizar con variables con vista bloque e a súa incidencia no tempo de execución é a localización da variable nun rexistro xeral. Isto permite axilizar a execución do programa adaptándoo a variables moi utilizadas.

Na figura 1 recóllese un resumo de todas as características.

Figura . Duración e ámbito das variables segundo o indicador. (Nota: Paira ver ben a imaxe ir ao pdf).

Uso

Una vez analizadas todas as características, imos ver o uso que teñen os diferentes tipos de variables expostas. Podemos distinguir catro usos diferentes:

  • variables locais automáticas: son as máis utilizadas, xa que teñen o campo do bloque e a duración automática. A definición realízase dentro das funcións, sen ningún indicador ou cun register indicador.
  • variable local fixa: se una variable que se utiliza nunha soa función ou bloque necesita manter o seu valor, dunha chamada a outra, será deste tipo. A definición realízase igual que a anterior pero utilizando a palabra crave static.
  • variable global simple: caracterízase por coñecer e manter o valor desde diferentes funcións ou bloques. Á hora de definir non se debe colocar ningún indicador, pero se definen separadamente das funcións. No entanto, cando deban ser referenciados desde outro módulo ou ficheiro, deberase facer referencia á variable especificando o indicador extern. A maior parte das funcións (xa que se adapta a un tipo de función) son normalmente deste tipo.
  • variable global illada: á hora de definir novos tipos de datos resulta moi interesante que a variable sexa captable das funcións existentes no módulo que define o tipo de dato, pero non doutros módulos. A duración é fixa e o ámbito do ficheiro é moi interesante. A definición realízase igual que a anterior pero antepondo o indicador static.
Figura . Definición dun novo tipo de datos.

Na figura 2 pódese ver un exemplo no que o novo tipo de datos de pila que se define na mesma só é accesible externamente mediante as funcións push, pop e clear.

No módulo no que se utiliza una destas funcións farase una mención especificando o indicador extern. Por exemplo paira utilizar push: extern void push ( ).


Memoria dinámica

As variables vistas até o momento son estáticas, é dicir, o compilador saberá a cantidade de memoria que ocupan e por tanto pode predicir a súa localización.

A memoria dinámica é interesante cando a lonxitude dos datos que manexamos é variable en función da execución. Os demostradores Pascalez son dinámicos, xa que son solicitados e liberados mediante as funcións new e dispose. En C existe un mecanismo de adquisición e liberación de memoria dinámica mediante as funcións de libraría malloc, calloc, realloc e free que se exporán no capítulo 11.

Gehitu iruzkin bat

Saioa hasi iruzkinak uzteko.

Babesleak
Eusko Jaurlaritzako Industria, Merkataritza eta Turismo Saila
MAIER Koop. Elk.
KIDE Koop. Elk.
ULMA Koop. Elk.
EIKA Koop. Elk.
LAGUN ARO Koop. Elk.
FAGOR ELECTRÓNICA Koop. Elk.