Una estructura en el lenguaje de programación C (y muchos derivados) es una declaración de tipo de datos compuestos (o registro ) que define una lista agrupada físicamente de variables bajo un nombre en un bloque de memoria, lo que permite acceder a las diferentes variables a través de un solo puntero o por el nombre de estructura declarado que devuelve la misma dirección. El tipo de datos de estructura puede contener otros tipos de datos, por lo que se utiliza para registros de tipos de datos mixtos, como una entrada de directorio del disco duro (longitud del archivo, nombre, extensión, dirección física, etc.) u otros registros de tipo mixto (nombre , dirección, teléfono, saldo, etc.).
La estructura C hace referencia directamente a un bloque contiguo de memoria física, generalmente delimitado (dimensionado) por límites de longitud de palabra. Corresponde a la función de nombre similar disponible en algunos ensambladores para procesadores Intel. Al ser un bloque de memoria contigua, cada campo dentro de una estructura se ubica en un cierto desplazamiento fijo desde el principio.
Debido a que el contenido de una estructura se almacena en la memoria contigua, el operador sizeof debe usarse para obtener el número de bytes necesarios para almacenar un tipo particular de estructura, al igual que se puede usar para primitivas . La alineación de campos particulares en la estructura (con respecto a los límites de las palabras ) es específica de la implementación y puede incluir relleno, aunque los compiladores modernos suelen admitir la #pragma pack
directiva, que cambia el tamaño en bytes utilizados para la alineación. [1]
En el lenguaje C ++ , una estructura es idéntica a una clase C ++ pero tiene una visibilidad predeterminada diferente: los miembros de la clase son privados por defecto, mientras que los miembros de la estructura son públicos por defecto.
En otros idiomas
El tipo de datos de estructura en C se derivó del tipo de datos de estructura ALGOL 68 . [2]
Como su contraparte de C, el tipo de datos de estructura en C # ( Estructura en Visual Basic .NET ) es similar a una clase . La mayor diferencia entre una estructura y una clase en estos lenguajes es que cuando una estructura se pasa como argumento a una función, cualquier modificación a la estructura en esa función no se reflejará en la variable original (a menos que se pase por referencia usó). [3]
Esto difiere de C ++, donde las clases o estructuras se pueden asignar estáticamente o dinámicamente en la pila (similar a C #) o en el montón, con un puntero explícito. En C ++ , la única diferencia entre una estructura y una clase es que los miembros y las clases base de una estructura son públicos de forma predeterminada. (Una clase definida con la class
palabra clave tiene miembros privados y clases base de forma predeterminada).
Declaración
La sintaxis general para una declaración de estructura en C es:
struct tag_name { type member1 ; type member2 ; / * declarar tantos miembros como desee, pero el compilador debe conocer el tamaño completo de la estructura. * / };
Aquí tag_name
es opcional en algunos contextos.
Dicha struct
declaración también puede aparecer en el contexto de una declaración typedef de un alias de tipo o la declaración o definición de una variable:
typedef struct tag_name { type member1 ; type member2 ; } struct_alias ;
Inicialización
Hay tres formas de inicializar una estructura. Para el struct
tipo
/ * Declara la estructura con miembros enteros x, y * / punto de estructura { int x ; int y ; };
Los inicializadores de estilo C89 se utilizan cuando se pueden proporcionar miembros contiguos. [4]
/ * Definir una variable p de tipo point e inicializar sus dos primeros miembros en su lugar * / struct point p = { 1 , 2 };
Para la lista de miembros no contiguos o fuera de orden, se puede usar el estilo de inicializador designado [5]
/ * Definir una variable p de tipo punto, y establecer miembros usando inicializadores designados * / struct point p = { . y = 2 , . x = 1 };
Si se proporciona un inicializador o si el objeto está asignado estáticamente , los elementos omitidos se inicializan a 0. [6]
Una tercera forma de inicializar una estructura es copiar el valor de un objeto existente del mismo tipo
/ * Defina una variable q de tipo punto, y establezca los miembros con los mismos valores que los de p * / estructura punto q = p ;
Asignación
Una estructura puede asignarse a otra estructura. Un compilador podría utilizar memcpy()
para realizar tal asignación.
punto de estructura { int x ; int y ; };int main ( void ) { punto de estructura p = { 1 , 3 }; / * variable inicializada * / punto de estructura q ; / * no inicializado * / q = p ; / * copia los valores de los miembros de p en q * / return 0 ; }
Punteros para estructurar
Los punteros se pueden utilizar para hacer referencia a un struct
por su dirección. Esto es útil para pasar estructuras a una función. El puntero se puede desreferenciar utilizando el *
operador. El ->
operador elimina la referencia del puntero a la estructura (operando izquierdo) y luego accede al valor de un miembro de la estructura (operando derecho).
punto de estructura { int x ; int y ; }; punto de estructura mi_punto = { 3 , 7 }; punto de estructura * p = & mi_punto ; / * p es un puntero a my_point * / ( * p ). x = 8 ; / * establece el primer miembro de la estructura * / p -> x = 8 ; / * método equivalente para establecer el primer miembro de la estructura * /
Ver también
Referencias
- ^ "Diseño de memoria de estructura en C" . Desbordamiento de pila .
- ^ Ritchie, Dennis M. (marzo de 1993). "El desarrollo del lenguaje C" . Avisos ACM SIGPLAN . 28 (3): 201-208. doi : 10.1145 / 155360.155580 .
El esquema de composición tipográfica adoptado por C tiene una deuda considerable con Algol 68, aunque quizás no surgió en una forma que los partidarios de Algol aprobarían. La noción central que capturé de Algol fue una estructura de tipos basada en tipos atómicos (incluidas las estructuras), compuesta en matrices, punteros (referencias) y funciones (procedimientos). El concepto de uniones y elencos de Algol 68 también tuvo una influencia que apareció más tarde.
- ^ "Parámetro pasando en C #" .
- ^ Kelley, Al; Pohl, Ira (2004). Un libro sobre C: Programación en C (Cuarta ed.). págs. 418 . ISBN 0-201-18399-4.
- ^ "Compiladores de IBM Linux. Inicialización de estructuras y uniones" .
- ^ "El nuevo estándar C, §6.7.8 Inicialización" .