La estructura en C es un tipo de datos definido por el usuario que se puede utilizar para agrupar elementos de tipos posiblemente diferentes en un solo tipo. El palabra clave de estructura se utiliza para definir la estructura en el lenguaje de programación C. Los elementos de la estructura se denominan miembro y pueden ser de cualquier tipo de datos válido.
Declaración de estructura C
Tenemos que declarar la estructura en C antes de usarla en nuestro programa. En la declaración de estructura, especificamos sus variables miembro junto con su tipo de datos. Podemos usar la palabra clave struct para declarar la estructura en C usando la siguiente sintaxis:
Sintaxis
struct structure_name { data_type member_name1; data_type member_name1; .... .... };> La sintaxis anterior también se denomina plantilla de estructura o prototipo de estructura y no se asigna memoria a la estructura en la declaración.
Definición de estructura C
Para utilizar la estructura en nuestro programa, tenemos que definir su instancia. Podemos hacerlo creando variables del tipo de estructura. Podemos definir variables de estructura usando dos métodos:
1. Declaración de variables de estructura con plantilla de estructura
struct structure_name { data_type member_name1; data_type member_name1; .... .... } variable1, varaible2, ... ;> 2. Declaración de variable de estructura después de la plantilla de estructura
// structure declared beforehand struct structure_name variable1, variable2 , .......;>
Miembros de la estructura de acceso
Podemos acceder a los miembros de la estructura utilizando el ( . ) operador de punto.
Sintaxis
structure_name.member1; strcuture_name.member2;>
En el caso de que tengamos un puntero a la estructura, también podemos usar el operador de flecha para acceder a los miembros.
Inicializar miembros de estructura
Miembros de la estructura no puede ser inicializado con la declaración. Por ejemplo, el siguiente programa en C falla en la compilación.
struct Point { int x = 0; // COMPILER ERROR: cannot initialize members here int y = 0; // COMPILER ERROR: cannot initialize members here };> El motivo del error anterior es simple. Cuando se declara un tipo de datos, no se le asigna memoria. La memoria se asigna solo cuando se crean variables.
Podemos inicializar miembros de la estructura de 3 maneras que son las siguientes:
- Usando el operador de asignación.
- Usando la lista de inicializadores.
- Uso de la lista de inicializadores designados.
1. Inicialización mediante el operador de asignación
struct structure_name str; str.member1 = value1; str.member2 = value2; str.member3 = value3; . . .>
2. Inicialización mediante la lista de inicializadores
struct structure_name str = { value1, value2, value3 };> En este tipo de inicialización, los valores se asignan en orden secuencial tal como se declaran en la plantilla de estructura.
3. Inicialización utilizando la lista de inicializadores designados
La inicialización designada permite inicializar los miembros de la estructura en cualquier orden. Esta característica se ha agregado en el estándar C99.
struct structure_name str = { .member1 = value1, .member2 = value2, .member3 = value3 };> La inicialización designada solo se admite en C pero no en C++.
Ejemplo de estructura en C
El siguiente programa en C muestra cómo utilizar estructuras.
C
// C program to illustrate the use of structures> #include> > // declaring structure with name str1> struct> str1 {> >int> i;> >char> c;> >float> f;> >char> s[30];> };> > // declaring structure with name str2> struct> str2 {> >int> ii;> >char> cc;> >float> ff;> } var;>// variable declaration with structure template> > // Driver code> int> main()> {> >// variable declaration after structure template> >// initialization with initializer list and designated> >// initializer list> >struct> str1 var1 = { 1,>'A'>, 1.00,>'techcodeview.com'> },> >var2;> >struct> str2 var3 = { .ff = 5.00, .ii = 5, .cc =>'a'> };> > >// copying structure using assignment operator> >var2 = var1;> > >printf>(>'Struct 1:
i = %d, c = %c, f = %f, s = %s
'>,> >var1.i, var1.c, var1.f, var1.s);> >printf>(>'Struct 2:
i = %d, c = %c, f = %f, s = %s
'>,> >var2.i, var2.c, var2.f, var2.s);> >printf>(>'Struct 3
i = %d, c = %c, f = %f
'>, var3.ii,> >var3.cc, var3.ff);> > >return> 0;> }> |
>
>Producción
Struct 1: i = 1, c = A, f = 1.000000, s = techcodeview.com Struct 2: i = 1, c = A, f = 1.000000, s = techcodeview.com Struct 3 i = 5, c = a, f = 5.000000>
typedef para estructuras
El definición de tipo La palabra clave se utiliza para definir un alias para el tipo de datos ya existente. En estructuras, tenemos que usar la palabra clave struct junto con el nombre de la estructura para definir las variables. A veces, esto aumenta la longitud y la complejidad del código. Podemos usar typedef para definir algún nuevo nombre más corto para la estructura.
Ejemplo
C
// C Program to illustrate the use of typedef with> // structures> #include> > // defining structure> struct> str1 {> >int> a;> };> > // defining new name for str1> typedef> struct> str1 str1;> > // another way of using typedef with structures> typedef> struct> str2 {> >int> x;> } str2;> > int> main()> {> >// creating structure variables using new names> >str1 var1 = { 20 };> >str2 var2 = { 314 };> > >printf>(>'var1.a = %d
'>, var1.a);> >printf>(>'var2.x = %d'>, var2.x);> > >return> 0;> }> |
>
>Producción
var1.a = 20 var2.x = 314>
Estructuras anidadas
El lenguaje C nos permite insertar una estructura dentro de otra como miembro. Este proceso se llama anidamiento y dichas estructuras se denominan estructuras anidadas. Hay dos formas en las que podemos anidar una estructura en otra:
1. Anidamiento de estructuras integradas
En este método, la estructura que se anida también se declara dentro de la estructura principal.
Ejemplo
struct parent { int member1; struct member_str member2 { int member_str1; char member_str2; ... } ... }> 2. Anidamiento de estructuras separadas
En este método, se declaran dos estructuras por separado y luego la estructura miembro se anida dentro de la estructura principal.
Ejemplo
struct member_str { int member_str1; char member_str2; ... } struct parent { int member1; struct member_str member2; ... }> Una cosa a tener en cuenta aquí es que la declaración de la estructura siempre debe estar presente antes de su definición como miembro de la estructura. Por ejemplo, el la siguiente declaración no es válida ya que la estructura mem no está definida cuando se declara dentro de la estructura principal.
struct parent { struct mem a; }; struct mem { int var; };> Acceder a miembros anidados
Podemos acceder a miembros anidados usando el mismo operador de punto (.) dos veces como se muestra:
str_parent.str_child .member;>
Ejemplo de anidamiento de estructuras
C
// C Program to illustrate structure nesting along with> // forward declaration> #include> > // child structure declaration> struct> child {> >int> x;> >char> c;> };> > // parent structure declaration> struct> parent {> >int> a;> >struct> child b;> };> > // driver code> int> main()> {> >struct> parent var1 = { 25, 195,>'A'> };> > >// accessing and printing nested members> >printf>(>'var1.a = %d
'>, var1.a);> >printf>(>'var1.b.x = %d
'>, var1.b.x);> >printf>(>'var1.b.c = %c'>, var1.b.c);> > >return> 0;> }> |
cómo llamar a un método en java
>
>Producción
var1.a = 25 var1.b.x = 195 var1.b.c = A>
Puntero de estructura en C
Podemos definir un puntero que apunte a la estructura como cualquier otra variable. Estos indicadores generalmente se denominan Punteros de estructura . Podemos acceder a los miembros de la estructura apuntados por el puntero de estructura usando el ( -> ) operador de flecha.
Ejemplo de puntero de estructura
C
// C program to illustrate the structure pointer> #include> > // structure declaration> struct> Point {> >int> x, y;> };> > int> main()> {> >struct> Point str = { 1, 2 };> > >// p2 is a pointer to structure p1> >struct> Point* ptr = &str;> > >// Accessing structure members using structure pointer> >printf>(>'%d %d'>, ptr->x, ptr->y);> > >return> 0;> }> |
>
>Producción
1 2>
Estructuras autorreferenciales
Las estructuras autorreferenciales en C son aquellas estructuras que contienen referencias al mismo tipo que ellas mismas, es decir, contienen un miembro del puntero de tipo que apunta al mismo tipo de estructura.
opacidad de transición css
Ejemplo de estructuras autorreferenciales
struct structure_name { data_type member1; data_type member2; struct structure_name* str; }> C
// C program to illustrate the self referential structures> #include> > // structure template> typedef> struct> str {> >int> mem1;> >int> mem2;> >struct> str* next;> }str;> > // driver code> int> main()> {> >str var1 = { 1, 2, NULL };> >str var2 = { 10, 20, NULL };> > >// assigning the address of var2 to var1.next> >var1.next = &var2;> > >// pointer to var1> >str *ptr1 = &var1;> > >// accessing var2 members using var1> >printf>(>'var2.mem1: %d
var2.mem2: %d'>, ptr1->siguiente->mem1,> >ptr1->siguiente->mem2);> > >return> 0;> }> |
>
>Producción
var2.mem1: 10 var2.mem2: 20>
Este tipo de estructuras se utilizan en diferentes estructuras de datos, como para definir los nodos de listas vinculadas, árboles, etc.
Relleno y embalaje de estructura C
Técnicamente, el tamaño de la estructura en C debería ser la suma de los tamaños de sus miembros. Pero puede que no sea cierto en la mayoría de los casos. La razón de esto es el relleno de estructura.
Acolchado de estructura es el concepto de agregar múltiples bytes vacíos en la estructura para alinear naturalmente los miembros de datos en la memoria. Se hace para minimizar los ciclos de lectura de la CPU para recuperar diferentes miembros de datos en la estructura.
Hay algunas situaciones en las que necesitamos empaquetar firmemente la estructura eliminando los bytes vacíos. En tales casos, utilizamos Embalaje de estructura. El lenguaje C proporciona dos formas de empaquetar estructuras:
- Usando el paquete #pragma(1)
- Usando __attribute((empaquetado))__
Ejemplo de relleno y embalaje de estructura
C
// C program to illustrate structure padding and packing> #include> > // structure with padding> struct> str1 {> >char> c;> >int> i;> };> > struct> str2 {> >char> c;> >int> i;> } __attribute((packed)) __;>// using structure packing> > // driver code> int> main()> {> > >printf>(>'Size of str1: %d
'>,>sizeof>(>struct> str1));> >printf>(>'Size of str2: %d
'>,>sizeof>(>struct> str2));> >return> 0;> }> |
>
>Producción
Size of str1: 8 Size of str2: 5>
Como podemos ver, el tamaño de la estructura varía cuando se realiza el empaque de la estructura.
Para saber más sobre el relleno y el embalaje de la estructura, consulte este artículo: los campos de bits se utilizan para especificar la longitud de los miembros de la estructura en bits. Cuando conocemos la longitud máxima del miembro, podemos usar campos de bits para especificar el tamaño y reducir el consumo de memoria.
Sintaxis de campos de bits
struct structure_name { data_type member_name : width_of_bit-field; };> Ejemplo de campos de bits
C
// C Program to illustrate bit fields in structures> #include> > // declaring structure for reference> struct> str1 {> >int> a;> >char> c;> };> > // structure with bit fields> struct> str2 {> >int> a : 24;>// size of 'a' is 3 bytes = 24 bits> >char> c;> };> > // driver code> int> main()> {> >printf>(>'Size of Str1: %d
Size of Str2: %d'>,> >sizeof>(>struct> str1),>sizeof>(>struct> str2));> >return> 0;> }> |
>
>Producción
Size of Str1: 8 Size of Str2: 4>
Como podemos ver, el tamaño de la estructura se reduce cuando se usa el campo de bits para definir el tamaño máximo del miembro 'a'.
Usos de la estructura en C
Las estructuras C se utilizan para lo siguiente:
- La estructura se puede utilizar para definir los tipos de datos personalizados que se pueden utilizar para crear algunos tipos de datos complejos, como fechas, horas, números complejos, etc., que no están presentes en el idioma.
- También se puede utilizar en la organización de datos donde se puede almacenar una gran cantidad de datos en diferentes campos.
- Las estructuras se utilizan para crear estructuras de datos como árboles, listas vinculadas, etc.
- También se pueden utilizar para devolver múltiples valores de una función.
Limitaciones de las estructuras C
En lenguaje C, las estructuras proporcionan un método para empaquetar datos de diferentes tipos. Una estructura es una herramienta útil para manejar un grupo de elementos de datos relacionados lógicamente. Sin embargo, las estructuras C también tienen algunas limitaciones.
- Mayor consumo de memoria: Se debe al relleno de la estructura. Sin ocultación de datos: las estructuras C no permiten ocultar datos. Cualquier función puede acceder a los miembros de la estructura, en cualquier lugar del alcance de la estructura. Funciones dentro de la estructura: las estructuras C no permiten funciones dentro de la estructura, por lo que no podemos proporcionar las funciones asociadas. Miembros estáticos: la estructura C no puede tener miembros estáticos dentro de su cuerpo. Creación de construcción en Estructura: Las Estructuras en C no pueden tener un constructor dentro de Estructuras.
Artículos relacionados
- Estructuras C frente a estructuras C++
