C语言---结构体

打印 上一主题 下一主题

主题 511|帖子 511|积分 1533

目录
1. 结构体
1.1 结构体初始化
1.2 结构体变量的引用
1.3 结构体范例的巨细
2. qsort()
3. 共用体
4. 枚举
5. typedef

1. 结构体

语法:
  1. struct 结构体名
  2. {
  3.    成员列表;
  4. } ;
复制代码
(1)struct 关键字 --- 表现是在构造一个结构体的范例
(2)结构体名 --- 用来描述结构体这个范例的一个名称
(3)成员列表 --- 表现要描述的复杂数据中用到的具体的成员变量,多个成员变量之间用分号隔开
(4)末了有一个分号 表现结束
eg:
  1. struct student
  2. {
  3.     char name[30];
  4.         int sno;
  5.         float score;
  6.         char sex;  
  7. };                     //表示 定义出 一个 数据类型
复制代码
留意:
  1.结构体范例的利用的过程 
    a.先定义出范例
    b.定义变量

  2.定义变量 
  struct 结构体名  变量名;
1.1 结构体初始化

struct student s = { };
  (1)看每个成员变量,具体是什么数据范例。
  (2)根据 各个成员变量 自身的数据范例,进行初始化。
  (3)初始化的次序,按照定义的次序,依次初始化
eg:
  1. struct student s = {"tom",1515,89.6,"man"};
复制代码
1.2 结构体变量的引用

结构体数据 引用时,一样平常是引用到具体的成员数据 ,引用到成员 
运算符 为:.          //结构体成员运算符     
利用:
   结构体变量名.成员名    //表现 访问 某个结构体 的成员 
  1. s.name
复制代码
    
结构体范例的定义情势:
情势1: 先定义范例,然后定义变量 
struct demo
{
}; 
struct demo d;
情势2: 定义范例的同时,定义变量 
struct demo
{
}d; 
情势3: 定义范例的同时,定义变量,可以省略 结构体名  
struct 
{
}d;                                                          //假如,结构体范例只用一次 
 
1.3 结构体范例的巨细

(1)在32位的平台上,默认都是按4字节对齐的。 
(2)对于成员变量,
   各自在自己的自然边界上对齐。
   char  -- 1字节 
   short -- 2字节 
   int   -- 4字节 
(3)假如 成员变量中有比4字节大。      
  此时 整个结构体 按照4字节对齐。           //32位的平台 
(4)假如 成员变量中没有有比4字节大。  
  此时 整个结构体 按照最大的谁人成员对齐。   //32位的平台   
假如有超过4字节 ,按照4字节对齐
假如没有超过4字节的,则按成员变量中最大对齐 

(5)64位的平台:假如超过4字节的,按超过的最大的成员变量对齐 ,假如没有超过4字节的,则按成员变量中最大对齐
同范例的结构体变量之间,可以相互赋值:
struct student s1;
struct student s2;
s2 = s1; 
2. qsort()

void qsort(void *base,    //要排序的数组的首地址 
                size_t nmemb,  //数组元素的个数 
                size_t size,   //单个元素的巨细
                int (*compar)(const void *, const void *)     //比较函数 --- 提供比较依据
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. int compare (const void *a,const void *b)        // 回调函数
  4. {
  5.     const int *p = a;
  6.     const int *q = b;
  7.     return *p - *q;
  8. }
  9. int main(void)
  10. {
  11.     int a[] = {2,3,1,7,9,0,5,4,6,8};
  12.     qsort(a,10,sizeof(int),compare);
  13.     int i = 0;
  14.     for(i = 0;i < 10;++i)
  15.     {
  16.         printf("%d ",a[i]);
  17.     }
  18.     putchar('\n');
  19. }
复制代码
3. 共用体

union 语法: 
  union 共用体名
  {
     成员变量;
  };
  1.   union demo
  2.   {
  3.      char a;
  4.          short b;
  5.          int c;
  6.   };
  7. union demo d = {1};        // 初始化
复制代码
共用了一块内存空间 共用了最大成员的空间 (内存空间就是最大成员谁人空间内存巨细)
留意:
(1)共用体初始化时,只能给一个值,默认时给到第一个成员的。
(2)共用体变量中的值,取决与末了一次给到的值,还要看能影响几个字节。
考点:用共用体判断巨细端
  1. #include<stdio.h>
  2. union demo
  3. {
  4.     unsigned char a;
  5.     unsigned short b;
  6.     unsigned int c;
  7. };
  8. int isLittleEnidian(void)
  9. {
  10.     union
  11.     {
  12.         int a;
  13.         char b;
  14.     }d = {1};
  15.     return d.b;     // 如果返回1,就是小端模式
  16. }
  17. int main(void)
  18. {
  19.     union demo d;
  20.     printf("%d\n",isLittleEnidian());
  21.     return 0;
  22. }
复制代码
4. 枚举

枚举:是指将变量的值一个一个枚举出来,变量的值只限于枚举出的值的范围
作用:
(1)为了提高代码可读性
(2)提高代码的安全性
  1. enum 枚举名
  2. {
  3.     列举各种值,        // 值之间用 , 逗号隔开
  4. };                     // 表示定义了一种枚举类型
  5. enum 枚举名 变量名;
复制代码
注:枚举中逐个枚举的值默认是从0开始,枚举范例的本质实际上是一个int范例的数据,
枚举范例的变量与整型范例的变量是通用的。
假如有给定的值,后续没有给值的枚举成员,依次+1.
eg:
  1. enum fire
  2. {
  3.     Fire little,        // 0
  4.     Fire middle,
  5.     Fire lage
  6. };
  7. enum fire
  8. {
  9.     Fire little = 1,        // 1
  10.     Fire middle,            // 2
  11.     Fire lage              // 3
  12. };
复制代码

与宏定义对比:利用阶段不一样  --- 宏定义 ---- 预处理阶段; 枚举 --- 编译阶段 要检查语法,运行阶段要到场代码运行;枚举更能阐明有相关性的一些值之间关系。
5. typedef

不是定义范例,而是给范例起别名,
  1. int a;
  2. typedef int a;   // 此时a是一个int类型的一个别名
复制代码



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张国伟

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表