比特鹏哥网课笔记(结构体,枚举,联合体,通讯录项目)
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;
}
比特鹏哥网课笔记(结构体,枚举,联合体,通讯录项目)相关推荐
- 结构体+枚举+联合体
结构体+枚举+联合体 结构体 结构体的声明 结构体的嵌套+链表 结构体变量的初始化 结构体的内存对齐 一.首先得掌握结构体的对齐规则 二.一些具体的例子 为什么存在内存对齐? 位段 位段的内存保存 枚 ...
- C++ 笔记-结构体-枚举-类型定义
文章目录 为什么要使用"结构"(结构体) 还有一种特别的,结构体包含结构体,这种可以用于统计一个班人员信息等 结构数组 指向结构体的指针 使用结构体传递值 枚举 类型定义 为什么要 ...
- 学堂在线部分网课笔记---Web设计与应用
学堂在线部分网课笔记 Web设计与应用 第六章 敏捷的前端框架 6.2.1 bootstrap响应式布局(一) 容器 非固定宽度 固定宽度 Viewport viewport的作用是什么? width ...
- 吴恩达ChatGPT网课笔记Prompt Engineering——训练ChatGPT前请先训练自己
吴恩达ChatGPT网课笔记Prompt Engineering--训练ChatGPT前请先训练自己 主要是吴恩达的网课,还有部分github的prompt-engineering-for-devel ...
- 第一天学习b站比特鹏哥的视频
前段时间听中国大学慕课翁凯老师的c语言,感觉讲的很少,而且我已经大三了,因为专升本的原因,比人家本科生要基础差得多,专科与本科差的绝对不是一张毕业证,更多的是基础,计算机的思想,我要补的东西还有很多, ...
- 大学计算机基础网课笔记,网课笔记怎么做?hiter教你!
原标题:网课笔记怎么做?hiter教你! 转眼间 线上开课已一月有余 大家对 网课已相当熟悉了 小编随机调查了部分同学的网课状态 发现我工同学上网课毫不含糊 做起笔记来也是相当精彩 下面就随小编一起来 ...
- 自己实现了一个C语言例程,加深对宏、大小端、typeof宏、offsetof宏、指针变量、结构体、联合体的理解
如题所述,最近时间在复习C语言.自己实现了一个C语言例程,以加深对宏.大小端.typeof宏.offsetof宏.指针变量.结构体.联合体的理解.关于细分知识后续有空再填充- swap宏的使用: 对应 ...
- c语言结构体和联合体,C语言结构体和联合体
1.单链表插入 #include #include #define FALSE 0 #define TRUE 1 typedef struct NODE{ STRUCT NODE *link; int ...
- 结构体,联合体,枚举详解
结构体,联合体,枚举详解 目录 结构体 联合体 枚举常量 1.结构体 在C语言中,系统已经提供了一些数据类型,比如float,int,double,char等,但是我们有时会需要更复杂的类型来描述一个 ...
- C语言结构体与联合体
c语言结构体与联合体 结构类型定义和结构变量说明 一.结构的定义 二.结构类型变量的说明 结构变量的赋值 结构变量的初始化 结构数组 结构指针变量 其访问的一般形式为: (*结构指针变量).成员名 结 ...
最新文章
- c语言字符变量grade如何定义,c语言基础概念笔记
- 参加web前端学习前需要知道的注意事项
- 循环首次适应算法_面向6G的极化编码链路自适应技术
- 用python打印出各类三角形(正三角形、倒三角形、左上角左下角三角形、右上角右下角三角形)
- Adobe illustrator 剪切蒙版圆形细胞培养皿 - 连载20
- 软件架构(7)---软件架构设计-五视图方法论
- 你们觉得生一个孩子好,还是生两个孩子好?
- bzoj 1635: [Usaco2007 Jan]Tallest Cow 最高的牛
- 输出排列 递归、回溯法
- SPF邮件伪造漏洞测试脚本
- [转载]如何学习ANSYS?
- BOW和LSH的一点理解
- rubygems 安装mysql时出错_Ruby gem install mysql 错误解决
- 统计学习导论(ISLR)第五章bootstrap和交叉验证课后习题
- canvas文字粒子动画js特效
- 抽象类和抽象方法详解
- Maven项目 springsecurity配置
- php时间戳与date格式转换
- 处理Java连接不上hdfs
- 仿微信 QQ 图片选择器
热门文章
- 论文笔记:Exploiting Cloze Questions for Few Shot Text Classification and Natural Language Inference
- (63)计数器设计(递增计数器)
- 计算机表格合并居中,表格合并居中快捷键
- java中级程序员面试
- 关闭 OOM killer
- 毕竟,连少宇都无法击败的人,是没有资格做自己的对手的
- 小厮吃货:智能便利店不是新零售的风口?!
- Redux学习篇:关于store.subscribe()监听方法与取消监听的认识
- Cortex-M中特别实用的DWT计数器
- ctfshow 网络迷踪-来点福利