Puntatori statici ed esterni in C/C++

Puntatori statici ed esterni in C/C++

Static ed extern sono classi di archiviazione in C che definisce l'ambito e la durata di una variabile. Simile a qualsiasi variabile in C, possiamo utilizzare queste parole chiave con puntatori per diversi casi d'uso.

Sommario:

  1. Puntatori statici in C/C++
  2. Puntatori esterni in C/C++

Cominciamo.

Puntatori statici in C/C++

Statico le variabili una volta inizializzate esistono fino alla chiusura del programma. Queste variabili mantengono il loro valore anche dopo che sono fuori dal loro ambito. Una volta dichiarati e inizializzati, non vengono dichiarati nuovamente, ovvero, una volta allocata la memoria, esistono fino alla fine di quel programma. Una dichiarazione di puntatore statico come mostrato di seguito.

static int * ptr; // A static pointer of type int is defined    

Questa dichiarazione dice che il puntatore stesso dovrebbe avere una durata di archiviazione statica. e non dice nulla sulla classe di archiviazione della cosa a cui punta il puntatore. Ciò potrebbe cambiare in momenti diversi durante l'esecuzione del programma semplicemente assegnando valori diversi a questo puntatore.

L'ambito di queste variabili dipende da dove sono dichiarate. Il loro ambito è locale se la variabile è dichiarata all'interno della funzione. Se la variabile statica è dichiarata nella regione globle, è possibile accedervi ovunque nel programma o in quel particolare file C. Un valore iniziale 0 o NULL viene assegnato dal compilatore. Di seguito viene fornito un esempio per lo stesso.

#include <stdio.h>

void foo(){
int a = 10, b = 20;     
static int *c; //static pointer variable declaration
//re-declaration is not done in case of static variables

if(c == 0)
    c = &a; 
else
    c = &b;

printf("value = %d\n", *c);
printf("address of pointer = %d\n", &c);
printf("address of memory pointed by pointer c = %d\n", c);
printf("address of a = %d\n", &a);
printf("address of b = %d\n", &b);    
}

int main(){
    foo();
    foo();
}    

Uscita:

value = 10
address of pointer = 4218932
address of memory pointed by pointer c = 6422204
address of a = 6422204
address of b = 6422200
value = 20
address of pointer = 4218932
address of memory pointed by pointer c = 6422200
address of a = 6422204
address of b = 6422200    

Nel programma sopra una funzione foo() viene chiamata da main(). Nella prima iterazione la variabile statica inizializzata dal compilatore contiene "0" (zero), quindi verrà assegnato il valore di "a" e poiché è una variabile statica, lo mantiene anche dopo il completamento dell'esecuzione della funzione. In modo che nella seconda iterazione di foo() il puntatore statico 'c' sia assegnato al valore di b. Possiamo osservare lo stesso nella finestra di output. L'indirizzo del puntatore statico è costante durante l'esecuzione del programma. Ma dove punta può essere modificato.

Un puntatore statico può essere utilizzato per implementare una funzione che restituisce sempre lo stesso buffer al programma. Questo può essere utile nella comunicazione seriale.

char * Buffer(){
static char *buff;

if(buff == 0)
    buff = malloc( BUFFER-SIZE );

return buff;
}

Puntatori esterni in C/C++

Esterno storage class specifica che la variabile è definita altrove in un programma di grandi dimensioni. Specificando una variabile come Extern, il programmatore può utilizzare una variabile dichiarata altrove come se fosse dichiarata localmente. La variabile esterna non è altro che una variabile globale inizializzata con un valore legale in cui viene dichiarata per essere utilizzata altrove. Queste variabili possono essere inizializzate solo globalmente e solo una volta, ma possono essere dichiarate un numero qualsiasi di volte secondo il requisito. Alle variabili dichiarate come extern non viene allocata memoria.

#include <stdio.h>

void foo(){  
int a = 11;
extern int *ptr; 
//specifies compiler to search for this variable outside this function

printf("Default value = %d (NULL pointrer)\n", ptr);
ptr = &a;
printf("After assignment %d\n", *ptr);
}

int main(){
    foo();
}

int *ptr; // Globle pointer declaration
// pointer initialized by compiler - null pointer

Uscita:

Default value = 0 (NULL pointrer)  
After assignment 11

Utilizzando i puntatori Exrern è possibile creare puntatori disponibili a livello globale che possono essere utili in diversi scenari. Uno dei suoi usi è l'accesso agli argomenti della riga di comando dalla funzione principale in altri file o funzione di un progetto.

extern int ArgC = 0;
extern char ** ArgV = 0;

int main( int argc, char ** argv ) {
   ArgC = argc;
   ArgV = argv;
   ...
}

Con questo articolo su OpenGenus, devi avere un'idea completa dei puntatori statici ed esterni in C/C++.