salut ce qui pourrait être l'utilisation du pointeur statique et externe ?? S'ils existent p>
5 Réponses :
voir Comment utiliser correctement le mot clé externe dans C < / a> p>
et Variables statiques internes en C, les utiliseriez-vous ? p>
Essentiellement, "statique" (en standard c) lorsqu'il est utilisé dans une fonction permet une variable de ne pas être essuyée car elle serait normalement une fois la fonction se termine (c'est-à-dire qu'elle conserve son ancienne valeur chaque fois que la fonction est appelée). "Externe" élargit la portée d'une variable afin qu'il puisse être utilisé dans d'autres fichiers (c'est-à-dire qu'il en fait une variable globale). P>
réponse courte. Statique est persistante, donc si vous le déclarez dans une fonction, lorsque vous appelez la fonction à nouveau, la valeur est la même que celle qui était la dernière fois. Si vous le déclarez globalement, ce n'est que global dans ce fichier. P>
extern signifie qu'il a déclaré globalement mais dans un fichier différent. (Cela signifie fondamentalement que cette variable existe et c'est ce que c'est défini comme). P>
Pour répondre à votre question sur quand ils pourraient être utilisés, quelques exemples simples:
Un pointeur statique peut être utilisé pour mettre en œuvre une fonction qui renvoie toujours le même tampon au programme, l'affectant la première fois qu'il est appelé: p> un pointeur externe (global global) pourrait être utilisé pour permettre aux autres unités de compilation d'accéder aux paramètres de la principale: P> extern int ArgC = 0;
extern char ** ArgV = 0;
int main( int argc, char ** argv ) {
ArgC = argc;
ArgV = argv;
...
}
Pourquoi le buff est char? ne pouvait pas être int?
C'est char car c'est un exemple. Cela pourrait être INT, DOUBLE, YADA YADA.
Réponse courte: ils n'existent pas. C99 6.7.1 dit "Au plus, un spécificateur de classe de stockage peut être donné dans les spécificateurs de déclaration dans une déclaration ". extern code> et
statique code> sont les deux spécificateurs de classe de stockage. p>
Cela répond à une interprétation surprenante de la question. Je m'attendrais à ce que la question signifierait: quelles sont les utilisations des pointeurs statiques et quelles utilisations des pointeurs externes (car je sais que les deux existent, j'ignorerais cette qualification).
Supposons que j'ai un pointeur que je veux faire à la libre disponibilité mondiale pour plusieurs unités de traduction. Je veux définir em> dans un endroit (Foo.c), mais permettez de multiples déclarations dans d'autres unités de traduction. Le mot clé "externe" indique au compilateur que ce n'est pas la déclaration définition em> pour l'objet; La définition réelle apparaîtra ailleurs. Cela rend simplement le nom d'objet disponible pour la liaison. Lorsque le code est compilé et lié, toutes les différentes unités de traduction feront référence au même objet par ce nom. Supposons que je dispose également d'un pointeur que je souhaite rendre globalement disponible dans un fichier source unique, mais ne pas avoir visible d'autres unités de traduction. Je peux utiliser le mot-clé "statique" pour indiquer que le nom de l'objet ne doit pas être exporté vers la liaison. P> Supposons que je dispose également d'un pointeur que je veux utiliser uniquement dans une seule fonction, mais j'ai La valeur du pointeur préservé entre les appels de fonction. Je peux à nouveau utiliser le mot-clé "statique" pour indiquer que l'objet a une étendue statique; La mémoire pour elle sera attribuée au démarrage du programme et non publié jusqu'à la fin du programme, la valeur de l'objet sera donc préservée entre les appels de fonction. P> /**
* foo.h
*/
#ifndef FOO_H
#define FOO_H
/**
* Non-defining declaration of aGlobalPointer; makes the name available
* to other translation units, but does not allocate the pointer object
* itself.
*/
extern int *aGlobalPointer;
/**
* A function that uses all three pointers (extern on a function
* declaration serves roughly the same purpose as on a variable declaration)
*/
extern void demoPointers(void);
...
#endif
/**
* foo.c
*/
#include "foo.h"
/**
* Defining declaration for aGlobalPointer. Since the declaration
* appears at file scope (outside of any function) it will have static
* extent (memory for it will be allocated at program start and released
* at program end), and the name will be exported to the linker.
*/
int *aGlobalPointer;
/**
* Defining declaration for aLocalPointer. Like aGlobalPointer, it has
* static extent, but the presence of the "static" keyword prevents
* the name from being exported to the linker.
*/
static int *aLocalPointer;
void demoPointers(void)
{
/**
* The static keyword indicates that aReallyLocalPointer has static extent,
* so the memory for it will not be released when the function exits,
* even though it is not accessible outside of this function definition
* (at least not by name)
*/
static int *aReallyLocalPointer;
}