C语言笔记——自定义数据类型(结构体)

141 阅读2分钟

​​一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情

结构体:

结构体类型的声明

结构体的自引用

结构体变量的定义和初始化

结构体内存对齐

结构体传参

结构体实现位移(位段的填充&可移植性)

正文开始~

结构是一些值的集合,这些值称为成员变量,结构的每个成员可以是不同类型的变量

//声明一个结构类型
//声明一个学生类型,是想通过学生类型来创建学生变量(对象)
//描述学生:属性-名字+电话+性别

struct Stu
{
	char name[20];//名字
	char tele[12];//电话
	char sex[10];//性别
	int age;
};
struct Stu s3;//全局变量

int main() 
{
	//创建的结构体变量
	struct Stu s1;
	struct Stu s2;

	return 0;
}

特殊的声明:

匿名的结构体类型

struct 
{
	int a;
	char c;
}sa;
int main()
{
	return 0;
}

结构体的自引用:

自引用方式:

struct Node
{
	int data;//4
	struct Node* next;//4/8  存放下一个结点的地址 一整块地址被分为两部分————数据域和指针域
};

typedef

typedef struct Node
{
	int data;
	struct Node* next;
}Node;

int main()
{
	struct Node n1;
	Node n2;

	return 0;
}

struct Node这个类型存在,才可以使用struct Node*,整个类型存在,typedef才可以重命名新的类型名Node

结构体变量的定义和初始化

struct Point 
{
	int x;
	int y;
}p1;				//声明类型的同时定义变量p1
struct Point p2;	//定义结构体变量p2

初始化:

struct S
{
	char c;
	int a;
	double d;
	char arr[20];
};
int main()
{
	struct S s = { 'c',100,3.14, "hello world" };//结构体变量初始化
	printf("%c %d %lf %s\n", s.c, s.a, s.d, s.arr);
	return 0;
}

若结构体中还包含另一个结构体呢?

该如何进行初始化?  ​

struct T
{
	double weight;
	short age;
};
struct S
{
	char c;
	struct T st;
	int a;
	double d;
	char arr[20];
};
int main()
{
	//struct S s = { 'c',100,3.14, "hello world" };//结构体变量初始化
	struct S s = { 'c' , {55.6,30} , 100 , 3.14 ,  "hello world" };
	printf("%lf\n", s.st.weight);
	return 0;
}

​ ​