Punteros estáticos y externos en C/ C++

Punteros estáticos y externos en C/ C++

Static y extern son clases de almacenamiento en C que definen el alcance y el tiempo de vida de una variable. Al igual que cualquier variable en C, podemos usar estas palabras clave con punteros para diferentes casos de uso.

Tabla de contenido:

  1. Puntero estático en C/ C++
  2. Puntero externo en C/C++

Comencemos.

Puntero estático en C/ C++

Estático las variables una vez inicializadas existen hasta la finalización del programa. Estas variables mantienen su valor incluso después de que están fuera de su alcance. Una vez declarados e inicializados, no se vuelven a declarar, es decir, una vez que se asigna la memoria, existen hasta la finalización de ese programa. Una declaración de puntero estático como se muestra a continuación.

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

Esta declaración dice que el puntero en sí debe tener una duración de almacenamiento estática. y no dice nada sobre la clase de almacenamiento de la cosa a la que apunta el puntero. Eso podría cambiar en diferentes momentos durante la ejecución del programa simplemente asignando diferentes valores a este puntero.

El alcance de estas variables depende de dónde se declaren. Su alcance es local si la variable se declara dentro de la función. Si la variable estática se declara en la región global, se puede acceder a ella en cualquier parte del programa o en ese archivo C particular. El compilador asigna un valor inicial 0 o NULL. A continuación se muestra un ejemplo de lo mismo.

#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();
}    

Salida:

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    

En el programa anterior, se llama a la función foo() desde main(). En la primera iteración, la variable estática inicializada por el compilador contiene '0' (cero), por lo que se asignará el valor de 'a' y, como es una variable estática, lo mantiene incluso después de completar la ejecución de la función. De modo que en la segunda iteración de foo(), el puntero estático 'c' se asigna al valor de b. Podemos observar lo mismo en la ventana de salida. La dirección del puntero estático es constante durante la ejecución del programa. Pero el lugar al que apunta puede modificarse.

Se puede usar un puntero estático para implementar una función que siempre devuelve el mismo búfer al programa. Esto puede ser útil en la comunicación en serie.

char * Buffer(){
static char *buff;

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

return buff;
}

Puntero externo en C/C++

Externo La clase de almacenamiento especifica que la variable se define en otra parte de un programa grande. Al especificar una variable como Extern, el programador puede usar una variable que se declara en otro lugar como si se declarara localmente. La variable externa no es más que una variable global inicializada con un valor legal donde se declara para ser utilizada en otro lugar. Estas variables solo se pueden inicializar globalmente y solo una vez, pero se pueden declarar cualquier número de veces según el requisito. A las variables declaradas como externas no se les asigna 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

Salida:

Default value = 0 (NULL pointrer)  
After assignment 11

Mediante el uso de punteros Exrern, se pueden crear punteros disponibles globalmente y pueden ser útiles en diferentes escenarios. Uno de sus usos es acceder a los argumentos de la línea de comandos desde la función principal en otros archivos o funciones de un proyecto.

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

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

Con este artículo en OpenGenus, debe tener una idea completa de los punteros estáticos y externos en C/C++.