考研C语言第八章

news2024/9/24 3:24:58

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

结构体对齐

在这里插入图片描述
这个东西看着像数据库里面属性的定义,也像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.coloradmin.cn/o/672847.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python桌面编程:探索图形用户界面

Python桌面编程&#xff1a;探索图形用户界面 Python是一种广受欢迎的高级编程语言&#xff0c;被广泛应用于数据科学、人工智能、Web开发和自动化。但是&#xff0c;随着越来越多的应用程序向图形用户界面&#xff08;GUI&#xff09;转移&#xff0c;Python的桌面编程能力也…

datagrip 连接 phoenix

jar替换完后尽量重启datagrip. 然后重新连接即可. 不重启貌似报错... 效果:

chatgpt赋能python:Python更新界面:让你的应用更美观、更易用

Python更新界面&#xff1a;让你的应用更美观、更易用 Python是一门强大的编程语言&#xff0c;广泛应用于软件开发、数据分析、机器学习等领域。其中&#xff0c;Python的GUI开发能力也非常出色。Python支持多种GUI库&#xff0c;如Tkinter、PyQt、wxPython等&#xff0c;可以…

【C++篇】C++新增的一些基础特性

友情链接&#xff1a;C/C系列系统学习目录 知识总结顺序参考C Primer Plus&#xff08;第六版&#xff09;和谭浩强老师的C程序设计&#xff08;第五版&#xff09;等&#xff0c;内容以书中为标准&#xff0c;同时参考其它各类书籍以及优质文章&#xff0c;以至减少知识点上的…

Python--字典

Python--字典 <font colorblue>一、创建字典<font colorblue>二、访问字典元素<font colorblue>三、字典的增、删、查、改<font colorblue>1、添加元素<font colorblue>2、删除元素<font colorblue>3、查找元素<font colorblue>4、修…

Git——分布式版本控制系统

简介 Git是一个开源的分布式版本控制系统&#xff0c;可以高效的处理从小到很大的项目版本管理。 分类 集中式 SVN&#xff0c;CVS 使用单一的服务器用来管理和存储所有文件的修订版本&#xff1b;协同开发的成员拉取或提交都需连接到这台服务器&#xff1b;如果服务器宕机…

电控开关详细介绍 MOSFET

目录 NMOS MOSFET的开关模型 现实生活中MOSFET的截面图 输出特性曲线 总结 MOSFET的SCS模型 MOSFET的SR模型 进一步分析 例子 PMOS CMOS(Complementary Metal-Oxide-Semiconductor) NMOS 金属氧化物半导体场效应晶体管 这是一个什么样的结构呢&#xff1f; 对于…

2023 年6月开发者调查统计结果——最流行的技术(2)

2023 年6月开发者调查统计结果——最流行的技术&#xff08;2&#xff09; 本文目录&#xff1a; 二十三、编程、脚本和标记语言 二十四、数据库 二十五、云平台 二十六、网络框架和技术 二十七、其他框架和库 二十八、其他工具 二十九、集成开发环境 三十、异步工具 …

chatgpt赋能python:Python查错完全指南:如何快速诊断和解决常见的错误

Python查错完全指南&#xff1a;如何快速诊断和解决常见的错误 Python是一种高级编程语言&#xff0c;它被广泛用于数据科学、机器学习、Web开发和自动化等领域。虽然Python具有易于学习和易于使用的特点&#xff0c;但是在编写复杂的应用程序时&#xff0c;错误和异常情况经常…

chatgpt赋能python:Python构造图入门指南

Python构造图入门指南 Python是一种非常强大的编程语言&#xff0c;它可以用于各种任务&#xff0c;包括数据分析、机器学习和深度学习等领域。其中&#xff0c;构造图是Python在数据分析领域的一项非常重要的技术&#xff0c;本文将为大家介绍Python构造图的入门指南。 什么…

chatgpt赋能python:Python查找手机号码

Python查找手机号码 在今天的数字时代&#xff0c;手机号码已成为每个人生活中必不可少的一部分。虽然我们可以轻松地拥有一部手机&#xff0c;但是对于那些需要通过电话来联系客户、朋友或家庭成员的人&#xff0c;获取正确的手机号码就显得尤为重要。 这就是为什么Python查…

【科普知识】如何解决CANopen通信一体化伺服电机PDO无法正常使用

随着现代的自动化程度不断提高&#xff0c;一体化电机的应用正逐渐成为行业的新趋势。 一体化伺服电机是现代工业自动化系统中常用的设备&#xff0c;它集成了伺服电机、驱动器和控制器等功能&#xff0c;提供了高效、精确的运动控制。在其系统中&#xff0c;我们通常使用PDO&a…

vue封装ketcher 化学式、分子式编辑器

ketcher是一个化学结构式编辑器&#xff08;github地址&#xff09;&#xff0c;ketcher插件提供了传统的html standalone版、npm包react版&#xff0c;并没有npm包vue版&#xff0c;集成到vue的原理是将standalone版嵌到iframe中&#xff0c;通过拿到iframe中的ketcher对象&am…

解决Armbian安装UFW防火墙后无法访问1Panel面板的问题:有效解决方案揭秘

文章目录 前言armbian安装防火墙原因分析解决方案第一步&#xff1a;查看1panel的面板入口端口第二步&#xff1a;打开指定端口的访问权限第三步&#xff1a;重启防火墙第四步骤&#xff1a;查看防火墙状态【可略】 前言 官方的教程很不错&#xff0c;但是还是有一些缺陷&…

第四章 ResNet网络详解

系列文章目录 第一章 AlexNet网络详解 第二章 VGG网络详解 第三章 GoogLeNet网络详解 第四章 ResNet网络详解 第五章 ResNeXt网络详解 第六章 MobileNetv1网络详解 第七章 MobileNetv2网络详解 第八章 MobileNetv3网络详解 第九章 ShuffleNetv1网络详解 第十章…

.net 软件开发模式——三层架构

三层架构是一种常用的软件开发架构模式&#xff0c;它将应用程序分为三个层次&#xff1a;表示层、业务逻辑层和数据访问层。每一层都有明确的职责和功能&#xff0c;分别负责用户交互、业务处理和数据存储等任务。这种架构模式的优点包括易于维护和扩展、更好的组织结构和代码…

Vue的详细安装教程,使用NVM安装是我所推荐的方式

第一步&#xff1a;卸载之前安装的node&#xff0c;安装NVM 进入网站&#xff1a;Releases coreybutler/nvm-windows GitHub 选择一个版本进行安装即可 安装的路径我就不用多说了&#xff0c;全英文路径&#xff0c;尽量不要安装在c盘上&#xff0c;计算机人都懂为什么&…

vmware17+ubuntu18.04通过qemu8.0.2启动arm64虚拟机-测试vsock

文章目录 一、环境搭建1.qemu-8.0.22.buildroot配置 3.编译工具链gcc-linaro-7.2.1下载交叉编译工具链 4.linux kernel 5.16config_kernel.sh配置内核build_kernel.sh 5.启动虚拟机&#xff08;1&#xff09;创建磁盘镜像文件&#xff08;2&#xff09;拷贝内核镜像和根文件系统…

ESP32(MicroPython)端午节项目

本程序致敬了屏幕驱动例程&#xff0c;依次以4种字体显示Happy Dragon Boat Festival!&#xff0c;并重复一次。 代码如下 from ili934xnew import ILI9341, color565 from machine import Pin, SPI import m5stack import tt14 import glcdfont import tt14 import tt24 imp…

JDK自带的构建线程池的方式之newWorkStealingPool

newWorkStealingPool和之前的几种线程池的创建方式有很大的不同&#xff0c;之前定长、单例、缓存、定时任务的四大线程池都是基于ThreadPoolExecutor去实现的。newWorkStealingPool则是基于ForkJoinPool的方式构建出来的。 ThreadPoolExecutor的核心特点 只有一个阻塞队列Dela…