Langage C

Notification de cookies

Nous utilisons des cookies pour améliorer votre expérience. En poursuivant votre navigation sur ce site, vous acceptez l'utilisation de cookies. Plus d'informations

Les classes de stockage en langage C

Une classe de stockage représente la visibilité et l'emplacement d'une variable. Elle indique à partir de quelle partie du code nous pouvons accéder à une variable. Une classe de stockage est utilisée pour décrire les éléments suivants:

  •  La portée d'une variable.
  •  L'emplacement où la variable sera stockée.
  •  La valeur initiale d'une variable.
  •  Une durée de vie d'une variable.
  •  Qui peut accéder à une variable ?

Ainsi, une classe de stockage est utilisée pour représenter les informations sur une variable.

 Remarque ! Une variable est non seulement associée à un type de données et sa valeur, mais également à une classe de stockage.

Il existe au total quatre types de classes de stockage standard. Le tableau ci-dessous représente les classes de stockage en C.

Classe de stockage automatique (auto)

Les variables définies à l'aide de la classe de stockage auto sont appelées variables locales. auto représente la classe de stockage automatique. Une variable est dans la classe de stockage automatique par défaut si elle n'est pas explicitement spécifiée.

La portée d'une variable automatique est limitée au bloc particulier uniquement. Une fois que le contrôle sort du bloc, l'accès est détruit. Cela signifie que seul le bloc dans lequel la variable automatique est déclarée peut y accéder.

Le mot clé auto est utilisé pour définir une classe de stockage automatique. Par défaut, une variable automatique contient une valeur poubelle (grabage).

Exemple 1 :
                                auto int age;
                            

Le programme ci-dessous définit une fonction avec deux variables locales (a et b)

Exemple 2 :
                                void mafonction(){
                                    int a;
                                    auto fload b;
                                }
                            

Nous prenons un autre programme qui montre le niveau de portée "niveau de visibilité" pour les variables automatiques dans chaque code de bloc qui sont indépendamment les uns des autres:

Exemple 3 :
                                #include < stdio.h>
                                int main(){
                                    auto int j = 1;
                                    {
                                        auto int j = 2;
                                        {
                                            auto int j = 3;
                                            printf("bloc 3 -  %d \n", j);
                                        }
                                        printf("bloc 2 - %d \n", j);
                                    }
                                    printf("bloc 1 - %d \n", j);
                                    return 0;
                                }
                            
bloc 3 - 3
bloc 2 - 2
bloc 1 - 1

Classe de stockage externe (extern)

Extern est synonyme de classe de stockage externe. La classe de stockage externe est utilisée lorsque nous avons des fonctions globales ou des variables partagées entre deux fichiers ou plus.

Le mot-clé extern est utilisé pour déclarer une variable globale ou une fonction dans un autre fichier afin de fournir la référence de variable ou de fonction déjà définie dans le fichier d'origine.

Exemple 4 :
                                extern int age; // variable externe
                                extern int comparer(int a, int b);
                            

Les variables définies à l'aide d'un mot clé extern sont appelées variables globales. Ces variables sont accessibles tout au long du programme. Notez que la variable externe ne peut pas être initialisée, elle a déjà été définie dans le fichier d'origine.

Exemple 5 : main.c
                                #include < stdio.h>

                                int compteur;
                                extern void methode_globale();
                                            
                                int main(void){
                                    compteur = 3;
                                    methode_globale();
                                }
                            
Exemple 5 : utilitaire.c
                                #include < stdio.h>
 
                                extern int compteur;
                                             
                                void methode_globale(void) {
                                    printf("compteur est :  %d\n", compteur);
                                }
                            

Ici, extern est utilisé pour déclarer compteur dans le deuxième fichier, où elle a sa définition dans le premier fichier, main.c.
Compiler ces deux fichiers comme suit :

  gcc main.c utilitaire.c -o main
  ./main

Lorsque ce programme est exécuté, il produit le résultat suivant

compteur est : 3

Classe de stockage statique (static)

La classe de stockage statique indique au compilateur de conserver une variable locale pendant toute la durée de vie du programme au lieu de la créer et de la détruire à chaque fois qu'elle entre dans la portée. Par conséquent, rendre les variables locales statiques leur permet de conserver leurs valeurs entre les appels de fonctions.

Le mot clé static peut également être appliqué aux variables globales. Ceci fait, la portée de cette variable est restreinte au fichier dans lequel elle est déclarée.

En programmation C, lorsque static est utilisé sur une variable globale, une seule copie de ce membre est partagée par tous les objets de sa classe.

Exemple 6 :
                                static int compteur = 10;
                            

Gardez à l'esprit que la variable statique a une valeur initiale par défaut de zéro et qu'elle n'est initialisée qu'une fois dans sa vie.

Exemple 7 :
                                #include < stdio.h>

                                /* declaration de la méthode*/
                                void func(void);
                                            
                                static int compteur = 3; /*  variable globale */
                                            
                                int main(void){
                                    while (compteur--){
                                        func();
                                    }
                                    return 0;
                                }
                                            
                                /*  définition de la fonction */
                                void func(void){
                                    static int i = 5; /* variable local statique */
                                    i++;
                                    printf("i = %d et compteur = %d\n", i, compteur);
                                }
                            
i = 6 et compteur = 2
i = 7 et compteur = 1
i = 8 et compteur = 0

Classe de stockage de registre (register)

Vous pouvez utiliser la classe de stockage de registre lorsque vous souhaitez stocker des variables locales dans des fonctions ou des blocs dans des registres de CPU au lieu de la RAM pour accéder rapidement à ces variables. Par exemple, les compteurs sont un bon candidat pour être stockés dans le registre.

Exemple 8 :
                                register int compteur;
                            

Le mot clé register est utilisé pour déclarer une classe de stockage de registre. Les variables déclarées à l'aide de la classe de stockage du registre ont une durée de vie tout au long du programme.

Elle est similaire à la classe de stockage automatique. La variable est limitée au bloc particulier. La seule différence est que les variables déclarées à l'aide de la classe de stockage de registres sont stockées dans des registres de la CPU au lieu d'une mémoire. register a un accès plus rapide que celui de la mémoire principale.

Les variables déclarées à l'aide de la classe de stockage du registre n'ont pas de valeur par défaut. Ces variables sont souvent déclarées au début d'un programme.

Exemple 9 :
                                #include < stdio.h>
                                int main(void){
                                    register int poids;
                                            
                                    /* cela produit une erreur lorsque la compilation a lieu, 
                                        nous ne pouvons pas obtenir d’emplacement mémoire lorsque nous 
                                        travaillons avec le registre de la CPU 
                                    */
                                    int *ptr = &poids; // erreur
                                    return 0;
                                }
                            
test.c:2:1: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
main()
^
test.c:6:20: error: address of register variable requested
Attention ! Il convient également de noter que la définition de "register" ne signifie pas que la variable sera stockée dans un registre. Cela signifie qu'il PEUT être stocké dans un registre en fonction des restrictions matérielles et de mise en oeuvre.

Partager ce cours avec tes amis :

Rédigé par M. ESSADDOUKI

Learning a new programming language is an easy thing, but the most difficult thing is how to design efficient algorithms for real-world problems, so don't be a programmer, be a problems solver.

Cours Similaires :