2012-03-06 14 views
5

Tengo un ejemplo de código aquí.¿cuál es la diferencia entre la estructura estática y la estructura normal?

struct node { 
     int data; 
     struct node *link; 
    }; 
    static struct node *first = NULL; 

Sería genial si alguien pudiera arrojar algo de luz sobre mis siguientes preguntas sobre el uso de la palabra estática.

  1. ¿Qué significa la palabra clave static en el código anterior?

  2. ¿cuál es la diferencia entre la estructura normal y la estructura estática?

+2

No hay 'estructura estática' en su código. Es solo una instancia 'estática' de' struct node'. – iammilind

+0

@iammilind: ni siquiera es eso, es una instancia de 'struct node *'. –

Respuesta

7

Crea un puntero estático a node y lo inicializa en NULL.

La definición de la variable puede tener múltiples significados:

static struct node *first = NULL; 

Si definida fuera de un método, que da firstenlace interno. Solo se puede usar dentro del módulo de definición.

Pero también se puede encontrar esa línea dentro de un método:

void foo() 
{ 
    static struct node *first = NULL; 
} 

la variable es una variable de residencia método de ámbito en el almacenamiento estático. Se inicializa en NULL una vez y todos los cambios subsiguientes persisten entre las llamadas a la función.

+0

Esa era la pregunta: ¿qué significa "puntero estático"? –

+0

@KonradRudolph yup, leí mal la pregunta. Editado ahora. –

+1

El último caso se denomina variable con "alcance de función y duración de almacenamiento estático", no "ámbito de método global". –

5

Significa que esta variable no se puede utilizar fuera de este módulo.

E.g. - no se puede hacer referencia a este puntero de otro archivo utilizando

extern struct node *first; 

Una nota importante es que la estructura no es estática, solamente first que es un puntero a dicha estructura es estática.

+0

También puede ser una variable estática dentro de un método. –

+0

@LuchianGrigore - cierto, no tomó eso en cuenta. – MByD

2

No afecta la definición de la estructura en sí. Simplemente significa que la instancia particular de la estructura, llamada first aquí, tiene un enlace interno.

+0

¿No te refieres a la vinculación interna? –

+0

Por qué, sí, lo hago. :) –

0

La palabra clave estática para una variable global hace que la variable sea local para el módulo en el que está definida. Es decir. no puedes acceder desde otro módulo.

Si la variable estática se define dentro de una función, mantiene la variable activa y actualizada entre las llamadas a esta función.

0

Cuando se modifica una variable, la palabra clave estática especifica que la variable tiene una duración estática (se asigna cuando el programa comienza y se desasigna cuando el programa finaliza) y la inicializa en 0 a menos que se especifique otro valor. Al modificar una variable o función en el ámbito del archivo, la palabra clave estática especifica que la variable o función tiene una vinculación interna (su nombre no es visible desde fuera del archivo en el que se declara).

Una variable declarada estática en una función conserva su estado entre llamadas a esa función.

Al modificar un miembro de datos en una declaración de clase, la palabra clave static especifica que todas las instancias de la clase comparten una copia del miembro. Al modificar una función de miembro en una declaración de clase, la palabra clave estática especifica que la función solo accede a miembros estáticos.

Los miembros de datos estáticos de las clases se deben inicializar en el alcance del archivo.

En código recursivo, se garantiza que un objeto estático o variable tiene el mismo estado en diferentes instancias de un bloque de código.

Los miembros de una unión no se pueden declarar como estáticos. Una unión anónima declarada globalmente debe declararse explícitamente estática.

Los objetos y variables definidos fuera de todos los bloques tienen una vida útil estática y un enlace externo por defecto. Un objeto o variable global que se declara explícitamente como estático tiene un enlace interno.

+1

** Estático no significa eso. ** De hecho, está asignado en almacenamiento estático, no en el montón o la pila. –

Cuestiones relacionadas