English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutorial básico de lenguaje C

Control de flujo de lenguaje C

Funciones del lenguaje C

Arreglos del lenguaje C

Punteros del lenguaje C

Cadenas del lenguaje C

Estructura de lenguaje C

Archivo de lenguaje C

C Otros

Manual de referencia de C

Estructura struct del lenguaje C

En este tutorial, aprenderá sobre los tipos de estructuras en la programación en C. Aprenderá a definir y usar estructuras con ejemplos.

En la programación en C, a veces se necesita almacenar múltiples propiedades de entidades. Las entidades no deben tener toda la información de un solo tipo. Puede tener diferentes propiedades de diferentes tipos de datos.

Los arreglos de C permiten definir variables que pueden almacenar elementos de tipos de datos idénticos.estructuraes otro tipo de datos personalizados disponibles en C, que permite almacenar diferentes elementos de tipos de datos.

Las estructuras se utilizan para representar un registro, supongamos que desea rastrear los libros dinámicamente en una biblioteca, es posible que necesite rastrear las siguientes propiedades de cada libro:

  • Título

  • Autor

  • Tema

  • ID del libro

definir estructura

Para definir una estructura, debe usar struct palabra clave. La declaración struct define un nuevo tipo de datos que contiene varios miembros, y el formato de la declaración struct es el siguiente:

struct etiqueta { 
    miembro-list
    miembro-list 
    miembro-list  
    ...
} variable-lista ;

etiqueta es una etiqueta de estructura.

miembro-list es una definición de variable estándar, como int i; o float f, o cualquier otra definición de variable válida.

variable-list Los variables de estructura, definidas al final de la estructura, antes del último punto y coma, puede especificar una o más variables de estructura. A continuación, se muestra cómo declarar la estructura Book:

struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} book;

En general,etiqueta, miembro-list, variable-list esto 3 al menos una parte debe aparecer 2 unidades. A continuación se muestra un ejemplo:

//Esta declaración declara una estructura que tiene3miembros de la estructura,分别为整型的a,字符型的b和双精度的c
//al mismo tiempo se declara la variable de estructura s1
//Esta estructura no indica su etiqueta
struct 
{
    int a;
    char b;
    double c;
} s1;
 
//Esta declaración declara una estructura que tiene3miembros de la estructura,分别为整型的a,字符型的b和双精度的c
//La etiqueta de la estructura se llama SIMPLE, no se declara variable
struct SIMPLE
{
    int a;
    char b;
    double c;
};
//Se declara una variable de estructura con la etiqueta SIMPLE, además se declara la variable t1、t2、t3
struct SIMPLE t1, t2[20], *t3;
 
//también se puede crear un nuevo tipo con typedef
typedef struct
{
    int a;
    char b;
    double c; 
} Simple2;
//ahora se puede usar Simple2Se declara una nueva variable de estructura de tipo con la declaración de tipo
Simple2 u1, u2[20], *u3;

En la declaración anterior, las primeras dos declaraciones son tratadas como dos tipos completamente diferentes por el compilador, incluso si sus listas de miembros son iguales, si se le permite a t3=&s1es ilegal.

Los miembros de la estructura pueden contener otras estructuras, o punteros al tipo de estructura mismo, y generalmente este puntero se utiliza para implementar estructuras de datos más avanzadas como listas y árboles, etc.

//La declaración de esta estructura contiene otras estructuras
struct COMPLEX
{
    char string[100];
    struct SIMPLE a;
};
 
//La declaración de esta estructura contiene un puntero al tipo de estructura mismo
struct NODE
{
    char string[100];
    struct NODE *next_node;
};

Si dos estructuras se contienen mutuamente, se debe realizar una declaración incompleta para una de ellas, como se muestra a continuación:

struct B;    //Se debe realizar una declaración incompleta de la estructura B
 
//La estructura A contiene un puntero a la estructura B
struct A
{
    struct B *socio;
    //otros miembros;
};
 
//La estructura B contiene un puntero a la estructura A, que se declara después de que A se haya declarado.
struct B
{
    struct A *socio;
    //otros miembros;
};

Inicialización de variables de estructura

Al igual que otros tipos de variables, se puede especificar un valor inicial para una variable de estructura en el momento de su definición.

#include <stdio.h>
 
struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} book = {"Lenguaje C", "w3codebox", "Lenguaje de programación", 123456};
 
int main();
{
    printf("Título del libro:%s\nAutor:%s\nTema:%s\nID del libro:%d\n", book.title, book.author, book.subject, book.book_id);
}

El resultado de la ejecución es:}}

Título: Lenguaje de programación C
Autor: w3codebox
Tema: Lenguaje de programación
BookID 123456

Acceder a miembros de estructura

Para acceder a los miembros de la estructura, usamosoperador de acceso a miembros (.).operador de acceso a miembros es un punto entre el nombre de la variable de estructura y el miembro de la estructura que queremos acceder. Puede usar struct Palabras clave para definir variables de tipo estructura. A continuación se muestra un ejemplo de uso de estructuras:

#include <stdio.h>
#include <string.h>
 
struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};
 
int main( )
{
   struct Books Book1;        /* declaración Book1,tipo de Books */
   struct Books Book2;        /* declaración Book2,tipo de Books */
 
   /* Book1 detallar */
   strcpy( "Book1.title, "C lenguaje de programación");
   strcpy( "Book1.author, "Nuha Ali"); 
   strcpy( "Book1.subject, "C tutorial de lenguaje de programación");
   Book1.book_id = 6495407;
 
   /* Book2 detallar */
   strcpy( "Book2.title, "JAVA lenguaje de programación");
   strcpy( "Book2.author, "Seagull Ali");
   strcpy( "Book2.subject, "JAVA tutorial de lenguaje de programación");
   Book2.book_id = 6495700;
 
   /* salida Book1 información */
   printf("Book 1 Título: %s\n", Book1.title);
   printf("Book 1 Autor: %s\n", Book1.author);
   printf("Book 1 Tema: %s\n", Book1.subject);
   printf("Book 1 Número: %d\n", Book1.book_id);
 
   /* salida Book2 información */
   printf("Book 2 Título: %s\n", Book2.title);
   printf("Book 2 Autor: %s\n", Book2.author);
   printf("Book 2 Tema: %s\n", Book2.subject);
   printf("Book 2 Número: %d\n", Book2.book_id);
 
   return 0;
}

Cuando el código anterior se compila y ejecuta, se producirá el siguiente resultado:

Book 1 Título: Lenguaje de programación C
Book 1 Autor: Nuha Ali
Book 1 Tema: Tutorial de lenguaje de programación C
Book 1 Número: 6495407
Book 2 Título: Lenguaje de programación JAVA
Book 2 Autor: Seagull Ali
Book 2 Tema: Tutorial de lenguaje de programación JAVA
Book 2 Número: 6495700

Estructura como parámetro de función

Puede pasar la estructura como parámetro de función de la misma manera que otros tipos de variables o punteros. Puede acceder a la variable de estructura utilizando el método de ejemplo anterior:

#include <stdio.h>
#include <string.h>
 
struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};
 
/* declaración de función */
void printBook(struct Books book);
int main( )
{
   struct Books Book1;        /* declaración Book1,tipo de Books */
   struct Books Book2;        /* declaración Book2,tipo de Books */
 
   /* Book1 detallar */
   strcpy( "Book1.title, "C lenguaje de programación");
   strcpy( "Book1.author, "Nuha Ali"); 
   strcpy( "Book1.subject, "C tutorial de lenguaje de programación");
   Book1.book_id = 6495407;
 
   /* Book2 detallar */
   strcpy( "Book2.title, "JAVA lenguaje de programación");
   strcpy( "Book2.author, "Seagull Ali");
   strcpy( "Book2.subject, "JAVA tutorial de lenguaje de programación");
   Book2.book_id = 6495700;
 
   /* salida Book1 información */
   printBook(Book1 );
 
   /* salida Book2 información */
   printBook(Book2 );
 
   return 0;
}
void printBook(struct Books book)
{
   printf("Book título: %s\n", book.title);
   printf("Book autor: %s\n", book.author);
   printf("Book tema: %s\n", book.subject);
   printf("Book número: %d\n", book.book_id);
}

Cuando el código anterior se compila y ejecuta, se producirá el siguiente resultado:

Book título: C lenguaje de programación
Book autor: Nuha Ali
Book tema: C tutorial de lenguaje de programación
Book número de identificación: 6495407
Book título: JAVA lenguaje de programación
Book autor: Seagull Ali
Book tema: JAVA tutorial de lenguaje de programación
Book número de identificación: 6495700

Puntero a estructura

Puede definir un puntero a la estructura de la misma manera que define un puntero a otro tipo de variable, como se muestra a continuación:

struct Books *struct_pointer;

Ahora, puede almacenar la dirección de la variable de estructura en la variable de puntero definida anteriormente. Para encontrar la dirección de la variable de estructura, coloque el operador & delante del nombre de la estructura, como se muestra a continuación:

struct_pointer = &Book1;

Para acceder a los miembros de la estructura utilizando un puntero a la estructura, debe usar -operadores, como se muestra a continuación:

struct_pointer-title;

Vamos a usar punteros a estructuras para rewrite el ejemplo anterior, lo que nos ayudará a entender el concepto de punteros a estructuras:

#include <stdio.h>
#include <string.h>
 
struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};
 
/* declaración de función */
void printBook( struct Books *book );
int main( )
{
   struct Books Book1;        /* declaración Book1,tipo de Books */
   struct Books Book2;        /* declaración Book2,tipo de Books */
 
   /* Book1 detallar */
   strcpy( "Book1.title, "C lenguaje de programación");
   strcpy( "Book1.author, "Nuha Ali"); 
   strcpy( "Book1.subject, "C tutorial de lenguaje de programación");
   Book1.book_id = 6495407;
 
   /* Book2 detallar */
   strcpy( "Book2.title, "JAVA lenguaje de programación");
   strcpy( "Book2.author, "Seagull Ali");
   strcpy( "Book2.subject, "JAVA tutorial de lenguaje de programación");
   Book2.book_id = 6495700;
 
   /* mediante la transmisión de Book1 la dirección para salida Book1 información */
   printBook( &Book1 );
 
   /* mediante la transmisión de Book2 la dirección para salida Book2 información */
   printBook( &Book2 );
 
   return 0;
}
void printBook( struct Books *book )
{
   printf( "Book título: %s\n", book->title);
   printf( "Book autor: %s\n", book->author);
   printf( "Book tema: %s\n", book->subject);
   printf( "Book número de identificación: %d\n", book->book_id);
}

Cuando el código anterior se compila y ejecuta, se producirá el siguiente resultado:

Book título: C lenguaje de programación
Book autor: Nuha Ali
Book tema: C tutorial de lenguaje de programación
Book número de identificación: 6495407
Book título: JAVA lenguaje de programación
Book autor: Seagull Ali
Book tema: JAVA tutorial de lenguaje de programación
Book número de identificación: 6495700

campo de bits

Algunas información no necesita ocupar un byte completo durante el almacenamiento, sino solo unos pocos o un bit binario. Por ejemplo, al almacenar una variable de conmutador, solo se necesitan 0 y 1 dos estados, utilizando 1 El campo de bits binario es suficiente. Para ahorrar espacio de almacenamiento y facilitar el procesamiento, el lenguaje C proporciona una estructura de datos llamada "campo de bits" o "segmento de bits".

Lo que se conoce como "campo de bits" es dividir los bits de un byte en varias regiones diferentes y explicar el número de bits de cada región. Cada campo tiene un nombre de campo, que permite operar con él en el programa. De esta manera, se puede representar varios objetos diferentes con un campo de bits binario de un byte.

Ejemplo típico:}

  • Uso 1 Cuando se almacena un valor de conmutador en un bit binario, solo se utilizan 0 y 1 dos estados.

  • Lectura de formato de archivo externo - puede leer formatos de archivo no estándar. Por ejemplo:9 entero de bits.

Definición de campos bit y explicación de variables de campos bit

La definición de campos bit es similar a la definición de estructuras, y su forma es:

struct Nombre_de_la_estructura_de_campos_bit 
{
 Lista de campos bit
};

La forma de la lista de campos bit es:

Símbolo de tipo de bits: Nombre del campo bit: Longitud del campo bit

Por ejemplo:

struct bs{
    int a:8;
    int b:2;
    int c:6;
} data;

La explicación data es el variable bs, que ocupa dos bytes. De los cuales el campo bit a ocupa 8 Bits, el campo bit b ocupa 2 Bits, el campo bit c ocupa 6 Bits.

Vamos a ver otro ejemplo:

struct packed_struct {
  unsigned int f1:1;
  unsigned int f2:1;
  unsigned int f3:1;
  unsigned int f4:1;
  unsigned int type:4;
  unsigned int my_int:9;
} pack;

En este caso, packed_struct contiene 6 miembros: cuatro 1 f de bits1..f4, un 4 type y un 9 my_int de bits.

Hay algunos puntos que se deben explicar sobre la definición de campos bit:

  • Un campo bit se almacena en el mismo byte, como si el espacio restante en un byte no fuera suficiente para almacenar otro campo bit, se almacenará este campo bit desde la siguiente unidad. También se puede hacer intencionalmente que un campo bit comience desde la siguiente unidad. Por ejemplo:

    struct bs{
        unsigned a:4;
        unsigned :4;    /* Espacio vacío */
        unsigned b:4;    /* Desde la siguiente unidad de almacenamiento */
        unsigned c:4
    }

    En esta definición de campo bit, a ocupa el primer byte del 4 Bits, después 4 Bits llenar 0 significa no usar, b comienza desde el segundo byte, ocupa 4 Bits, c ocupa 4 Bits.

  • Dado que los campos bit no pueden cruzar dos bytes, la longitud de los campos bit no puede ser mayor que la longitud de un byte, es decir, no puede superar8Bits binarios. Si la longitud máxima es mayor que la longitud del entero de la computadora, algunos compiladores pueden permitir la superposición de memoria de los campos, mientras que otros compiladores pueden almacenar la parte mayor de un campo en el siguiente entero.

  • Los campos bit pueden ser campos bit anónimos, en este caso, solo se utilizan para rellenar o ajustar la posición. Los campos bit anónimos no se pueden usar. Por ejemplo:

    struct k{
        int a:1;
        int :2;    /* Este 2 Los bits no pueden usarse */
        int b:3;
        int c:2;
    };

Desde el análisis anterior, podemos ver que los campos bit, en esencia, son un tipo de estructura, aunque sus miembros se asignan en forma de bits.

Uso de los campos bit

El uso de los campos bit y el uso de los miembros de la estructura son similares, y su forma general es:

Nombre del campo bit.p Nombre del campo bit
Nombre del campo bit->Nombre del campo bit

Los campos bit permiten la salida en varios formatos.

Vea el siguiente ejemplo:

main(){
    struct bs{
        unsigned a:1;
        unsigned b:3;
        unsigned c:4;
    } bit,*pbit;
    bit.a=1;    /* Asignación de campo de bits (debe tenerse en cuenta que la asignación no puede superar el rango permitido para el campo de bits) */
    bit.b=7;    /* Asignación de campo de bits (debe tenerse en cuenta que la asignación no puede superar el rango permitido para el campo de bits) */
    bit.c=15;    /* Asignación de campo de bits (debe tenerse en cuenta que la asignación no puede superar el rango permitido para el campo de bits) */
    printf("%d,%d,%d\n",bit.a,bit.b,bit.c);    /* Salida de contenido de tres campos en formato de cantidad entera */
    pbit=&bit;    /* Envía la dirección de la variable de campo de bits bit a la variable de puntero pbit */
    pbit->a=0;    /* Asigna un nuevo valor 0 al campo de bits a mediante puntero */
    pbit->b&=3;    /* Se utiliza el operador de bit compuesto "&=". equivalente a: pbit->b=pbit->b&3,el valor original en el campo de bits b es 7,与 3 la operación lógica de bits de and da como resultado 3(111&011=011,十进制值为 3) */
    pbit->c|=1;    /* Se utiliza el operador de bit compuesto "|=". equivalente a: pbit->c=pbit->c|1,其结果为 15 */
    printf("%d,%d,%d\n",pbit->a,pbit->b,pbit->c);    /* se salida en forma de puntero a los valores de estos tres campos */
}

En el ejemplo del programa anterior se definió la estructura de campo bits bs, tres campos de bits a, b, c. Se ilustra el tipo de variable bit y el puntero a variable de tipo bs pbit. Esto significa que los campos de bits también se pueden usar con punteros.

palabra clave typedef

Usamos la palabra clave typedef para crear alias de tipos de datos. Se utiliza generalmente con estructuras para simplificar la sintaxis de declaración de variables.

Este código

struct Distance{
    int feet;
    float inch;
};
int main() {
    struct Distance d;1, d;2;
}

equivalente a

typedef struct Distance{
    int feet;
    float inch;
} distances;
int main() {
    distances d;1, d;2;
}

estructuras anidadas

Puede crear estructuras dentro de estructuras en la programación en C. Por ejemplo,

struct complex
{
 int imag;
 float real;
};
struct number
{
   struct complex comp;
   int integers;
} num;1, num;2;

假设,你要设置num2imag变量的值为11,怎么做呢?看下面示例:

num;2.comp.imag =; 11;

    Por qué usar estructuras en C?

    Supongamos que desea almacenar información sobre una persona: él/Su nombre, número de identificación y salario. Puede crear diferentes variables name, citNo y salary para almacenar esta información.

    ¿Qué pasa si necesitas almacenar la información de varias personas? Ahora, necesitas crear diferentes variables para cada información de cada persona: nombre1número de identificación civil1salario1nombre2número de identificación civil2salario2y otros.

    Una mejor manera es recopilar toda la información relevante en una estructura de nombre Person y usarla para cada persona.

    Más sobre estructuras