考研C语言第八章

news/2025/1/18 4:48:40/

结构体定义,初始化,结构体数组

结构体对齐

在这里插入图片描述
这个东西看着像数据库里面属性的定义,也像java里面的类的定义

#include <stdio.h>
#include <string.h>
#include <stdlib.h>struct student{int num;char name[20];char sex;int age;float score;char addr[30];
};int main()
{struct student s={1001,"lele",'M',20,85.4,"shenzhen"};printf("%d %s %c %d %f %s\n",s.num,s.name,s.sex,s.age,s.score,s.addr);scanf("%d%s %c%d%f%s",&s.num,s.name,&s.sex,&s.age,&s.score,s.addr);printf("%d %s %c %d %f %s\n",s.num,s.name,s.sex,s.age,s.score,s.addr);return 0;
}

关于结构体里面scanf读取输入的数据,并进行相关的存储,
这里面字符串就像之前的,取数据时可以和前面的不加空格,可以不加取地址符号
(但是为了好记和规范,建议直接所有的一视同仁)
在这里插入图片描述
就想数据库在输入数据的时候也每一列数据都需要读入,不然容易写入异常或者失败,一个意思
在这里插入图片描述
结构体数组练习:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>struct student{int num;char name[20];char sex;int age;float score;char addr[30];
};int main()
{struct student arr[3];for(int i=0;i<3;i++){scanf("%d %s %c %d %f %s",&arr[i].num,&arr[i].name,&arr[i].sex,&arr[i].age,&arr[i].score,&arr[i].addr);}for(int j=0;j<3;j++){printf("%d %s %c %d %f %s\n",arr[j].num,arr[j].name,arr[j].sex,arr[j].age,arr[j].score,arr[j].addr);}
//    struct student s={1001,"lele",'M',20,85.4,"shenzhen"};
//
//    printf("%d %s %c %d %f %s\n",s.num,s.name,s.sex,s.age,s.score,s.addr);
//    scanf("%d%s %c%d%f%s",&s.num,s.name,&s.sex,&s.age,&s.score,s.addr);
//    printf("%d %s %c %d %f %s\n",s.num,s.name,s.sex,s.age,s.score,s.addr);return 0;
}

在这里插入图片描述
计算结构体对齐:(例题很复杂)
在这里插入图片描述
在这个例题里面结构是:
63+3+2
其中63是:int是4个字节,char数组20个,char一个,int 四个float四个,char30三十个
4+20+1+4+4+30=63个
在这里我们的结构体是相对于int char float这些类型,不是针对于数组的(也就是本题的20,30)
本来63是针对于一个字节整除,现在最大成员是4(int 和float的)从一个变成四个需要加三
63+3
然后前五个属性没有问题了,看最后一个char30
30不能整除4,需要变成32才能整除4
所以需要+2
63+3+2=68
在这里插入图片描述
为什么要结构体对齐?CPU高效的去读取内存上的数据
详见机组
上面的图,本来一次只能读四个字节,但是先放了1个字节的数据之后,又放了20个字节的数据,就把20个字节拆开了,本来读取五次就可以完全读取完毕,但是现在最后还余一个,不完整

下面还有几个例题:
在这里插入图片描述
double是8个,short是2个
8+2=10,但是还要按照8进行对齐
16
在这里插入图片描述
double 8 int 4 short 2
8+4+2=14还是按照8
16
(ps:老师说4个字节和2个字节是可以堆在一起的,就可以只看8)
在这里插入图片描述
int 4 char 1 short 2 4+1+2=7
按照四个字节凑,8

结构体指针,typedef

在这里插入图片描述

#include <stdio.h>
#include <string.h>
#include <stdlib.h>struct student{int num;char name[20];char sex;
};int main()
{struct student s={1001,"wangle","M"};struct student arr[3]={1001,"lilei","M",1005,"zhangsan","M",1007,"lili","F"};struct student *p;p=&s;printf("%d %s %c\n",(*p).num,(*p).name,(*p).sex);return 0;
}

(*p).num这么写的原因是.的优先级比**的优先级高,所以需要加个括号
但是很显然这个不方便

printf("%d %s %c\n",p->num,p->name,p->sex);

用这一种,箭头的比较方便

#include <stdio.h>
#include <string.h>
#include <stdlib.h>struct student{int num;char name[20];char sex;
};int main()
{struct student s={1001,"wangle",'M'};struct student arr[3]={1001,"lilei",'M',1005,"zhangsan",'M',1007,"lili",'F'};struct student *p;p=&s;printf("%d %s %c\n",(*p).num,(*p).name,(*p).sex);printf("%d %s %c\n",p->num,p->name,p->sex);p=arr;//上面这个等价于p=&arr[0];return 0;
}

上面有一些没改!!sex的地方必须是单引号,字符串的地方是双引号(严格!)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>struct student{int num;char name[20];char sex;
};int main()
{struct student s={1001,"wangle",'M'};struct student arr[3]={1001,"lilei",'M',1005,"zhangsan",'M',1007,"lili",'F'};struct student *p;p=&s;printf("%d %s %c\n",(*p).num,(*p).name,(*p).sex);printf("%d %s %c\n",p->num,p->name,p->sex);p=arr;p=p+1;printf("%d %s %c\n",p->num,p->name,p->sex);p=p+1;printf("%d %s %c\n",p->num,p->name,p->sex);p=p+1;printf("%d %s %c\n",p->num,p->name,p->sex);//上面这个等价于p=&arr[0];return 0;
}

每次p+1都是偏移一整个结构体的偏移量,也就是正好是一个学生的全部属性数据

//起别名 stu等价于struct student pstu等价于struct student*
typedef struct student{int num;char name[20];char sex;
}stu,*pstu;int main()
{stu s={0};stu *p=&s;//定义了一个结构体指针变量pstu p1=&s;//定义了一个结构体指针变量return 0;
}

typedef起别名的操作,缩减了代码量

//起别名 stu等价于struct student pstu等价于struct student*
typedef struct student{int num;char name[20];char sex;
}stu,*pstu;
typedef int INGETER;int main()
{stu s={1001,"zhangsan",'M'};stu *p=&s;//定义了一个结构体指针变量pstu p1=&s;//定义了一个结构体指针变量INGETER num=10;printf("%d %s %c\n",p->num,p->name,p->sex);printf("num=%d\n",num);return 0;
}

这里面假如还定义了属性,恰好和结构体里面某个属性重名,就可以用typedef进行替换,这里面是将int替换成了INGETER,这样在输出的时候也不会出错:
在这里插入图片描述


http://www.ppmy.cn/news/510673.html

相关文章

Android 蓝牙自动匹配PIN码跳过用户交互

近期项目中需要连接蓝牙设备&#xff0c;起初只是设置蓝牙列表界面让用户点击然后输入默认PIN码&#xff0c;后来改需求了 &#xff0c;要求自动连接指定设备并不需要用户手动输入PIN码&#xff0c;作为Android 小白的我是拒绝的&#xff0c;但是拒绝有什么用~ 首先说一下之后…

笔记本蓝牙显示输入码无效_蓝牙键盘输入码错误无法连接笔记本(win10)

在研究室用三星笔记本写论文&#xff0c;ctrl键敲坏了(现在看来是复制黏贴用的太多) 于是买了个蓝牙键盘&#xff0c;省的跑a/s浪费时间&#xff0c;可是花了一上午才终于搞定了&#xff0c;还不如上午去趟客服分分钟换个ctrl键来的简单...... 那如何解决蓝牙键盘不能连接笔记本…

手机蓝牙连接小票机/打印机,输入PIN码后确定键不亮的解决办法

如果以前配对过&#xff0c;就在手机蓝牙里取消配对&#xff0c;然后把机器关掉&#xff0c;手机蓝牙关掉。 重新配对连接&#xff0c;可以用了。 就没有重启不能解决的问题&#xff0c;如果有&#xff0c;就重启两遍。

3、低功耗蓝牙(BLE)配对和解绑

本文将对以上问题进行论述。 什么是低功耗蓝牙配对&#xff1f;什么又是绑定&#xff1f;配对和绑定有什么区别&#xff1f;配对有什么好处&#xff1f;如何删除绑定信息&#xff1f;如何确定配对的安全等级&#xff1f;just work的配对一定就不安全吗&#xff1f;如何开…

请解释下为什么鹿晗发布恋情的时候,微博系统会崩溃,如何解决?

出题人&#xff1a;阿里巴巴出题专家&#xff1a;江岚&#xff0f;阿里巴巴数据技术高级技术专家 参考答案&#xff1a; A. 获取微博通过 pull 方式还是 push 方式 B. 发布微博的频率要远小于阅读微博 C. 流量明星的发微博&#xff0c;和普通博主要区分对待&#xff0c;比如…

红米手机首位代言人公布!“国民大叔”吴秀波

红米手机首日前&#xff0c;小米宣布将为红米手机寻找代言人&#xff0c;而且是“大咖”级别的存在。 在消息公布后&#xff0c;米粉们纷纷猜测红米手机的代言人究竟是何方神圣。但由于小米官方给出的信息实在太少&#xff0c;所以很难猜出正确答案。 今天&#xff0c; 小米官…

2020-08-05:请解释下为什么鹿晗发布恋情的时候, 微博系统会崩溃,如何解决?

福哥答案2020-08-05&#xff1a; A.获取微博通过 pull 方式还是push 方式。 B.发布微博的频率要远小于阅读微博。 C.流量明星的发微博&#xff0c;和普通博主要区分对待&#xff0c;比如在 sharding的时候&#xff0c;也要考虑这个因素。 访问流量超过了系统阈值&#xff0c;…

鹿晗关晓彤公开恋情,是如何把新浪微博的服务器搞垮的?

鹿晗关晓彤公开恋情&#xff0c;是如何把新浪微博的服务器搞垮的&#xff1f; 我觉得不像数据库挂了&#xff0c;微博这种级别的架构根本不是简单的分布式serverDB就能抗住的&#xff0c;别说鹿晗关晓彤搞个大新闻&#xff0c;就算平时运营的压力也扛不住。 刚才王高飞说加一千…