Linguaxe de programación C (IX). Características das variables
1991/11/01 Alegria Loinaz, Iñaki | Maritxalar, Montse Iturria: Elhuyar aldizkaria
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:
- de programa: o nome da variable é global, polo que pode referirse a calquera función, bloque ou orde.
- 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.
- da función: o nome da variable só se coñece na propia función ou subprograma.
- 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)
![](images/A53031-a.jpg)
j)
Temos dúas variables denominadas, una global, outra externa (fixa) e outra local, incluída na función f1.
![](images/A53031-c.jpg)
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.
![](images/A53031-b.jpg)
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.
![](images/A53031-d.jpg)
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.
![](https://elia.eus/static/elhuyar/img/elia_RGB.png)
Gai honi buruzko eduki gehiago
Elhuyarrek garatutako teknologia