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