Combinación de tipo personalizado en lenguaje C

Combinación de tipo personalizado en lenguaje C

Hace mucho tiempo que no actualizo mi blog, y estoy un poco oxidado. Durante este período de tiempo, aunque el blog se ha detenido, sigo aprendiendo.Hoy, quiero presentarles tipos personalizados en lenguaje C.
inserte la descripción de la imagen aquí

estructura

1. ¿Qué es una estructura?

	在生活中,很多的复杂对象无法用C语言的某一种数据类型来描述,比如一个学生它有自己的名字,性别,年龄。这些信息我们无法用某一种基本数据类型来描述,那么我们可以用结构体将这些信息整合到一起。比如这样:
struct student
{
    
    
    char name[20];//名字
    int age;//年龄
    char sex[5];//性别
};//注意千万不能少分号

Así que hemos declarado con éxito una estructura.

2. ¿Cómo acceder a los miembros de la estructura?

En general, hay dos métodos de acceso de la siguiente manera:

​ 1. Podemos usar el símbolo de acceso a la estructura (.), el operador de acceso a miembros es un punto entre el nombre de la variable de estructura y el miembro de estructura al que queremos acceder. Echemos un vistazo al ejemplo a continuación.

#include <stdio.h>
#include <string.h>

struct student
{
    
    
    char name[20];
    int age;
    char sex[5];
};

int main()
{
    
    
 	struct student s1;
    strcpy(s1.name, "张三");
    s1.age = 18;
    strcpy(s1.sex, "男");
    printf("%s\t%d\t%s\n", s1.name, s1.age, s1.sex);
    return 0;
}

Los resultados son los siguientes:
inserte la descripción de la imagen aquí
2. También podemos usar el puntero de estructura a la estructura para acceder a los miembros de la estructura. Un ejemplo es el siguiente:

#include <stdio.h>
#include <string.h>

struct student
{
    
    
    char name[20];
    int age;
    char sex[5];
};

int main()
{
    
    
 	struct student s1;
    struct student* p = &s1;
    strcpy(p->name, "张三");
    p->age = 18;
    strcpy(p->sex, "男");
    printf("%s\t%d\t%s\n", s1.name, s1.age, s1.sex);
    return 0;
}

3. Cómo calcular el tamaño de la estructura

Primero veamos esta estructura.

struct s1
{
    
    
    char c1;
    int i;
    char c2;
};
printf("%d",sizeof(struct s1));

¿Cuál crees que es el tamaño de esta estructura? Si simplemente agrega el tamaño del tipo, entonces el tamaño de esta estructura debería ser 6, así que intentémoslo, ¿cuál es el resultado?

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

¿Por qué 12? ? ? ? ? ?

Busqué a izquierda y derecha en Internet. Finalmente encontré la verdad del asunto. Resulta que hay una operación de alineación de estructura para la estructura, entonces, ¿qué es la alineación de estructura?

En resumen, cuando los miembros de la estructura se almacenan en la memoria, no se ordenan simplemente, sino que siguen una determinada regla. A continuación, permítanme desentrañar el misterio de este maravilloso fenómeno.

结构体对齐的规则:
    1,第一个成员在与结构体变量偏移量为0的地址处。
    2,其他成员变量要对齐到对齐数的整数倍的地址处。
    3,结构体总大小为最大对齐数(每个成员都有自己的对齐数)的整数倍
    4,如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍,结构体		   的大小就是所有最大对齐数的整数倍

Primero déjame explicar algunos términos:

Offset: se refiere a la diferencia entre la dirección del miembro de la estructura y el primer miembro de la estructura.

Alineación: el valor más pequeño del número de alineación predeterminado del compilador y el tamaño del miembro.

Veamos cómo se calcula la estructura anterior.

struct s1
{
    
                 成员大小  默认对齐数(这里我用的vs默认对齐数为8)   对齐数
    char c1;   1          8                                 1
    int i;     4          8                                 4
    char c2;   1          8                                 4
};

Luego, la ubicación de esta estructura en la memoria se muestra en la siguiente figura:

inserte la descripción de la imagen aquí

Según la tercera regla, el tamaño de la estructura es un múltiplo entero del número máximo de alineación, por lo que el tamaño de esta estructura es un múltiplo de 4, por lo que es 12.

今天的知识分享就到这里了,我们下次再见,拜拜

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/m0_60447315/article/details/123149783
Recomendado
Clasificación