结构体及应用;结构体指针及应用;union、enum、typedef三个关键字

结构体及应用

参考文章链接:https://blog.csdn.net/zw1996/article/details/53844585
  1. 结构体的声明

    在这里插入图片描述

  2. 结构体的初始化

    注意如果在定义结构体变量的时候没有初始化,那么后面就不能全部一起初始化了。

    /这样是可以的,在定义变量的时候就初始化了;
    struct book s1={//对结构体初始化 "guojiajiaoyun",//author为字符数组 "yuwen",//title为字符串 22.5};
    /这种就不行了,在定义变量之后,若再要对变量的成员赋值,那么只能单个赋值了;
    struct book s1;s1={ "guojiajiaoyun",//author为字符数组 "yuwen",//title为字符串 22.5  };//这样就是不行的,只能在定义的时候初始化才能全部赋值,之后就不能再全体赋值了,只能单个赋值;只能;s1.title = "yuwen";........//单个赋值;
    
  3. 结构体数组初始化

    在这里插入图片描述

  4. 应用练习

    /*
    用结构体做一个选票系统,输入选民和唱票过程,输出票数和当选人
    */
    #include <stdio.h>
    #include <string.h>struct XuanMin
    {char name[32];int tickets;
    };
    int main()
    {int i;int j;int len;int mark;int quit = 0;char tmp_name[32];struct XuanMin xm[3];struct XuanMin max;len = sizeof(xm)/sizeof(xm[0]);for(i = 0;i < len;i++){//初始化 选民的名字和票数xm[i].tickets = 0;printf("请输入第%d个选民的名字:\n",i+1);scanf("%s",xm[i].name);}//唱票过程for(i=0;i<5;i++){//总共有5票mark = 0;printf("请输入你要投给谁:\n");memset(tmp_name,'\0',sizeof(tmp_name));scanf("%s",tmp_name);for(j = 0;j < len;j++){//判断是否和输入的三个选民名字相同if(strcmp(tmp_name,xm[j].name) == 0){xm[j].tickets++;mark = 1;}}if(mark == 0){quit++;printf("查无此人,弃票\n");}}max = xm[0];for(i = 1;i<len;i++){if(max.tickets < xm[i].tickets){max = xm[i];}}for(i = 0;i < len;i++){printf("选民:%s的票数为:%d\n",xm[i].name,xm[i].tickets);}printf("弃票数:%d\n",quit);printf("%s以%d票当选,%d人弃票\n",max.name,max.tickets,quit);return 0;
    }
    

结构体指针及应用

  1. 指针就是地址,指针变量就是存放地址的变量,结构体也是变量。变量的访问有两种方式:1.变量名;2.地址。之前的结构体都是用变量名访问。

    通过结构体变量地址来访问该结构体需要一个变量来存放这个地址:和之前的指针是一样的,只是指针类型是结构体。

    int a;
    int *p;
    p = &a;struct Test t1;
    struct Test *p;
    p = &t1;
    
  2. 访问

    #include <stdio.h>
    struct Test
    {int idata;char cdata;
    };
    int main()
    {struct Test t1 = {10,'X'};struct Test *p;p = &t1;printf("idata:%d\n",t1.idata);//变量名访问 用点符号printf("idata:%d\n",p->idata);//指针访问 用箭头符号return 0;
    }
    
  3. 结构体指针+函数的练习

    /*
    函数创建结构体,函数初始化结构体
    函数实现唱票过程
    */
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>struct XuanMin
    {char name[32];int tickets;
    };
    //结构体初始化
    struct XuanMin* init_xm(struct XuanMin *p,int *plen)//返回值是结构体指针
    {int i;//为指针开辟空间if(p == NULL){printf("请输入选民个数:\n");scanf("%d",plen);p = (struct XuanMin*)malloc(*plen*sizeof(struct XuanMin));}for(i=0;i<*plen;i++){p->tickets = 0;printf("请输入第%d个选民的名字:",i+1);scanf("%s",p->name);p++;}return p-*plen;
    }
    //打印结构体
    void printf_struct(struct XuanMin *p,int len)
    {int i;for(i=0;i<len;i++){printf("选民:%s的票数为:%d\n",p->name,p->tickets);p++;}}
    //唱票过程
    int do_vote(struct XuanMin* p,int len,int num)
    {int i;int j;int mark;int quit = 0;char tmp_name[32];struct XuanMin* pbak = p;for(i=0;i<num;i++){//总共有num票p = pbak;mark = 0;printf("第%d个人投给:",i+1);memset(tmp_name,'\0',sizeof(tmp_name));//清空scanf("%s",tmp_name);for(j = 0;j < len;j++){//判断是否和输入的三个选民名字相同if(strcmp(tmp_name,p->name) == 0){p->tickets++;mark = 1;}p++;}if(mark == 0){quit++;printf("查无此人,弃票\n");}}return quit;
    }
    //找出票数最高的
    struct XuanMin* getmax(struct XuanMin* p,int len)
    {int i;struct XuanMin* max;max = p;for(i = 0;i<len;i++){if(max->tickets < p->tickets){max = p;}p++;}return max;
    }
    int main()
    {struct XuanMin *xm = NULL;struct XuanMin* max ;int len;int quit;int num;xm =  init_xm(xm,&len);printf("请输入投票次数:\n");scanf("%d",&num);quit = do_vote(xm,len,num);printf("弃票数为:%d\n",quit);printf_struct(xm,len);max = getmax(xm,len);printf("%s以%d票当选,%d人弃票\n",max->name,max->tickets,quit);return 0;
    }
    
  4. 二级指针的练习

    void init_xm(struct XuanMin** pxm,int*  plen)
    {//初始化结构体int i;if(*pxm == NULL){printf("请输入选民的个数:\n");scanf("%d",plen);*pxm = (struct XuanMin*)malloc(*plen * sizeof(struct XuanMin));}for(i=0;i<*plen;i++){(*pxm)->tickets = 0;printf("请输入第%d个选民的名字:\n",i+1);scanf("%s",(*pxm)->name);(*pxm)++;}*pxm = *pxm - *plen;
    }
    int main()
    {struct XuanMin *xm;int len;int *plen = &len;struct XuanMin** pxm = &xm;//定义指向指针的变量为二级指针init_xm(&xm,&len);
    }
    

联合体union

  1. 结构体struct

    各成员各自拥有自己的内存,各自使用互不干涉,同时存在的,遵循内存对齐原则。一个struct变量的总长度等于所有成员的长度之和。

  2. 联合体/共用体union

    各成员共用一块内存空间,并且同时只有一个成员可以得到这块内存的使用权(对该内存的读写),各变量共用一个内存首地址。因而,联合体比结构体更节约内存。一个union变量的总长度至少能容纳最大的成员变量,而且要满足是所有成员变量类型大小的整数倍。不允许对联合体变量名U2直接赋值或其他操作。

  3. 共同体每次只能存放共同体变量中的的一种!!

    共同体变量中起作用的成员是最后一次存放的成员,在存入新的成员后原有的成员失去了作用!

    看大小

在这里插入图片描述

看地址

在这里插入图片描述

联合体应用小练习

#include <stdio.h>
/*
有若干人员的数据,其中有学生和教师,学生的数据中包括:姓名、号码、
性别、职业、班级,教师数据包括:姓名、号码、性别、职业、职务,
要求用同一个结构体来处理。
*/
struct Person
{char name[16];int num;char sex[16];char zhiye;union {int class;char kemu[16];}msg;
};int main()
{int i;struct Person school[2];//初始化结构体for(i=0;i<2;i++){printf("请输入这个人的职业:'s'代表学生,'t'代表老师。\n");scanf("%c",&(school[i].zhiye));if(school[i].zhiye == 's'){printf("请输入学生的名字:");scanf("%s",&(school[i].name));printf("请输入学生的号码:");scanf("%d",&(school[i].num));printf("请输入学生的性别:");scanf("%s",&(school[i].sex));printf("请输入学生的班级:");scanf("%d",&(school[i].msg.class));}if(school[i].zhiye == 't'){printf("请输入老师的名字:");scanf("%s",&(school[i].name));printf("请输入老师的号码:");scanf("%d",&(school[i].num));printf("请输入老师的性别:");scanf("%s",&(school[i].sex));printf("请输入老师的科目:");scanf("%s",&(school[i].msg.kemu));}getchar();}//打印结构体数据for(i=0;i<2;i++){if(school[i].zhiye == 's'){printf("学生个人资料:\n");printf("姓名:%s,号码:%d,性别:%s,班级:%d\n",school[i].name,school[i].num,school[i].sex,school[i].msg.class);}if(school[i].zhiye == 't'){printf("老师个人资料:\n");printf("姓名:%s,号码:%d,性别:%s,科目:%s\n",school[i].name,school[i].num,school[i].sex,school[i].msg.kemu);}}return 0;
}

枚举类型enum

  1. 如果一个变量只有几种可能的值,比如星期几:Mon、Tues、Wed、Thurs、Fri、Sat、Sun。

  2. 怎么定义枚举类型:列表中的名字,可以自己定义,无需像变量一样去申请。

    C编译器把它当成常量处理,也称枚举变量。

    enum Week {Mon,Tues,Wed,Thurs,Fri,Sat,Sun};
    enum Week {Mon = 1,Tues = 2,Wed,Thurs,Fri,Sat,Sun};
    enum {Mon,Tues,Wed,Thurs,Fri,Sat,Sun}w1,w2;
    
    • 只限列表中的几种情况
    • 值默认从0开始,枚举元素不能被赋值,虽然看着像变量名
    • 可以指定列表中枚举数的值

typedef关键字

  1. typedef是在C和C++编程语言中的一个关键字。作用是为现有的数据类型(int、float、char……)创建一个新的名字,目的是为了使代码方便阅读和理解。

    typedef 原类型 新类型名;
    //整型
    typedef int DATATYPE;
    DATATYPE a;//结构体
    typedef struct stu STU;
    STU stu1;
    //结构体
    typedef struct{int data;int data2;
    }T2;
    T2 t2;//数组
    typedef char ARRAY20[20];
    //表示ARRAY20是类型char[20]的别名,它是一个长度为20的字符数组类型,接着可以用ARRAY20定义数组:
    ARRAY20 a1,a2,a3,a4;//指针
    typedef int *STRING;
    STRING a;//数组指针
    typedef int (*PTR_TO_ARR)[4];
    //表示 PTR_TO_ARR 是类型int (*) [4]的别名,它是一个一维数组指针类型。接着可以使用 PTR_TO_ARR 定义一维数组指针:
    PTR_TO_ARR p1, p2;
    
  2. typedef与#define的区别

    Typedef是起别名,define是替换。

    例如:

    typedef int *PTR; //要加 ";"
    PTR a,b;
    

    此时a,b都是指针变量。

    #define PTR int* //不用 ";"
    PTR a,b;
    

    此时等同于

    int *a,b;
    

    只有a为指针变量,而b为整型变量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/825036.shtml

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

相关文章

(十四)C++自制植物大战僵尸游戏windows平台视频播放实现

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/8UFMs VLC库 在Cocos2d-x游戏开发框架中&#xff0c;没有实现windows平台视频播放的功能&#xff0c;需要自定义实现。在本项目中使用vlc库实现windows平台的视频播放功能。 vlc官网&#xff1a;网址 下载完成后&#x…

虚幻引擎源码版安装下载,点击GenerateProjectFiles.bat报错 error NU1101NuGet包问题解决参考方案

开发环境配置与源码安装使用 安装VS2022 按照官方文档安装需要的vs配置 虚幻引擎源代码下载 Epic里面下载的引擎与源代码引擎区别&#xff1a;Epic里面下载的引擎是已经编译过的它的源代码访问权限不完整&#xff0c;源代码版本提供比较完整引擎代码&#xff0c;并且可以修…

MDK stm32怎么生成bin文件

第一种 D:\Keil_v5\ARM\ac5.6\bin\fromelf.exe --bin -o ../../Output/atk_f407.bin ../../Output/atk_f407.axf 空格解析 D:\Keil_v5\ARM\ac5.6\bin\fromelf.exe一个空格--bin一个空格-o两个空格../../Output/atk_f407.bin ../../Output/atk_f407.axf &#xff08;注意后…

ELK,ELFK日志收集分析系统

ELK简介 ELK是一套完整的日志集中处理解决方案&#xff0c;将ElasticSearch&#xff0c;Logstash和Kibana三个开源工具配合使用&#xff0c;实现用户对日志的查询、排序、统计需求。 ELK工作原理 在所有需要收集日志的服务器上部署Logstash&#xff0c;或者先将日志进行集中…

c# .net 香橙派 Orangepi GPIO高低电平、上升沿触发\下降沿触发 监听回调方法

c# .net 香橙派GPIO高低电平、上升沿触发\下降沿触发 监听回调方法 通过gpio readall 查看 gpio编码 这里用orangepi zero3 ,gpio= 70为例 当gpio 70 输入高电平时,触发回调 c# .net 代码 方法1: Nuget 包 System.Device.Gpio ,微软官方库对香橙派支持越来越好了,用得…

SpringBoot多数据源(二)

SpringBoot多数据源AbstractRoutingDataSource&#xff08;二&#xff09; 1.多数据源配置2.多数据源调用流程3.实现 1.多数据源配置 spring-jdbc模块提供AbstractRoutingDataSource,其内部可以包含了多个DataSource&#xff0c; 然后在运行时来动态的访问数据库 2.多数据源…

【Python系列】查看虚拟环境信息和包大小

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Java基于SpringBoot+Vue的蜗牛兼职网系统的研究与实现

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

CSS-布局

display display 属性是用于控制 布局 的最重要的 CSS 属性。display 属性规定是否/如何显示元素。 每个 HTML 元素都有一个默认的 display 值&#xff0c;具体取决于它的元素类型。大多数元素的默认 display 值为 block 或 inline。 block block&#xff1a;块级元素。块级…

越来越多服务区安装智慧公厕是什么原因

随着社会的不断发展&#xff0c;人们对生活质量的要求也越来越高。在这种背景下&#xff0c;越来越多的服务区开始安装智慧公厕&#xff0c;以满足人们在出行过程中的生活需求。那么&#xff0c;为什么越来越多的服务区选择安装智慧公厕呢&#xff1f;这其中究竟有哪些原因呢&a…

你信不信,五分钟快速学习Nginx

Nginx是什么&#xff1f; Nginx 是一个高性能的HTTP和反向代理服务器。它是由俄罗斯程序员Igor Sysoev开发的&#xff0c;最初是为了解决俄罗斯大型的门户网站的高流量问题。 说到反向代理&#xff0c;那么有没有正向代理呢&#xff1f; 正向代理&#xff1a;客户端非常明确要…

Swift Publisher 5 for mac:打造精美版面

Swift Publisher 5 for mac&#xff1a;打造精美版面 Swift Publisher 5是一款专业的版面设计和编辑工具&#xff0c;为Mac用户提供了强大的设计功能和直观的操作界面。以下是关于Swift Publisher 5的功能介绍&#xff1a; 直观易用的界面&#xff1a;用户能够轻松地使用Swift …

每日两题 / 189. 轮转数组 560. 和为 K 的子数组(LeetCode热题100)

189. 轮转数组 - 力扣&#xff08;LeetCode&#xff09; 向右轮转将使尾部k个元素顶到头部 将整个数组反转&#xff0c;再分别反转前k个元素和剩下的元素即可 class Solution { public:void rotate(vector<int>& nums, int k) {k % nums.size();reverse(nums.begi…

C# 自动填充文字内容到指定图片

目录 需求 开发运行环境 方法设计 实现代码 AddText方法 图片转Base64 调用示例 小结 需求 在我们的一些发布系统项目应用中&#xff0c;会经常发布一些链接图标&#xff0c;该图标基本上以模板背景为主&#xff0c;并填充项目文字内容。解决方式一般会让美工进行制作…

Qt 拖放功能详解:理论与实践并举的深度指南

拖放&#xff08;Drag and Drop&#xff09;作为一种直观且高效的用户交互方式&#xff0c;在现代图形用户界面中扮演着重要角色。Qt 框架提供了完善的拖放支持&#xff0c;允许开发者在应用程序中轻松实现这一功能。本篇博文将详细阐述Qt拖放机制的工作原理&#xff0c;结合详…

代码随想录阅读笔记-回溯【N皇后】

题目 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题 的解决方案。 每一种解法包含一个不同的 n 皇后问题 的棋子放置方案&#xff0c;该方案中 Q 和 . 分别代表…

【2024】使用Rancher管理k8s集群和创建k8s集群

Rancher管理k8s集群及创建k8s集群。 Rancher版本为:2.8.2目录 rancher管理k8s集群rancher创建k8s集群rancher管理k8s集群 使用rancher管理已经存在的k8s集群。 本部分内容需要自行准备好k8s集群及rancher平台,部署请看本人其他文章 。 登录到rancher平台后,点击集群管理,…

部署wordpress

查看别名type ll ll 是 ls -l --colorauto 的别名 设置别名alias alias ymyum install -y 使用别名ym nginx 取消别名unalias ym 基于LNMP做一个wordpress nginx mysql 5.7 PHP 7.4 1、linux基本环境 修改主机名 hostnamectl set-hostname $name 关闭防火墙及selinux …

113 如何排查 cpu 过高的业务进程

前言 又是一个面试问题, 呵呵 之前碰到的 一个 java 进程 cpu 占用率过高, 应该如何排查? 对于这种问题, 第一反应就是 jstack, pstack, 然后仔细观察多次堆栈信息结果的 重复率较高的代码 因此 我给出的思路是, 写脚本 多次 jstack 目标进程, 然后 再统计分析一下 出现频…

Stable Diffusion 模型分享:CyberRealistic XL(真实)cyberrealisticXL_v11VAE.safetensors

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八下载地址模型介绍