Lenguaje C: estructura, unión.


1. Estructura

Una estructura es una colección de elementos de diferentes tipos.

1. Declaración de estructura y definición de variable de estructura

La declaración de la estructura consta de tres partes, el nombre de la etiqueta (etiqueta), la lista de miembros (lista de miembros) y la lista de variables (lista de variables).
Si queremos declarar un tipo de estudiante, de la siguiente manera:
inserte la descripción de la imagen aquí
Si queremos definir variables, tenemos dos maneras.

  • Definir variables directamente con tipos de estructuras.
  • Definir variables en la lista de variables.

como sigue:

//在变量列表中定义变量s1,s2
struct Student
{
    
    
	char name[20];//名字
	int age;//年龄
	char sex[5];//性别
	char id[20];//学号
}s1; s2;


int main()
{
    
    
	//使用结构体类型定义变量s3
	struct Student s3;

	return 0;
}

Además, también podremos realizar declaraciones anónimas (declaraciones incompletas), de la siguiente manera:

//不完全声明
struct
{
    
    
	char c;
	short b;
	int a;
};

En este caso, queremos definir variables, sólo en la lista de variables, porque no sabemos el tipo de estructura.
como sigue:

//定义变量s1,s2,s3
struct
{
    
    
	char c;
	short b;
	int a;
}s1; s2; s3;

Si no declaramos dos estructuras idénticas exactamente, el compilador pensará que las dos estructuras son de tipos diferentes.
como sigue:

//定义变量s1,s2,s3
struct
{
    
    
	char c;
	short b;
	int a;
}s1; s2; s3;

//定义指针ps
struct
{
    
    
	char c;
	short b;
	int a;
}*ps;

int main()
{
    
    
	ps = &s1;

	return 0;
}

inserte la descripción de la imagen aquí

2. Inicialización de variables de estructura

Hay dos formas de inicializar variables de estructura.

  1. Las variables se pueden inicializar en la lista de variables.
struct Student
{
    
    
	char name[20];//名字
	int age;//年龄
	char sex[5];//性别
	char id[20];//学号
}s1 = {
    
     "李四", 20, "男", "123456" };
  1. Cuando se define con un tipo, inicializa la variable
struct Student
{
    
    
	char name[20];//名字
	int age;//年龄
	char sex[5];//性别
	char id[20];//学号
};

int main()
{
    
    
	struct Student s1 = {
    
     "李四", 20, "男", 123456 };

	return 0;
}

3. Miembros de la estructura de acceso

Para que las variables de estructura accedan a sus miembros, usamos el operador .para acceder.
Para que la variable de puntero de estructura acceda a los miembros a los que apunta, utilizamos el método de operación -> para acceder.
como sigue:

struct A
{
    
    
	char a;
	int b;
};

int main()
{
    
    
	struct A a = {
    
     0 };
	struct A* pa = &a;

	a.b = 10;
	printf("%d\n", a.b);

	pa->b = 20;
	printf("%d\n", pa->b);

	return 0;
}

El resultado es el siguiente:
inserte la descripción de la imagen aquí

4. Alineación de la memoria de las estructuras.

Para introducir la alineación de la memoria de la estructura, tenemos que calcular el tamaño de la estructura.
¿Cuál es el tamaño de la siguiente estructura?

struct A
{
    
    
	char a;
	int b;
	char c;
};

int main()
{
    
    
	printf("%d\n", sizeof(struct A));
	return 0;
}

La respuesta es 12, esto se debe a que la estructura está alineada con la memoria.
Para saber cómo se calcula 12, necesitamos dominar las reglas relevantes sobre los números alineados.

  • El primer miembro de la estructura siempre está en el desplazamiento 0.
  • Otras variables miembro deben alinearse con una dirección que sea un múltiplo entero de su número de alineación.
  • El tamaño total de la estructura es un múltiplo entero de la alineación máxima (la alineación de sus variables miembro)
  • Si una estructura está anidada, la estructura anidada se alinea con un múltiplo entero del número máximo de bytes de alineación y el tamaño total de la estructura es un múltiplo entero del número máximo de alineación (la estructura anidada también es miembro de la estructura )

Alineación = La menor entre la alineación predeterminada del compilador y el tamaño del miembro. Si el compilador no tiene una alineación predeterminada, entonces la alineación es el tamaño del propio miembro.

inserte la descripción de la imagen aquí
Hasta ahora sabemos cómo obtener 12. Pero ¿por qué debería haber alineación de la memoria?

  1. Motivos de plataforma (motivos de trasplante)
    No todas las plataformas de hardware pueden acceder a datos en cualquier dirección; algunas plataformas de hardware solo pueden recuperar ciertos tipos de datos en ciertas direcciones.

  2. Razones de rendimiento
    Las estructuras de datos (especialmente las pilas) deben estar alineadas en límites naturales tanto como sea posible.
    Para acceder a un tamaño de memoria no alineado, el procesador necesita realizar dos accesos a la memoria; un acceso a la memoria alineada requiere solo un acceso.

2. Unión (Comunidad)

Como su nombre lo indica, una unión significa que los miembros de este tipo usan el mismo espacio de memoria.
De la siguiente manera:
declarar el tipo de unión unión A, cuyos miembros son char a, int b.

union A
{
    
    
	char a;
	int b;
};

¿Cuál es entonces su tamaño?

union A
{
    
    
	char a;
	int b;
};

int main()
{
    
    
	printf("%d\n", sizeof(union A));

	return 0;
}

La respuesta es 4, ¿por qué?

  1. El tamaño del sindicato es al menos el tamaño de su miembro más grande.
  2. El tamaño de la unión también debe ser un múltiplo entero de su alineación.

inserte la descripción de la imagen aquí
Como se muestra en la figura anterior, sus miembros a y b comparten el primer byte. Si usamos el miembro b juntos cuando usamos el miembro a, ¿cuánto es a =?

union A
{
    
    
	char a;
	int b;
};


int main()
{
    
    
	union A un = {
    
     0 };
	un.a = 1;
	un.b = 10;

	printf("%d\n", un.a);

	return 0;
}

La respuesta es a = 10. Sólo necesitamos mirar los cambios en la memoria.
inserte la descripción de la imagen aquí


Resumir

inserte la descripción de la imagen aquí
Lo anterior es mi resumen de conocimientos sobre estructuras y uniones.

Supongo que te gusta

Origin blog.csdn.net/li209779/article/details/131889487
Recomendado
Clasificación