Données
Les données du langage C sont les variables et les vecteurs
(suites de variables). Une donnée est spécifiée
par son type et son identificateur.
int i
float pi
long int nombre_voitures
Constantes
const rend une variable
accessible uniquement en lecture (non modifiable). Exemple :
const int deux = 2;
Attention, dans le cas d'un pointeur, le const porte sur la variable et
non sur le contenu du pointeur :
const int * pi;
*pi = 3;
est tout à fait correct. Par contre,
pi = &i;
est interdit.
Un identificateur de tableau (opérateur []) est une constante. Par
exemple :
int t[3];
Un const sur une
déclaration de vecteur porte sur le contenu du vecteur. Par
exemple :
const int t[] = {1, 2, 3};
entraîne
t[0] = 2;
est interdit.
Portée
De même que pour les fonctions, une variable globale à un
fichier est par défaut accessible de tout le programme. Ce qui
est équivalent à rajouter le mot clé extern.
Au contraire une variable globale déclarée static n'est visible
qu'à l'intérieur du fichier.
Les variables globales sont initialisées à la valeur
nulle correspondant à leur type.
A l'intérieur d'une fonction, une variable sans static ou extern n'est visible
qu'à l'intérieur du bloc et est
réinitialisée à chaque entrée dans le bloc.
La valeur de cette initialisation est inconnue. Une variable locale
masque les variables du même nom ayant une portée plus
large : globales ou déclarées dans un bloc englobant.
Si la variable d'un bloc est déclarée static, elle garde sa valeur en
permanence.
Enfin, si une variable est déclarée extern, cela signifie qu'elle
est définie ailleurs.
Le programme ligne (ligne.h ligne.c
main.c Makefile)
montre l'utilisation des variables statiques globales (longueur_ligne) et locales (position dans ligne_ecrire_mot).
Implémentation et durée de vie
Une variable globale ou statique est crée dans le "tas", zone
mémoire où les variables sont permanentes. Ces variables
sont par défaut initialisée à 0. Au contraire, les
variables locales à une fonction sont crées dans la
"pile". Cette zone mémoire est libéree dès que la
fonction est terminée et peut être
réutilisée. Ceci est illustré par l'exemple
suivant : test_var.c.
$ gcc test_var.c -o test_var
test_var.c: In function `f':
test_var.c:14: warning: function
returns address of local variable
$ test_var
1 2 3
4 5 6