一、结构体类型
结构体类型用来描述复杂数据的一种数据类型,也是一种构造类型或用户自定义类型
1、怎么描述一个数据类型
语法:
struct 结构体名
{
成员列表;
};
(1)struct 关键字
表示是在构造一个结构体的类型
(2)结构体名
用来描述结构体这个类型的一个名称
(3)成员列表
表示要描述的复杂数据中用到的具体的成员变量,定义方式与之前变量的方式相同,多个成员变量之间用分号隔开
(4)最后有一个分号表示结束
struct student
{
char name[30];
int sno;
float score;
}//表示定义出一个数据类型
注意
(1)结构体类型的使用过程要先定义出类型再定义变量
(2)定义变量
struct 结构体名 变量名;
struct +结构体名 称为结构体类型
2、结构体初始化:
struct student s = {};
初始化看每个成员变量具体是什么数据类型,根据各个成员变量自身的数据类型进行初始化,初始化按照定义的顺序依次初始化
3、结构体变量的引用:
结构体数据引用时,一般引用到具体的成员数据,引用到成员的运算符 “.” 结构体成员运算符
使用:结构体变量名 . 成员名 ---- 表示访问某个结构体成员
#include <stdio.h>
struct student
{
int sno;
char name[30];
char sex;
float score;
};
void Input(struct student *s)
{
scanf("%d",&s->sno);
}
int main(void)
{
struct student s = {110,"tom",1,59.9};
printf("no = %d\n",s.sno);'
return 0;
}
4、指向结构体成员的算符运
结构体指针变量->成员名
结构体类型的定义形式:
形式1:先定义类型,然后定义变量
struct demo
{};
struct demo d;
形式2:定义类型的同时定义变量
struct demo
{
}d;
形式3:定义类型的同时,定义变量,可以省略结果体名
struct
{
}d;//结构体类型只使用一次
5、结构体类型的大小
在32位平台上,默认都是按4字节对齐的,放在可以被4整除的位置
对于成员变量,各自在自己的自然边界上对齐
在32位平台:如果成员变量中有比4字节大的,此时整个结构体按4字节对齐
如果成员变量中没有比4字节大的,按照最大的那个成员对齐
在64位的平台:如果超过4字节的,按超过的最大的成员变量对齐
6、同类型的结构体变量之间,可以相互赋值
struct student s1;
struct student s2;
s2 = s1;
7、排序
void qsort(void *base,size_t nmemb,size_t size,int (*compar)(const void *,const void*,void *arg))
参数:
void *base//要排序的数组的首地址
size_t nmemb//数组元素的个数
size_t size//单个元素的大小
int (*compar)(const void *,const void*,void *arg)//比较函数--提供比较依据
int compar(const void *a,const void *b)
{
//比较函数
//形参a和b用来接收要比较的两个数组元素
}
功能:排序数组
#include <stdio.h>
#include <stdlib.h>
int compar(const void *a,const void *b)
{
const int *p =a;
const int *q =b;
return *p-*q;
}
int main(void)
{
int a[10] = {4,7,2,1,0,8,6,3,5,9};
qsort(a,10,sizeof(int),compar);
int i = 0;
for(i = 0;i<10;++i)
{
printf("%d\n",a[i]);
}
return 0;
}
8、总结:
a.自己构造出结构体类型
b.有了类型便可以定义变量,定义数组,定义数组,定义指针,做函数形参//结构类型指针
做函数返回值
9、考点
结构体类型的大小计算
内存对齐
为什么要内存对齐
二、共用体:
union
1.语法:
union 共用体名
{
成员变量:
};
eg:
union demo
{
char a;
short b;
};
2、共用体:
(1)公用一块内存空间,共用最大成员的空间
(2)共用体初始化时只能给一个值,默认给到第一个成员
(3)共用体变量中的值,取决与最后一次给到的值,还要看能影响几个字节
3、对比结构体
结构体中各个成员拥有自己独立的空间
共用体中成员共用一块空间
4、考点:
用共用体判断大小端
三、枚举
一个一个列举出来,将变量的的一一列举出来,变量的值只限于列举出来的值的范围
1、作用:为了提高代码可读性;提高代码安全性
2、枚举类型:
enum 枚举名
{
列举各种值//枚举元素 枚举常量
};
注意:列举的各种值之间用“,”隔开,不需要写类型名
enum fire
{
LITTLE_FIRE,
MIDDILE_FIRE
};//表示定义了一种枚举类型
枚举中逐个列举的值,默认是从0开始,如果有给定的值,则后续没有给值的枚举成员依次+
枚举类型的本质实际上是一个int类型的数据
枚举类型的变量与整型类型的变量通用
3、与宏定义对比
区别:使用阶段不同----宏定义-----预处理
枚举----编译阶段检查语法,运行阶段参与代码运行
可读性---都提高了可读性,枚举更能说明有相关性的一些值之间的关系
4、typedef
本意不是定义类型,是给已有的类型起别名
int a;//定义了一个int型变量a
typedef int a;//此时a是Int类型的一个别名
struct stu
{
};
struct stu s;
typedef struct stu stu_t
四、位运算
可以直接操作二进制
1、& 与运算--位运算中---清0
运算规则:一假则假
2、| 或运算----置1
运算规则:一真则真
3、~ 取反
运算规则:真假相对
4、^ 异或
运算规则:相同为0,不同唯一
5、应用:加密;两个数的交换
注意:浮点数不能做位运算
6、<< 左移
写法 :a<<n 表示a这个数据左移n位,左移1为,相当于成2
注:最低位补0;
7、>>右移
a>>n 表示将a这个数据右移,右移一位相当于除2
算数右移,看符号位,看数据类型
如果是有符号位类型的数据,右移时,最高位补的是符号位
如果是无符号位类型的数据,右移时,最高位补的0
8、函数指针:指向函数类型的指针//基类型为函数类型的指针
指针函数:返回值为指针类型的函数
9、堆上的空间:
void *malloc(size_t size);
功能:在堆上开辟一块空间
参数:size 申请空间的大小,单位是字节
返回值:成功返回申请到的内存空间的地址;失败返回NULL
释放函数
void free(void *ptr);释放之前申请的堆上的空间
参数:一定是之前申请到的堆上的空间
free释放后的空间一般不再使用,指向这块空间的指针是个野指针;free之后对应空间上的内容也不要使用
注意:成对出现
free只是释放空间,表示这块空间有自由了,但是这块空间上的数据并不会清零
不要多次free
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int a = 10;
int *p = malloc(sizeof(int));
*p = 20;
printf("%d\n",*p);
free(p);
return 0;
}