estructura y unión del lenguaje c

Estructura

Conocimientos básicos de estructura

  1. La diferencia entre estructura y matriz.
    Inserte la descripción de la imagen aquí
  2. Crea una estructura
struct student  //学生的数据类型
{
    
    
	char name[10];
	int age;

};

También puede crear punteros de estructura y matrices de estructura


struct student* p; //结构体指针 ++跳过一整个结构体
struct student arr[10]; // 结构体数组 存放10个
  1. Acceso a la estructura
    Inserte la descripción de la imagen aquí
    Nota:
#include<stdio.h>

struct student
{
    
    
	char name[20];
	int age;
}x,*p;

int main()
{
    
    
	
	if (p == &x)
	{
    
    
		printf("haha");
	}
	return 0;
}

Aquí
p es diferente de & x. P es un puntero de estructura pero es un puntero nulo, que es equivalente al siguiente comportamiento

int a;

& x es un puntero de estructura que apunta ax después de que la dirección de x se guarda con un puntero de estructura.

  1. El uso de
    typedef typedef puede simplificar un nombre de variable de estructura
typedef struct book
{
    
    
	char name[10];
	int price;
} book;


int main()
{
    
    
	book x[10] = {
    
     0 };
	return 0;
}

Ahora el libro es un tipo de estructura.

  1. Acceso directo a la estructura
typedef struct book
{
    
    
	char name[10];
	int price;
} book;


int main()
{
    
    
	book x[10] = {
    
     0 };
	x[1].name[10] = "abcd";  //通过 点操作符访问
	return 0;
}
  1. Acceso indirecto mediante puntero
typedef struct
{
    
    
	char name[10];
	int price;
}book;

void fun(book* pc)
{
    
    
	pc->price =10;
	printf("%d",pc->price);
}


int main()
{
    
    
	 book x[10] = {
    
     0 };
	
	 fun(x);
	return 0;
}

Puntero de estructura

Inserte la descripción de la imagen aquí

struct stu
{
    
    
	char name[10];
	int age;
};

int main()
{
    
    
	
	struct stu *p;


	return 0;
}

p es un puntero a una estructura p + 1 puede saltar a la siguiente estructura
* p + 1 esta es una operación ilegal
* p y p * P es la estructura completa p es un puntero de estructura

#include<stdio.h>

struct stu
{
    
    
	char name[10];
	int age;
}x;

int main()
{
    
    
	
	struct stu *p=&x;
	p->age = 10; // 可以这样 指针指向
	(*p).age=10; // 可以解引用得到 x
	return 0;
}
  1. Acceso del puntero de estructura a la estructura anidada
#include<stdio.h>

struct stu
{
    
    
	int arr[2];
	int age;
};

struct ptu
{
    
    
	int a;
	int b;
	struct stu sr ;
}s;

int main()
{
    
    
	struct ptu* p = &s;
	p->sr.age;
	return 0;
}

Inserte la descripción de la imagen aquí

Asignación de memoria de estructura

En primer lugar, ¿qué generará este código?

struct S1
{
    
    
	char c1;
	int i;
	char c2;
};
int main()
{
    
    
printf("%d\n", sizeof(struct S1));
return 0;
}

Inserte la descripción de la imagen aquí
La salida 12 no debería ser 1 + 4 + 1 = 6. Se puede ver que la memoria de estructura se almacena de manera diferente.

12. 第一个成员在与结构体变量偏移量为0的地址处。
13. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。

VS中默认的值为8
Linux中的默认值为4
14. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
15. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍                                                 
16. 结构体的整体大小就是所 有最大对齐数(含嵌套结构体的对齐数)的整数倍。

Inserte la descripción de la imagen aquí

Verde carboncillo azul inútil memoria rojo int

articulación

Empuja aquí para unir

Supongo que te gusta

Origin blog.csdn.net/qq_45849625/article/details/115003975
Recomendado
Clasificación