Bien que les variables manipulées par le langage C et les types de données correspondants aient été analysées dans les chapitres précédents, certaines caractéristiques relatives aux variables n'ont pas été analysées, la durée et la portée les plus importantes (scope). En combinant ces caractéristiques on distingue les différents types de stockage de C : auto, static, extern et register.
Une variable fixe apparaît au début du programme et survit jusqu'à la fin de l'exécution du programme, en envahissant constamment sa partie de mémo. En revanche, une variable automatique est associée à une fonction ou bloc spécifique du programme. Par conséquent, cette fonction ou bloc n'est créée que lorsque vous commencez à démarrer et disparaîtra à la fin de l'exécution du bloc. Par conséquent, une variable automatique peut être générée plusieurs fois et si le bloc ou la fonction correspondant à la variable n'est pas utilisé dans une exécution, la variable ne sera pas générée.
Ce qui précède a une grande influence sur l'initialisation, puisque tant que les fixes ont une initialisation unique, les automatiques seront initialisés chaque fois que la fonction ou le bloc est référencé extérieurement.
Comme nous le verrons plus loin, les variables globales seront fixes et les variables locales seront automatiques.
Le cadre ou scope est le concept correspondant au programme source et représente le champ de connaissance du nom d'une variable. Dans le langage C, on distingue quatre types de domaines de connaissance:
La portée de la variable dépend de l'endroit où elle se trouve, bien que la static puisse changer les mots-clés.
Voici quelques exemples pour illustrer ce qui précède :
a) a)
Ces deux variables automatiques (appelées i) sont différentes car elles ont la portée du bloc.
Tout cela est dû à la localisation des définitions, étant dans la fonction la variable, sauf si on dit autre chose, est automatique et son champ est celui de blocage.
b)
j) j)
Nous avons deux variables, l'une globale, l'autre externe (fixe) et l'autre locale, incluse dans la fonction f1.
Les trois premiers résultats sont dus à l'exécution de la fonction f1 (l'initialisation est Ø lorsqu'elle est définie exclusivement) et la dernière au programme principal.
Dans certains langages de haut niveau, on distingue deux types de stockage : global et local. En C, il est possible de combiner la durée et la portée des variables en obtenant différents types de stockage, en tenant compte de l'emplacement de la définition de la variable et de l'utilisation des mots-clés extern, static, auto et register.
Voyons la signification des indicateurs suivants:
extern:
Lorsque vous souhaitez utiliser une variable globale en dehors du module dans lequel elle est définie, une nouvelle estimation de la variable est effectuée, mais l'indicateur externe est prédéfini, indiquant que la définition est ailleurs.
static:
a double fonction. Réduit la vue du programme au fichier aux variables définies extérieurement (globales). Change la durée de ceux définis dans les fonctions à fixes.
auto:
s'adapte aux variables avec cadre de blocs mais définies dans les fonctions. Puisque ces variables, si elles ne correspondent à aucun indicateur, adoptent les mêmes caractéristiques que l'indicateur automatique, cet indicateur n'est pratiquement jamais utilisé.
register:
Cet indicateur ne peut être utilisé qu'avec des variables avec vue bloc et son incidence sur le temps d'exécution est l'emplacement de la variable dans un registre général. Cela permet d'accélérer l'exécution du programme en l'adaptant à des variables très utilisées.
La figure 1 contient un résumé de toutes les caractéristiques.
Une fois analysées toutes les fonctionnalités, nous allons voir l'utilisation des différents types de variables exposées. Nous pouvons distinguer quatre usages différents:
Dans la figure 2, vous pouvez voir un exemple dans lequel le nouveau type de données de pile qui est défini dans celui-ci est accessible à l'extérieur uniquement par les fonctions push, pop et clear.
Dans le module dans lequel une de ces fonctions est utilisée, une mention est faite en spécifiant l'indicateur externe. Par exemple pour utiliser push: extern void push ( ).
Les variables vues jusqu'à présent sont statiques, c'est-à-dire que le compilateur connaîtra la quantité de mémoire qu'ils occupent et peut donc prédire leur emplacement.
La mémoire dynamique est intéressante lorsque la longueur des données que nous gérons est variable en fonction de l'exécution. Les démonstrateurs Pascalez sont dynamiques, car ils sont sollicités et libérés par les fonctions new et dispose. En C, il existe un mécanisme d'acquisition et de libération de mémoire dynamique grâce aux fonctions de bibliothèque malloc, calloc, realloc et free qui seront exposées au chapitre 11.