c语言 结构和联合

结构体

结构体基础知识

  1. 结构体和数组的差别
    在这里插入图片描述
  2. 创建一个结构体
struct student  //学生的数据类型
{
    
    
	char name[10];
	int age;

};

也可以创建结构体指针 和结构体数组


struct student* p; //结构体指针 ++跳过一整个结构体
struct student arr[10]; // 结构体数组 存放10个
  1. 结构体的访问
    在这里插入图片描述
    注意:
#include<stdio.h>

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

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

这里的 p和&x 不一样
p是个结构体指针 但是他是一个空指针 等价与以下这种行为

int a;

&x 是x的地址 用结构体指针保存后 是一个指向x的结构体指针。

  1. typedef的使用
    typedef 可以简化一个结构体变量名称
typedef struct book
{
    
    
	char name[10];
	int price;
} book;


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

现在 book 就是一个结构类型。

  1. 结构体 的直接访问
typedef struct book
{
    
    
	char name[10];
	int price;
} book;


int main()
{
    
    
	book x[10] = {
    
     0 };
	x[1].name[10] = "abcd";  //通过 点操作符访问
	return 0;
}
  1. 通过指针间接访问
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;
}

结构体指针

在这里插入图片描述

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

int main()
{
    
    
	
	struct stu *p;


	return 0;
}

p是一个指向结构体的指针 p+1 可以跳到下一个结构体
*p+1这是非法操作
*p 和p *P 是整个结构体 p是一个结构体指针

#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. 结构体指针访问 嵌套结构体
#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;
}

在这里插入图片描述

结构体的内存分配

首先 这个代码会输出什么呢?

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

在这里插入图片描述
输出 12 不应该是 1+4+1=6嘛 可见 结构体内存存放不一样

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

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

在这里插入图片描述

绿色 char 蓝色 无用内存 红色 int

联合

戳这里联合

猜你喜欢

转载自blog.csdn.net/qq_45849625/article/details/115003975