结构体 共用体 枚举 位运算

一、结构体类型

结构体类型用来描述复杂数据的一种数据类型,也是一种构造类型或用户自定义类型

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值