Programmation : C

Introduction au C
Déclaration des variables
Résumé
Déclaration d'une variable:: type + nom
type liste_var_de_ce_type ;
Identificateurs corrects: Identificateurs incorrects:
TAILLE 8adr
Buffer
i
adresse_tableau
j45
_ptr

Un identificateur est un suite de lettres et de chiffres commençant par une lettre. Le symbole (caractère souligné) est considéré comme une lettre, on réserve son utilisation en premier caractère pour les variables systèmes.

Le compilateur différencie les lettres minuscules et majuscules.

Retour





Conventions en usage:
i, j, k, ... pour les indices de boucle
p, q, p1,... pour les identificateurs de pointeurs
s pour une variable de type chaîne de caractères
tmp pour une variable temporaire,...
donnez aux variables un nom mnémonique, supprimez les noms du style style toto1, toto2,... comme les noms trop compliqués à retenir: prmpt qui pourrait vouloir signifier "premier point".
rendre lisibles les identificateurs comprenant plusieurs mots par le caractère "_" ou par une majuscule sur les débuts des mots: premier_point ou premierPoint.
ne vous limitez pas sur le nombre de caractères par identificateur
commentez chaque définition de variable
les variables débutant par le symbole souligné _ sont habituellement réservées au système
Voir d'autres conseils pour nommer les variables page 105 de ce document.

Retour


Les classes d'allocation:

Où effectuer la déclaration ?

à l'extérieur des fonctions = variables globales et externes
entre la définition d'une fonction et son corps = variables locales
au début d'une instruction composée = variables locales

Retour


Les différentes classes de variables:
variables locales (classe auto par défaut)
variables locales (classe register)
variables locales (classe static)
variables globales (classe static par défaut)
variables globales externes et fonctions externes (classe extern)

Retour





Variables locales - classe auto par défaut:

int calcul (double x)

{
int i;
while (i > 0)
...
-------------------------------------------

       Visibilité de la variable i
 
-------------------------------------------
}
void main (void)
{
int i ;
int j ;
for (i=1 ;
...
j += i ;
----------------------------------------
 
        Visibilité des  variables i et j 
 
 
 
----------------------------------------
}


Variable automatique: (variable temporaire, variable locale)
fait partie de l'environnement local d'une fonction
n'est visible que dans le bloc concerné
allouée dans la pile lors de l'exécution
n'existe que pendant l'exécution du bloc

Retour





Variables locales à un bloc - classe auto par défaut:

Il est tout à fait possible de limiter la portée d'une variable locale à un petit groupe d'instructions (appelé alors bloc) - Par exemple :

void main(void)
{
int i ;
i = 3 ;
{
int j ;
...
for (j = 0 ; i <= n ; ...
}
}
La portée de la variable j est limitée au bloc dans lequel cette variable est déclarée. L'imbrication des blocs permet de déclarer des variables de même nom, seule la variable de niveau le plus profond est alors accessible dans un bloc donné.
 

Retour
 
 


Variables locales - classe register:

int calcul (int x)
{

register int i ;
register int j = 0 ;
for (i = 0 ; i <= x ; i++)
j += i ;
...
}
------------------------------------
       Visibilité des
        variables i et j
------------------------------------

Les registres étant d'accès beaucoup plus rapide qu'une variable rangée en mémoire centrale, il est avantageux de placer les variables très souvent accédées dans des registres. La requête de l'utilisateur ne pourra cependant être satisfaite que s'il reste des registres disponibles lors de l'exécution du programme.
Toutefois, l'amélioration des performances des optimiseurs de code rend obsolète cette classe de variable.
 
 

Retour


Variables locales - classe static:

La classe static utilisée dans un bloc permet de stocker de façon permanente des données à l'usage exclusif de ce bloc (ici d'une fonction).
La variable ainsi définie n'est ni construite lors de l'appel de la fonction, ni détruite lors du retour de la fonction.
À chaque appel de la fonction, la variable i retrouve sa valeur précédente, d'où la nécessité de l'initialiser lors de sa déclaration par : int i = 0 ;
Il n'existe qu'un seul exemplaire de la variable : faire attention lors des retours des fonctions (voir slide 79).
 

Exemple:

int lecture (int a)
{

static int i = 0 ;
int j = 0 ;
j += i ;
i++ ;
...
-------------------------------------------

 
     Visibilité des
     variables i et j
 
-------------------------------------------


Variable locale static:
fait partie de l'environnement local d'une fonction
l'emplacement mémoire est alloué lors de la compilation du programme et demeure inchangé durant son exécution

Retour






Variables globales - classe static par défaut:
int s1 ;
int calcul (int a)
{
if (a > s1)
s1++ ;
return(s1) ;
}
void main (void)
{
...
S1 = 25 ;
...
}
-------------------------------------------
 
 
 
 
 
 

      Visibilité de

      la variable s1 
 
 
 
 
 
 

-------------------------------------------
Variable globale:
fait partie de l'environnement du fichier, donc de toutes les fonctions définies dans le fichier; toutes les fonctions peuvent modifier cette variable et le buggage devient difficile.
l'emplacement mémoire est alloué lors de la compilation du programme et demeure inchangé durant son exécution.

Retour
 


Variables globales - classe extern:

         fichier arbre.c:               fichier calcul.c:

int E1 ;
void main (void)
{
...
E1 = 25 ;
...
}
extern int E1 ;
float calcul (int a)
{
...
if (a > E1)
...
}
Variable globale externe:
fait partie de l'environnement de chaque fichier qui inclu sa déclaration, toutes les fonctions de ces fichiers peuvent donc modifier cette variable et compliquer le débuggage.
l'emplacement mémoire est alloué lors de la compilation du fichier dans lequel la variable est déclarée (sans extern), les références externes à cette variable dans les autres fichiers sont effectués lors de l'édition de liens.
Par convention: toutes les variables locales s'écrivent en lettres minuscules, toutes les variables globales commencent par une lettre majuscule.
 
 

Fonction externe:
 

La fonction extern permet de séparer la déclaration du profil d'une fonction de sa définition dans le même fichier ou des fichiers séparés:

extern float calcul (int a) ; <--- déclaration du profil de la fonction

void main (void)
{
float x ;
int y ;...
<--- appel de la fonction
x = calcul(y) ;
}
-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-
float calcul (int a)
de la fonction
<--- définition du code (instructions)
{
if (a > s1)
...
}

Retour





L'initialisation de variables lors de leur déclaration:

initialisation d'une variable permanente (static) par une valeur connue lors de la compilation:

int nb = 0 ;
char c=- 'a' ;
float e = 2.71828 ;

unsigned short heure = 60 * 60 ;
int *adresse = &nb ;
char nom[TAILLE] ;
char adresse_dernier_element = nom + TAILLE - 1 ;
 
 
Le compilateur traite les déclarations et les initialisations séquentiellement.
Par exemple, les deux dernière déclarations:
char nom[TAILLE] ;
char *adresse_dernier_element = nom + TAILLE - 1 ;
se traduisent par :
réservation d'une zone de TAILLE octets consécutifs,
association du nom symbolique nom à l'adresse de début de la zone mémoire réservée,
réservation d'une zone de 4 octets permettant de stocker une adresse,
association du nom symbolique adresse_dernier_element à l'adresse de cette zone mémoire,
calcul de la constante nom + TAILLE - 1 (qui est bien l'adresse du dernier élément du tableau nom),
stockage de cette valeur dans la variable adresse_dernier_element.
L'initialisation des tableaux est présentée page 53
 

Initialisation d'une variable temporaire:
initialisation effectuée lors de l'allocation mémoire de la variable, lors de chaque appel de la fonction dans laquelle elle est définie
par une expression quelconque (et non par une expression constante)
int calcul (int a)
{
int b = 2 * a ;

Retour





Les variables non modifiables..

L'attribut const placé devant une déclaration prévient le compilateur que cette variable ne peut pas être modifiée par une instruction du programme.

Une telle variable n'est pas réellement considérée comme une constante, mais plutôt comme une variable non modifiable. Par exemple, on ne peut pu utiliser une telle variable pour dimensionner un tableau :
const int n = 10 ;
char nom[n] /* incorrect */
Ce mécanisme peut également être utilisé lors du passage des arguments dans une fonction: la déclaration d'un argument peut être précédée du mot clé const précisant ainsi que ce paramètre, qu'il soit une adresse ou une variable, ne peut pas être modifié par la fonction.
 

Retour

Langage C Partie I: Déclaration des variables