1.结构体内存对齐

(1)在设计结构体时,既要满足对齐,又要节省空间(让占用空间小的成员尽量集中在一起)

struct s1
{    char c1;char c2;int i;//占用8个字节
struct s2
{    char c1;int i;char c2;//占用12个字节

(2)修改默认对齐数

#pragma pack(4)  //设置为4

#pragma pack()   //取消设置的默认对齐数

(3)写一个宏,计算结构体中某变量相对于首地址的偏移(百度笔试题)//offsetof宏

头文件#include<stddef.h>

printf("%d",offsetof(struct name,struct member name));

(4)位段,为了节省空间。但是不能跨平台

struct S
{int a:2;//是占据int型(4个字节*8=32bits中的2个比特位)int b:5;int c:15;int d:30;   //sizeof(S)=8个字节,a,b,c占据4个字节中的22个bit
int main()
{s.a=10;s.b=20;//是把数字先转化为二进制再存储
}

2.枚举(当需要define多个变量时,用枚举来代替)

#include<stdio.h>
enum Color
{RED,//0GREEN,//1BLUE  //2  枚举的可能取值——常量,main里面不能修改,
};
int main()
{enum Color c=BLUE;printf("%d %d %d",RED,GREEN,BLUE);//输出默认的0 1 2return 0;
}

3.联合体(共用体)

union Un
{char c;int i;
};
int main()
{union Un u;printf("%d\n",sizeof(u));//i和c不能同时使用

面试题(判断当前计算机的大小端数据)

(1)大小端字节序问题

int check_sys
{union Un{int i;char c;}u;u.i=1;return u.c;//c本是char,以int型返回
}
int main()
{int a=1;  //寄存器里用16进制0x00000001 ,若小端,即01 00 00 00(<-------方向读取),int ret=check_sys();                     大端,即00 00 00 01(------->方向读取)if(1==ret) //转化成char*,是为了取一个字节看是00/01{printf(“小端”);}else printf("大端");//int a=0x11223344;//11是高字节,44是低字节//低地址------------------------>高地址//....[][][][][11][22][33][44][][][][][][]...大端字节序存储模式//....[][][][][44][33][22][11][][][][][][]...小端字节序存储模式(低对低)

(2)大小的计算

最大成员大小不是最大对齐数的整数倍时,就要对齐到最大对齐数的整数倍

union Un
{int a;//4char arr[5];//字符数组的对齐数按照单个char来算~1,vs编译器中默认对齐数为8,
}   大小为8

实战项目(通讯录)

功能

1.存放1000个好友的信息

名字,电话,性别,住址,年龄

2.增加好友的信息

3.删除指定名字的好友信息

4.查找好友信息

5.修改好友信息

6.打印好友信息

7.排序

#define _CRT_SECURE_NO_WARNINGS 1//避免因为使用scanf,strcpy等不安全函数而报错
#define MAX 1000
#define MAX_NAME 20
#define MAX_SEX  5
#define MAX_TELE 12
#define MAX_ADDR 30
#include<stdio.h>
#include<string.h>
struct PeoInfo
{char name[MAX_NAME];int age;char sex[MAX_SEX];char tele[MAX_TELE];char addr[MAX_ADDR];
};
//创建通讯录类型
struct Contact
{struct PeoInfo data[MAX];int size;//记录当前已经有的元素个数
};
enum Option
{EXIT,//0ADD, //1DEL, //2SEARCH,MODIFY,SHOW,SORT
};//用枚举来把case中的0 1 2 3等替换,增加代码的可读性
void InitContact(struct Contact *ps)
{memset(ps->data,0,sizeof(ps->data));//将数组内元素设为0,用memsetps->size=0;
}
void menu()
{printf("****************************************\n");printf("*****1.add        2.del        *********\n");printf("*****3.search     4.modify     *********\n");printf("*****5.show       6.sort       *********\n");printf("*****0.exit                    *********\n");printf("****************************************\n");
}
void Addcontact(struct Contact *ps)
{if(ps->size==MAX){printf("通讯录已满,无法增加");}else{printf("请输入名字:>");scanf("%s",ps->data[ps->size].name);//以%s的形式输入字符数组,引用时只写数组的名字printf("请输入年龄:>");scanf("%d",&(ps->data[ps->size].age));//注意不是数组形式时,要用&printf("请输入性别:>");scanf("%s",ps->data[ps->size].sex);printf("请输入电话:>");scanf("%s",ps->data[ps->size].tele);printf("请输入住址:>");scanf("%s",ps->data[ps->size].addr);ps->size++;printf("添加成功\n");}
}
int FindByName(const struct Contact *ps,char *name)
{int i=0;for(i=0;i<ps->size;i++){if(0==strcmp(ps->data[i].name,name));//字符串比较不用==,0表示=={return i;}}return -1;//找不到
}
void Delcontact(struct Contact *ps)
{char name[MAX_NAME];printf("请输入要删除人的名字:");scanf("%s",name);//1.查找要删除的人的位置int pos=FindByName(ps,name);/*int i=0;for(i=0;i<ps->size;i++){if(0==strcmp(ps->data[i].name,name));//字符串比较不用==,0表示=={break;}}删查改都要用到这一段,打包到一个FindBy函数里*///2.删除if(-1==pos)printf("要删除的人不存在");else{int j=0;for(j=pos;j<(ps->size)-1;j++){ps->data[j]=ps->data[j+1];}ps->size--;printf("删除成功");}
}
void SearchContact(const struct Contact *ps)
{char name[MAX_NAME];printf("请输入要查找人的名字:");scanf("%s",name);int pos=FindByName(ps,name);if(pos==-1) printf("要查找的人不存在");else{printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n","名字","年龄","性别","电话","住址");printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n",ps->data[pos].name,ps->data[pos].age,ps->data[pos].sex,ps->data[pos].tele,ps->data[pos].addr);}
}
void ModifyContact(struct Contact *ps)
{char name[MAX_NAME];printf("请输入要修改人的名字");scanf("%s",name);int pos=FindByName(ps,name);if(pos==-1) printf("修改人的信息不存在");else{printf("请输入名字:>");scanf("%s",ps->data[pos].name);//以%s的形式输入字符数组,引用时只写数组的名字printf("请输入年龄:>");scanf("%d",&(ps->data[pos].age));//注意不是数组形式时,要用&printf("请输入性别:>");scanf("%s",ps->data[pos].sex);printf("请输入电话:>");scanf("%s",ps->data[pos].tele);printf("请输入住址:>");scanf("%s",ps->data[pos].addr);ps->size++;printf("修改完成\n");}
}
void Showcontact(const struct Contact *ps)//因为只是显示,为了避免误操作改变信息,加上const
{if(ps->size==0){printf("通讯录为空");}else{int i=0;printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n","名字","年龄","性别","电话","住址");//加上负号,左对齐for(i=0;i<ps->size;i++){printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n",ps->data[i].name,ps->data[i].age,ps->data[i].sex,ps->data[i].tele,ps->data[i].addr);}}
}
int main()
{int input=0;struct Contact con;/*int size=0;//创建通讯录struct PeoInfo con[MAX];*///初始化通讯录InitContact(&con);do{menu();printf("请选择:>");scanf("%d",&input);switch(input){case ADD:Addcontact(&con);break;case DEL:Delcontact(&con);break;case SEARCH:SearchContact(&con);break;case MODIFY:ModifyContact(&con);break;case SHOW:Showcontact(&con);//结构体传参传地址,效率更高,这个函数为了显示信息是否添加成功break;case SORT:break;case EXIT:printf("退出通讯录");break;default:printf("选择错误");break;}}while(input);return 0;
}

比特鹏哥网课笔记(结构体,枚举,联合体,通讯录项目)相关推荐

  1. 结构体+枚举+联合体

    结构体+枚举+联合体 结构体 结构体的声明 结构体的嵌套+链表 结构体变量的初始化 结构体的内存对齐 一.首先得掌握结构体的对齐规则 二.一些具体的例子 为什么存在内存对齐? 位段 位段的内存保存 枚 ...

  2. C++ 笔记-结构体-枚举-类型定义

    文章目录 为什么要使用"结构"(结构体) 还有一种特别的,结构体包含结构体,这种可以用于统计一个班人员信息等 结构数组 指向结构体的指针 使用结构体传递值 枚举 类型定义 为什么要 ...

  3. 学堂在线部分网课笔记---Web设计与应用

    学堂在线部分网课笔记 Web设计与应用 第六章 敏捷的前端框架 6.2.1 bootstrap响应式布局(一) 容器 非固定宽度 固定宽度 Viewport viewport的作用是什么? width ...

  4. 吴恩达ChatGPT网课笔记Prompt Engineering——训练ChatGPT前请先训练自己

    吴恩达ChatGPT网课笔记Prompt Engineering--训练ChatGPT前请先训练自己 主要是吴恩达的网课,还有部分github的prompt-engineering-for-devel ...

  5. 第一天学习b站比特鹏哥的视频

    前段时间听中国大学慕课翁凯老师的c语言,感觉讲的很少,而且我已经大三了,因为专升本的原因,比人家本科生要基础差得多,专科与本科差的绝对不是一张毕业证,更多的是基础,计算机的思想,我要补的东西还有很多, ...

  6. 大学计算机基础网课笔记,网课笔记怎么做?hiter教你!

    原标题:网课笔记怎么做?hiter教你! 转眼间 线上开课已一月有余 大家对 网课已相当熟悉了 小编随机调查了部分同学的网课状态 发现我工同学上网课毫不含糊 做起笔记来也是相当精彩 下面就随小编一起来 ...

  7. 自己实现了一个C语言例程,加深对宏、大小端、typeof宏、offsetof宏、指针变量、结构体、联合体的理解

    如题所述,最近时间在复习C语言.自己实现了一个C语言例程,以加深对宏.大小端.typeof宏.offsetof宏.指针变量.结构体.联合体的理解.关于细分知识后续有空再填充- swap宏的使用: 对应 ...

  8. c语言结构体和联合体,C语言结构体和联合体

    1.单链表插入 #include #include #define FALSE 0 #define TRUE 1 typedef struct NODE{ STRUCT NODE *link; int ...

  9. 结构体,联合体,枚举详解

    结构体,联合体,枚举详解 目录 结构体 联合体 枚举常量 1.结构体 在C语言中,系统已经提供了一些数据类型,比如float,int,double,char等,但是我们有时会需要更复杂的类型来描述一个 ...

  10. C语言结构体与联合体

    c语言结构体与联合体 结构类型定义和结构变量说明 一.结构的定义 二.结构类型变量的说明 结构变量的赋值 结构变量的初始化 结构数组 结构指针变量 其访问的一般形式为: (*结构指针变量).成员名 结 ...

最新文章

  1. c语言字符变量grade如何定义,c语言基础概念笔记
  2. 参加web前端学习前需要知道的注意事项
  3. 循环首次适应算法_面向6G的极化编码链路自适应技术
  4. 用python打印出各类三角形(正三角形、倒三角形、左上角左下角三角形、右上角右下角三角形)
  5. Adobe illustrator 剪切蒙版圆形细胞培养皿 - 连载20
  6. 软件架构(7)---软件架构设计-五视图方法论
  7. 你们觉得生一个孩子好,还是生两个孩子好?
  8. bzoj 1635: [Usaco2007 Jan]Tallest Cow 最高的牛
  9. 输出排列 递归、回溯法
  10. SPF邮件伪造漏洞测试脚本
  11. [转载]如何学习ANSYS?
  12. BOW和LSH的一点理解
  13. rubygems 安装mysql时出错_Ruby gem install mysql 错误解决
  14. 统计学习导论(ISLR)第五章bootstrap和交叉验证课后习题
  15. canvas文字粒子动画js特效
  16. 抽象类和抽象方法详解
  17. Maven项目 springsecurity配置
  18. php时间戳与date格式转换
  19. 处理Java连接不上hdfs
  20. 仿微信 QQ 图片选择器

热门文章

  1. 论文笔记:Exploiting Cloze Questions for Few Shot Text Classification and Natural Language Inference
  2. (63)计数器设计(递增计数器)
  3. 计算机表格合并居中,表格合并居中快捷键
  4. java中级程序员面试
  5. 关闭 OOM killer
  6. 毕竟,连少宇都无法击败的人,是没有资格做自己的对手的
  7. 小厮吃货:智能便利店不是新零售的风口?!
  8. Redux学习篇:关于store.subscribe()监听方法与取消监听的认识
  9. Cortex-M中特别实用的DWT计数器
  10. ctfshow 网络迷踪-来点福利