DAY 12 结构体(重点) 共用体 枚举01

news2024/12/25 1:59:01

1.结构体

1.概念

将基本类型或构造类型封装在一起,拥有独立空间,这个数据结构 就叫结构体。
结构体 使用的关键字 struct.
一个结构体可以定义多个结构体变量

2.定义

注意:

        1,结构体定义一般在头文件中
        2,不要在定义结构体时给其成员初始化
方式一:

        struct 结构体名称  

{

        成员

};

定义结构体变量:
        struct 结构体名称 结构体对象名 ;
特点
         将定义结构体与定义结果体变量分开
示例:
        
struct stu
{
        char name[50];
        char sex[5];
        int age;
};
void fun01()
{
        struct stu s1;
}

方式二:

语法:

        struct 结构体名称  

{

        成员

}结构体变量名;

特点
        定义结构体同时定义一个结构体变量
示例
        
struct stu
{
        char name[50];
        char sex[5];
        int age;
} s1;
方式三:
语法:
        

 struct 

{

        成员

}结构体变量名;

特点

        该结构体变量只有一个,我们将其称为一次性结构体

示例:     

struct
{
        char name[50];
        char sex[5];
        int age;
} s1;

初始化

语法:

struct 结构体名称 结构体变量名 = { 1, 2, 3};
结构体对象清 0
memset(& 结构体变量名 ,0,sizeof(struct 结构体名称 ));
注意:
1, 结构体初始化 必须准许成员顺序和成员自身类型
2, 定义与初始化必须同时进行

使用

获取结构体成员
         结构体变量名 . 成员变量名
赋值
        
        普通类型
                结构体变量名.成员变量名 = ;
        字符数组
                strcpy(结构体变量名. 成员变量名 , );
        整体赋值
                结构体变量名1 = 结构体变量名 2;
        使用memcpy 内存拷贝
                memcpy(目标结构体变量地址, 原结构体变量地址 , 长度 );
示例:
struct stu s1 = { " 张桑 " , " " , 18 };
struct stu s2 = s1 ;
s2 . age = 20 ;
struct stu s3 ;
memcpy ( & s3 , & s1 , sizeof ( struct stu ));
s3 . age = 21 ;
printf ( "%s\n" , s1 . name );
printf ( "%s\n" , s1 . sex );
printf ( "%d\n" , s1 . age );
printf ( "%s\n" , s2 . name );
printf ( "%s\n" , s2 . sex );
printf ( "%d\n" , s2 . age );
printf ( "%s\n" , s3 . name );
printf ( "%s\n" , s3 . sex );
printf ( "%d\n" , s3 . age );
注意: 每个结构体变量都有其独立的内存 , 互不干扰

typedef与结构体

作用 : 简化结构体
语法
        
typedef struct 结构体名
{
        成员
} 别名 ;
示例:
typedef struct dog
{
        char name [ 50 ];
        char sex [ 5 ];
        int age ;
} Dog ;
void fun08 ()
{
        Dog d1 = { " 旺财 " , " " , 2 };
        Dog d2 = { " 富贵 " , " " , 1 };
        printf ( "%s %s %d\n" , d1 . name , d1 . sex , d1 . age );
        printf ( "%s %s %d\n" , d2 . name , d2 . sex , d2 . age );
        Dog * p = & d1 ;
        printf ( "%s %s %d\n" , p -> name , p -> sex , p -> age );
        strcpy ( p -> name , " 黑豹 " );
        printf ( "%s %s %d\n" , p -> name , p -> sex , p -> age );
}

结构体指针变量

定义

        struct 结构体名称 *指针变量名 = &结构体变量;

操作语法

        指针变量名->成员名称

示例1

void fun03 ()
{
        struct stu s1 = { " 小明 " , " " , 18 };
        struct stu * p = & s1 ;
        printf ( "%s %s %d\n" ,( * p ). name ,( * p ). sex ,( * p ). age );
        printf ( "%s %s %d\n" , p -> name , p -> sex , p -> age );
        strcpy ( p -> name , " 大明 " );
        printf ( "%s %s %d\n" , p -> name , p -> sex , p -> age );
}

示例2堆区申请内存

void fun04 ()
{
        struct stu * p = ( struct stu * ) calloc ( 1 , sizeof ( struct stu ));
        printf ( "%s %s %d\n" , p -> name , p -> sex , p -> age );
        strcpy ( p -> name , " 大明 " );
        strcpy ( p -> sex , " " );
        p -> age = 18 ;
        printf ( "%s %s %d\n" , p -> name , p -> sex , p -> age );
}

结构体数组

定义

        struct 结构体名称 数组名[长度];

初始化      

struct 结构体名称 数组名 [ 长度 ] = {{ 成员值 1, 成员值 2,..},{ 成员值 1, 成员值2,..},...};

示例1        

struct person
{
        char name[50];
        char sex[5];
        int age;
};
void fun05()
{
        struct person persons[] = {{"张三 "," ",18},{" 李四 "," ",20},{" 小红"," ",19}};
        int len = sizeof(persons)/sizeof(struct person);
        for(int i = 0; i < len; i++)
        {
        printf("%s %s %d\n",persons[i].name,persons[i].sex,persons[i].age);
        }
}

示例2

struct person
{
        char name [ 50 ];
        char sex [ 5 ];
        int age ;
};
void fun06 ()
{
        struct person ps [ 3 ];
        memset ( ps , 0 , sizeof ( ps ));
        for ( int i = 0 ; i < 3 ; i ++ )
        {
        scanf ( "%s %s %d" , ps [ i ]. name , ps [ i ]. sex , & ps [ i ]. age );
        }
        for ( int i = 0 ; i < 3 ; i ++ )
        {
        printf ( "%s %s %d\n" , ps [ i ]. name , ps [ i ]. sex , ps [ i ]. age );
        }
}
示例3
void fun07 ()
{
        struct person * ps = ( struct person * ) calloc ( 3 , sizeof ( struct person ));
        memset ( ps , 0 , sizeof ( ps ));
        for ( int i = 0 ; i < 3 ; i ++ )
        {
        scanf ( "%s %s %d" , ps [ i ]. name , ps [ i ]. sex , & ps [ i ]. age );
        }
        for ( int i = 0 ; i < 3 ; i ++ )
        {
        printf ( "%s %s %d\n" , ps [ i ]. name , ps [ i ]. sex , ps [ i ]. age );
        }
}

指针变量作为结构体成员

注意 : 不要操作结构体变量中未初始化指针
示例
typedef struct cat
{
        char *name;
        int age;
}Cat; void fun09()
{
//1, 不要操作结构体变量中未初始化指针
// 定义结构体变量 , 但不初始化 , 此时其中的指针为野指针
// Cat c1;
// printf("%s\n",c1.name);
// 定义结构体变量 , 使用 memset 0, 此时其中的指针为空指针
        Cat c2;
        memset(&c2,0,sizeof(c2));
        printf("%s\n",c2.name);
}
指针成员初始化
void fun10()
{
        Cat c = {"布丁 ",2};
        printf("%s\n",c.name);
}
// 注意 : 此时结构体变量 c 中指针成员指向文字常量区 , 此时不能修改其指向地址中的值 ,只能读取或修改其指向的地址
指针成员堆区初始化
void fun11()
{
        Cat c;
        c.name = (char *)malloc(50);
        strcpy(c.name,"tom");
        c.age = 2;
        printf("%s\n",c.name);
        c.name[0] = 'T';
        printf("%s\n",c.name);
        if (c.name != NULL)
        {
        free(c.name);
        c.name = NULL;
        }
}
// 使其指针成员指向堆区 , 那么就可以对其进行读写
结构体指针变量堆区初始化 , 指针成员堆区初始化:
void fun12()
{
/*
1, 先在堆区初始化结构体指针变量
2. 然后在堆区初始化成员指针变量
3,...
4, 释放成员指针变量堆区空间 5, 释放结构体指针变量堆区空间
*/
        Cat *c = (Cat *) malloc(sizeof(Cat));
        c->age = 3;
        c->name = (char *)malloc(20);
        strcpy(c->name,"布丁 ");
        printf("%s %d\n",c->name,c->age);
        if (c->name != NULL)
        {
        free(c->name);
        c->name = NULL;
        }
        if (c != NULL)
        {
        free(c);
        c = NULL;
        }
}
结构体指针数组堆区初始化 , 结构体指针变量堆区初始化 , 指针成员堆区初始化
void fun13()
{
/*
1, 先在堆区初始化结构体指针数组
2, 再在堆区初始化结构体指针变量
3. 然后在堆区初始化成员指针变量
3,...
4, 释放成员指针变量堆区空间
5, 释放结构体指针变量堆区空间
6, 释放结构体指针数组堆区空间
*/
        Cat **cs = (Cat **) calloc(3,sizeof(Cat *));
        for(int i = 0; i < 3; i++)
        {
        Cat *c = (Cat *)malloc(sizeof(Cat));
        c->name = (char *)malloc(20);
        scanf("%s %d",c->name,&(c->age));
        cs[i] = c;
        }
        for(int i = 0; i < 3; i++)
        {
        printf("%s %d\n",cs[i]->name,cs[i]->age);
                if (cs[i]->name != NULL)
                {
                free(cs[i]->name);
                cs[i] = NULL;
                }
                if (cs[i] != NULL){
                free(cs);
                cs[i] = NULL;
                }
        }
        if (cs != NULL)
        {
        free(cs);
        cs = NULL;
        }
}
浅拷贝 : 拷贝地址
        
typedef struct test01
{
        char *str;
} Test01;
void fun14()
{
        Test01 t01;
        t01.str = (char *) malloc(20);
        strcpy(t01.str,"德玛西亚 ");
        Test01 t02;
        t02 = t01;//此时 t02 的中 str t01 中的 str 指向同一堆区地址 , 发生浅拷贝
        printf("t01.str = %s\n",t01.str);
        printf("t02.str = %s\n",t02.str);
        strcpy(t02.str,"艾欧尼亚 ");
        printf("t01.str = %s\n",t01.str);
        printf("t02.str = %s\n",t02.str);
// 当释放是会产生错误
        if (t01.str != NULL)
        {
        free(t01.str);
        t01.str = NULL;
        }
        if (t02.str != NULL)
        {
        free(t02.str);
        t02.str = NULL;
        }
}
深拷贝: 拷贝内容
void fun15()
{
        Test01 t01;
        t01.str = (char *) malloc(20);
        strcpy(t01.str,"德玛西亚 ");
        Test01 t02;
        t02.str = (char *) malloc(20);
        strcpy(t02.str,t01.str);//深拷贝
        printf("t01.str = %s\n",t01.str);
        printf("t02.str = %s\n",t02.str);
        strcpy(t02.str,"艾欧尼亚 ");
        printf("t01.str = %s\n",t01.str);
        printf("t02.str = %s\n",t02.str);
        if (t01.str != NULL)
        {
        free(t01.str);
        t01.str = NULL;
        }
        if (t02.str != NULL)
        {
        free(t02.str);
        t02.str = NULL;
        }
}

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

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

相关文章

7.判断素数----不知道哪里错了

#include<stdio.h>void fun(int n) { int i;for(i2;i<n;i){if(n%i0)break;}if(in)printf("%d是素数\n",n);elseprintf("%d不是素数",n); }int main(){int n;scanf("d",&n);fun(n);return 0;}

王干娘和西门庆-UMLChina建模知识竞赛第4赛季第18轮

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答。 只要最先全部答对前3题&#xff0c;即可获得本轮优胜。 所有题目的回答必须放在同一条消息中&…

虚幻引擎:如何使用 独立进程模式进行模拟

第一步:先更改配置 第二步,在启动的两个玩家里面,一个设为服务器,一个链接进去地图就可以了 1.设置服务器 2.另一个玩家链接

kubernetes存储-volumes

目录 一、Volumes的简介 二、emptyDir卷 1、emptyDir的引入 2、emptyDir 的使用场景 3、多容器共享volumes 4、emptyDir缺点 三、hostPath卷 1、hostPath卷简介 2、创建hostPath卷 3、NFS共享文件 四、PersistentVolume&#xff08;持久卷&#xff09; 1、PV与P…

利用SPDK改善NVMe存储I/O性能

长期以来&#xff0c;SATA、SAS盘统治着企业级存储&#xff0c;虽然前些年 SSD固态存储介质的出现对 AHCI协议类型的存储访问带来了一定性能提升&#xff0c;但与 CPU 的计算速度相比&#xff0c;只能是杯水车薪&#xff0c;并且 SSD 的性能也不能充分地得到发挥。传统存储技术…

缓存-Spring Cache 缓存抽象

缓存-Spring Cache 缓存抽象 Spring从版本3.1开始提供非侵入的将Cache集成到Spring应用的方式。Spring Cache提供Cache的统一抽象&#xff0c;支持集成各种不同的缓存解决方案。从4.1版本开始&#xff0c;提供了注解和更多的定制参数。 Spring Cache 抽象提供了对Java方法的缓存…

图形推理 | 判断推理

文章目录 一、位置规律二、样式规律三、属性规律四、数量规律 一、位置规律 平移 方向&#xff1a;直线&#xff08;上下、左右、斜对角线&#xff09;、绕圈&#xff08;顺逆时针&#xff09;常见步数&#xff1a;恒定、递增&#xff08;等差&#xff09; 旋转 方向&#xff…

优化仓储分拣流程——WMS系统的分拣方法

在现代物流管理中&#xff0c;仓储分拣是一个至关重要的环节。为了提高分拣效率和准确性&#xff0c;越来越多的企业采用WMS系统来支持分拣操作&#xff0c;帮助企业优化仓储分拣流程。 1. 分拣策略制定&#xff1a; WMS系统可以根据不同的业务需求和产品特性&#xff0c;制定…

机器学习 - DBSCAN聚类算法:技术与实战全解析

目录 一、简介DBSCAN算法的定义和背景聚类的重要性和应用领域DBSCAN与其他聚类算法的比较 二、理论基础密度的概念核心点、边界点和噪声点DBSCAN算法流程邻域的查询聚类的形成过程 参数选择的影响 三、算法参数eps&#xff08;邻域半径&#xff09;举例说明&#xff1a;如何选择…

2021-2023神经辐射场(NeRF)118篇顶会论文合集(已分类整理)

有没有发现最近神经辐射场相关话题又有点爆了&#xff1f; 其实NeRF一直都挺火的&#xff0c;相关论文在Google Scholar上引用量已经超过6000次&#xff0c;每年顶级视觉会议如CVPR、ICCV、ECCV等都有大量关于神经辐射场的高质量工作被接受。许多科研机构和公司比如微软、Face…

使用RTSP接入安防监控EasyCVR平台,如何配置系统参数以减少起播时间?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台可拓展性强、…

软件外包团队的人员构成

软件外包团队的人员构成和职责可以因项目的性质和复杂度而有所不同&#xff0c;但通常包括以下一些核心角色和职责&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.项目经理&#xff08;Project Man…

Redis 的缓存击穿,穿透,雪崩及其解决方案

1 缓存穿透 什么是缓存穿透&#xff1f; 大量请求的 key 是不合理的&#xff0c;根本不存在于缓存中&#xff0c;也不存在于数据库中 。导致这些请求直接到了数据库上&#xff0c;根本没有经过缓存这一层&#xff0c;对数据库造成了巨大的压力&#xff0c;可能直接就被这么多…

现货黄金分析:多空高位博奕 黄金上行受阻

上周五&#xff0c;美国10月非农就业人数不及预期&#xff0c;失业率升至近两年新高&#xff0c;表明美国劳动力市场有所降温&#xff0c;数据公布后10年期美债收益率一度跌破4.50%&#xff0c;为9月26日以来最低水平&#xff0c;与此同时&#xff0c;现货金价跳升至2003.55美元…

【Unity】第二章 思考方式与构造 | 碰撞器/刚体/预设/组件

《Unity神技大人炼成记》第二章-思考方式与构造 Unity版本&#xff1a;2019.4.23f1c1 相关文章&#xff1a;第一章&#xff1a;开天辟地&#xff08;场景搭建-天空 山脉 草木 湖泊&#xff09; 粉色矩形是截图后添加&#xff0c;以便辨认操作位置有些步骤只是为了体现一些属性…

uniApp获取当前位置经纬度

以下是使用uni.getLocation获取当前位置的示例代码&#xff1a; 调用uni.getLocation方法获取当前位置信息 uni.getLocation({type: wgs84, // 坐标类型&#xff0c;默认为wgs84&#xff0c;可选的值为gcj02和bd09llsuccess: res > {// 获取成功&#xff0c;经度和纬度在r…

C语言编写学生成绩管理系统-要求有增删改查(C语言基础题-9道)

文章目录 1-5题题目例题8&#xff08;难度★ ★ ★ ★ ☆&#xff09;例题9&#xff08;难度★ ★ ☆ ☆ ☆&#xff09; 答案例题8答案1解析 答案2解析 例题9答案1解析 答案2解析 1-5题 C语言基础例题1-3题-指针篇 C语言基础例题4-5题-二维数组篇 C语言基础例题6-7题-结构体篇…

Go语言开发环境安装,hello world!

1. Go开发包SDK https://golang.google.cn/dl/&#xff08;国内也可以安装&#xff09; 根据自己电脑下载对应的安装包&#xff0c;我懒下载了msi安装 然后一路点确定安装Go 2.安装GoLand https://www.jetbrains.com/go/download/#sectionwindows 下载安装包 一路确定安装完…

成集云 | 英克对接零售O2O+线上商城 | 解决方案

方案介绍 零售O2O线上商城是一种新型的商业模式&#xff0c;它通过线上和线下的融合&#xff0c;提供更加便捷的购物体验。其中&#xff0c;O2O指的是线上与线下的结合&#xff0c;通过互联网平台与实体店面的结合&#xff0c;实现线上线下的互动和协同。线上商城则是指通过互…