[Notas de estudio avanzado del lenguaje C] 4. Tipo personalizado (2) (enumeración + unión)


enumerar

¿Qué es una enumeración?

Como sugiere el nombre, una enumeración es una enumeración. Enumerar todos los valores posibles es una enumeración.

Por ejemplo, en nuestra vida real:
①Los valores posibles de una semana, de lunes a domingo, un total de 7 valores posibles
②El valor de género, masculino, femenino, confidencial, un total de 3 valores posibles ( por supuesto, también puede agregar otro valor posible, como desconocido, pero los valores posibles después de agregar aún se pueden enumerar uno por uno, un total de 4 posibilidades)
③Los valores posibles del mes, de enero a diciembre, un total de 12 valores
posibles ④ Valores posibles de colores, como rojo, naranja, amarillo, verde, azul, azul, violeta


¿Cómo definir un tipo de enumeración?

enum Day//星期
{
    
    
	Mon,
	Tues,
	Wed,
	Thur,
	Fri,
	Sat,
	sun
};
enum sex//性别
{
    
    
	MALE,
	FEMALE,
	SECRET
};
enum color//颜色--三原色 rgb
{
    
    
	RED,
	GREEN,
	BLUE
};

El día de la enumeración, el sexo de la enumeración y el color de la enumeración definidos anteriormente son todos tipos de enumeración.
Todos estos valores posibles tienen valores. El valor predeterminado comienza desde 0 y se incrementa de 1 en 1. Por supuesto, los valores iniciales también se pueden asignar cuando se definen. Estos valores se denominan constantes de enumeración.
P.ej:

enum color//颜色--三原色 rgb
{
    
    
	RED = 1,
	GREEN = 2,
	BLUE = 3
};

En este momento, los valores constantes del tipo de enumeración son 1, 2 y 3.


Ventajas de la enumeración

¿Por qué usar enumeraciones?

Podemos usar #define para definir constantes, ¿por qué tenemos que usar la enumeración?
Las ventajas de la enumeración:
1. Aumenta la legibilidad y la mantenibilidad del código
2. En comparación con el identificador definido por #define, la enumeración tiene verificación de tipo y es más riguroso
3. Evita la contaminación de nombres (encapsulación)
4. Fácil de depurar
5. Fácil de usar, puede definir múltiples constantes a la vez


uso de la enumeración

enum color//颜色
{
    
    
	RED = 1,
	GREEN = 2,
	BLUE = 4
};
enum color c1r = GREEN;//只能拿枚举常量给枚举变量赋值,才不会出现类型的差异。
clr = 5;// ok ? ?
//枚举常量和常量值是有区别的,将常量直接赋值给枚举常量类型,编译器会报错或警告

Extensión: si a un valor de un tipo de enumeración se le asigna un valor personalizado en el medio, el valor que está delante de él aún se incrementa desde 0 y el valor detrás de él se incrementa de acuerdo con el valor personalizado.
inserte la descripción de la imagen aquí
Una enumeración es un tipo que se puede usar para definir variables -- variables de enumeración, pero cuyos miembros son valores constantes -- constantes de enumeración


Tipo de unión

Definición de tipo de comunidad

Una unión es también un tipo especial autodefinido, la variable definida por este tipo también contiene una serie de miembros, los cuales se caracterizan por el hecho de que estos miembros comparten el mismo espacio (algunos libros también llaman a las uniones como uniones).

Por ejemplo:

#include<stdio.h>
	//共用体类型的声明
	union Un
{
    
    
	char c;
	int i;
};
int main()
{
    
    
	union Un u;
	printf("%d\n", sizeof(u));
	printf("%d\n", sizeof(u.c));
	printf("%d\n", sizeof(u.i));

	printf("%p\n", &u);
	printf("%p\n", &(u.c));
	printf("%p\n", &(u.i));
	return 0;
}

inserte la descripción de la imagen aquí
Análisis de la memoria:
inserte la descripción de la imagen aquí


Características de la Commonwealth

Los miembros de la unión comparten el mismo espacio de memoria, y el tamaño de dicha variable de unión es al menos el tamaño del miembro más grande (porque la unión debe al menos poder salvar al miembro más grande).


Cálculo del tamaño de la comunidad

1. El tamaño de la unión es al menos el tamaño del miembro más grande.
2. Cuando el tamaño máximo del miembro no es un múltiplo entero del número de alineación máximo, debe alinearse con un múltiplo entero del número de alineación máximo.

Ejemplo:

#include<stdio.h>
union u1
{
    
    
	char ch[5];
	int i;
};
union u2
{
    
    
	short s[7];
	int i;
};
int main()
{
    
    
	printf("%d\n", sizeof(union u1));
	printf("%d\n", sizeof(union u2));
	return 0;
}

analizar:

La matriz ch en u1 tiene 5 elementos y el tamaño es de 5 bytes, por lo que el tamaño de u1 es 5, pero debido a que 5 no es un múltiplo del número de alineación máxima 4 (int), el tamaño después de alinearse con el número de alineación máxima 4 es 8
La matriz s en u2 tiene 7 elementos y el tamaño es 7 * 2 = 14 bytes. 14 no es un múltiplo del número máximo de alineación de 4, y el tamaño es 16 después de alinearse con un múltiplo de 4.

Los resultados muestran:
inserte la descripción de la imagen aquí


Ejemplos de escenarios de aplicación de la Commonwealth

Usando las características de la unión, podemos usarla para determinar el orden de bytes endian de la computadora

#include<stdio.h>
union u1
{
    
    
	char ch;
	int i;
};

int main()
{
    
    
	union u1 a;
	a.i = 1;
	if (a.ch == 1)
		printf("小端字节序\n");
	else
		printf("大端字节序\n");
	return 0;
}

comprender:
inserte la descripción de la imagen aquí

Resumen:
Hay alineación de memoria en estructuras y uniones No hay alineación de memoria
en enumeración y segmentos de bits.

Supongo que te gusta

Origin blog.csdn.net/QIYICat/article/details/118631368
Recomendado
Clasificación