}

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

1991/11/01 Alegria Loinaz, Iñaki | Maritxalar, Montse Iturria: Elhuyar aldizkaria

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.

Gai honi buruzko eduki gehiago

Elhuyarrek garatutako teknologia