1.在32位的平台上,默认都是按4字节对齐的。 64位的平台 默认是8字节
2.对于成员变量,各自在自己的自然边界上对齐。//整个结构体的对齐
3.如果 成员变量中有比4字节大。此时 整个结构体按照4字节对齐。
4.如果 成员变量中没有有比4字节大。 此时 整个结构体按照最大的那个成员对齐。
注意:
1.结构体类型,可以定义在 函数里面,但是此时作用域就被限定在改函数中
2.结构体的定义的形式:
形式1: 先定义类型,后定义变量
struct stu
{
...
};
struct stu s;
形式2: 定义类型的同时定义变量
struct stu
{
...
}s1,s2,*s3,s4[10];
struct stu s;
形式3:省略了类型名 --如果只用一次,可以这样写
struct
{
...
}s1,s2,*s3,s4[10];
1、语法: union 共用体名
{
成员列表; //各个变量
}; //表示定义一个共用体类型
2、注意:
1.共用体初始化 --- 只能给一个值,默认是给到第一个成员变量的
2.共用体成员变量赋值—共用体用的数据最终存储的 --- 应该是最后一次给到的值。
但是只能影响到 自己数据类型对应的空间中的数据
3.可以判断大小端
4.实际用途:a.节省空间 b.进行数据转换
5.共用体的大小 --是成员变量中最大的那个成员的大小
6.共用体类型可以是函数参数,也可以是函数返回值类型
枚举:一枚一枚列举 、逐个列举
如果一个变量只有几种可能的值,则可以定义为枚举类型(如一周的七天)。所谓“枚举”是指将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。
语法:声明枚举类型用enum 开头。
如:打印出对应的英文的星期
enum weekday
{
sun,
mon,
tue,
wed,
thu,
fri,
sat
};
注意:
1.枚举 提高了代码可读性
2.枚举 本质上是int类型 、枚举 与 整型 类型兼容
3.不足
因为枚举类型 --- 本质上是个整型类型,所以枚举类型的变量的值,并不能真正限定在指定的哪些值范围中
4.枚举类型 可以做函数 形参 和 返回值,定义数组也可以,本质上就是整型数据
练习:
无人机的状态
0 --flying
1 --stop
2 --holding
从键盘输入0~2 打印无人机的状态
#include
enum plain
{
flying,
stop,
holding
};
int main(void)
{
int i;
printf("Input a num to decide the airplina condition: \n");
scanf("%d",&i);
switch (i)
{
case flying:
printf("The airplina is flying!\n");
break;
case stop:
printf("The airplina stoped.\n");
break;
case holding:
printf("The airplina holds on flying.\n");
break;
}
return 0;
}
数据结构:数据的组织形式 (逻辑上理解的形式)
1、数组: 顺序表
优点:随机访问 方便
缺点:增加数据 不方便,删除数据 不方便
2、链表:链式的数据表
优点:增加 删除数据很方便
缺点:找数据不大方便
3、计算机如何体现链式数据结构?
存放链式数据的结构: 节点:[数据|另外一个节点指针]
例如:学生信息
节点:
struct Node
{
//数据域
struct stu s;
//指针域
struct Node *p; //指针类型
};
4、操作
(1)创建一个链表 -- 空链表
strcut Node head = {0,NULL}
struct Node *p = &head
空链表的特点:
只有头节点,并且头节点的指针域 为NULL。 // 相当于是尾节点
(2).插入
创建一个新的节点 、节点链接起来
思路:
s1.创建一个新的节点
s2.找到尾节点
s3.链接到尾节点后面
void pushBack(struct Node *head,int data)
{
//1、创建一个新的节点
struct Node *pNew = malloc(sizeof(struct Node));//堆区开辟空间放入
pNew->data = data;
//2、找到尾节点
struct Node *p = head;//此时p在头节点
while (p->next != NULL)//找空地址所在的节点就是尾节点
{
p = p->next;//让p指向下一个节点,再次判断
}
//3、连接到找到的尾节点后面
p->next = pNew;
pNew->next = NULL;//设置为尾节点
}
#include
#include
struct Node
{
int data;
struct Node *next;
};
int isEmpty(struct Node *head)
{
if (head->next == NULL)
{
return 1;
}else
{
return 0;
}
}
int len(struct Node *head)
{
struct Node *p = head->next;
int cnt = 0;
while (p != NULL)
{
cnt++;
p = p->next;
}
return cnt;
}
int main(void)
{
struct Node head;
head.next = NULL;//空链表
pushBack(&head,1);
pushBack(&head,2);
pushBack(&head,3);
pushBack(&head,4);
pushBack(&head,5);
printf("%d\n",len(&head));
return 0;
}
1.创建新节点
2.链接
void pushFront(struct Node *head,int data)
{
struct Node *pNew = malloc(sizeof(struct Node));
pNew->data = data;
struct Node *p = head;
pNew->next = head->next;
p->next = pNew;
}