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

2024-04-18 14:28

本文主要是介绍结构体及应用;结构体指针及应用;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为整型变量。

这篇关于结构体及应用;结构体指针及应用;union、enum、typedef三个关键字的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/915032

相关文章

在Ubuntu上部署SpringBoot应用的操作步骤

《在Ubuntu上部署SpringBoot应用的操作步骤》随着云计算和容器化技术的普及,Linux服务器已成为部署Web应用程序的主流平台之一,Java作为一种跨平台的编程语言,具有广泛的应用场景,本... 目录一、部署准备二、安装 Java 环境1. 安装 JDK2. 验证 Java 安装三、安装 mys

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

无线路由器哪个品牌好用信号强? 口碑最好的三个路由器大比拼

《无线路由器哪个品牌好用信号强?口碑最好的三个路由器大比拼》不同品牌在信号覆盖、稳定性和易用性等方面各有特色,如何在众多选择中找到最适合自己的那款无线路由器呢?今天推荐三款路由器让你的网速起飞... 今天我们来聊聊那些让网速飞起来的路由器。在这个信息爆炸的时代,一个好路由器简直就是家庭网编程络的心脏。无论你

结构体和联合体的区别及说明

《结构体和联合体的区别及说明》文章主要介绍了C语言中的结构体和联合体,结构体是一种自定义的复合数据类型,可以包含多个成员,每个成员可以是不同的数据类型,联合体是一种特殊的数据结构,可以在内存中共享同一... 目录结构体和联合体的区别1. 结构体(Struct)2. 联合体(Union)3. 联合体与结构体的

java中VO PO DTO POJO BO DO对象的应用场景及使用方式

《java中VOPODTOPOJOBODO对象的应用场景及使用方式》文章介绍了Java开发中常用的几种对象类型及其应用场景,包括VO、PO、DTO、POJO、BO和DO等,并通过示例说明了它... 目录Java中VO PO DTO POJO BO DO对象的应用VO (View Object) - 视图对象

Go信号处理如何优雅地关闭你的应用

《Go信号处理如何优雅地关闭你的应用》Go中的优雅关闭机制使得在应用程序接收到终止信号时,能够进行平滑的资源清理,通过使用context来管理goroutine的生命周期,结合signal... 目录1. 什么是信号处理?2. 如何优雅地关闭 Go 应用?3. 代码实现3.1 基本的信号捕获和优雅关闭3.2

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

python中的与时间相关的模块应用场景分析

《python中的与时间相关的模块应用场景分析》本文介绍了Python中与时间相关的几个重要模块:`time`、`datetime`、`calendar`、`timeit`、`pytz`和`dateu... 目录1. time 模块2. datetime 模块3. calendar 模块4. timeit