C语言结构体

结构体
1、结构体类型的定义
三种方法
1、先定义结构体类型再定义结构体变量。

    struct stu{
    //结构体成员列表
         int num;
         char sex;
         char name[20];
         float score;
    };
    struct stu lili;
 2、在定义结构体类型的时候顺便定义结构体变量
     struct stu{
     //结构体成员列表
          int num;
          char sex;
          char name[20];
          float score;
     }lili,lucy;
     以后也可以定义其他变量
     struct stu bob;
 3、结构体类型名没有,在定义结构体类型,顺便定义变量,以后就
 不能再定义其他变量了,因为结构体没有类型名。
     struct {
          //结构体成员列表
          int num;
          char sex;
          char name[20];
          float score;
     }lili,lucy;

在此回顾typedef
概念:typedef 是给一个已有的类型名,重新起个别名,注意typedef并
没有创造一个新的类型,只是给已有类型起个别名。
起名的三个步骤:
//1、用想起别名的类型定义一个变量
int a;
//2:用新的类型名替代变量名
int INT32;
//3:在最前边加typedef
typedef int INT32;
注意:前两部是草稿纸上做的,最后一步是咱们想要的。

 例:1
      咱们要给函数指针类型起个别名,int (*p)(int ,char*);
      1、定义变量  int (*p)(int ,char*);
      2、新的类型名替代变量名 int (*POINTER)(int ,char*);
      3、在最前边加typedef
      typedef int (*POINTER)(int ,char*);
      最后一步是咱们想要的,以后就可以使用POINTER 定义变量了
      定义的变量,是函数指针变量,和p是一个类型的变量
      POINTER q;//定义了一个函数指针变量,指向的函数必须有一个
      //整型的返回值,第一个参数是整型的,第二参数是字符指针类型的 。
     
      POINTER temp[10];定义了一个函数指针数组,有10个元素,
      每个元素都是函数指针变量。
     
     
 4:
     typedef struct stu{
     //结构体成员列表
          int num;
          char sex;
          char name[20];
          float score;
     }STU;
     STU lili;    

2、结构体变量的定义及成员引用
1:struct stu lili
2:STU lili;
结构体变量,是它所有成员集合,通过结构体变量引用其成员的方法,
结构体变量.成员名
lili.num (整型的)、liii.sex(字符型的变量)、lili.name(是个字符数组类型的);

 相同类型的结构体变量,可以直接赋值。

3、结构体数组
结构体数组,是一个构造类型的数据,是多个相同类型的结构体变量的集合,
多个结构体变量,在内存中按有序的形式顺序存放。
struct stu edu[10];//定义了一个结构体数组edu 有10个结构体元素。
分别是edu[0]~edu[9]

 结构体数组元素的引用方法,数组名+[下标]
 edu[3]//数组中第3个结构体。
 edu[i].num=10;
 edu[i].sex='m';
 strcpy(edu[i].name,"lili");

4、结构体指针
struct stu *p;//定义了一个结构体指针,4个字节
struct stu lilei;
p=&lilei;
引用lilei的成员
lilei.num、 p->num;
通过结构体指针引用其指向的结构体的成员
结构体指针+ “->” +成员名

 前提是,结构体指针,必须指向了一个结构体变量。

5、结构体的内存
结构体的大小,是所有成员之和,在分配内存的时候有两个概念
1:字节对齐
char 型1字节对齐,存放char型变量的内存地址编号是1的倍数就行。
short 型2字节对齐 存放short型变量的内存地址编号是2的倍数就行
int 型4字节对齐 存放int型变量的内存地址编号是4的倍数就行
float 型4字节对齐 存放float型变量的内存地址编号是4的倍数就行
double 型
在windows下 double 型8字节对齐 存放double型变量的内存地址编号是8的倍数就行
在gcc编译环境下:
double类型的变量本身占8个字节,但是在内存中存储的时候
是4字节对齐的,也就是说,存放double类型的变量内存的地址是4的倍数

 2:以多少个字节为单位分配内存。
      会在结构体中找哪个基本类型占字节数最大,按它的字节数为单位
      分配内存。(double)
      double :在windows出现double成员,是8个字节为单位分配内存
                在gcc编译环境下出现double成员,是4个字节为单位分配内存

指定结构体对齐方式
#pragma pack (value)时的指定对齐值value
基本类型字节数小于等于value个字节的,仍按原先的对齐方式对齐,
大于value字节的,按value对齐。
1 2 4
6、位段
结构体的某个成员可以占几位
位段只能是有无符号 char 、short int、 int 、long int 不能是浮点型,
也不能定义位段数组

struct type{
     unsigned char a:2;//定义了一个位段a 占2bit
     unsigned char :0;//c从下一个存储单元存放,
     unsigned char c:2;
};

位段存储单元
char型位段存储单元1个字节 8bit
short int 型位段存储单元2个字节 16bit,
int 型的位段存储单元是4个字节 32bit
位段的长度不能大于存储单元的长度
位段的引用方法和结构普通成员的引用方法是一样的。
注意位段有可能不够一个字节,所以不能给位段取地址。

二:共用体

union type{
     int age;
     char sex;
};

共用体的类型定义方法,和结构体类型的定义方法是一样的,
共用体多个成员共用一块内存。
同一时刻,只能有一个成员起作用,给一个成员赋值之后,其他成员的值会
被覆盖。
共用体变量的定义方法和成员引用方法,和结构体是一样的。

1、
三:枚举
枚举类型,是个构造类型的数据结构。

enum week{mon,tue=3.....};
enum week workday;//定义枚举变量workday

注意枚举元素是常量,mon 是常量,默认枚举元素从0开始编号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值