C语言进阶【6】---结构体【1】(结构体的本质你不想了解吗?)

本章概述

  • 结构体类型的声明
  • 结构体变量的创建和初始化
  • 结构体成员访问操作符
  • 彩蛋时刻!!!

结构体类型的声明

咱们在讲操作符那个章节中,对于结构体类型的声明进行了讲解,咱们先来回忆一下,为后面的讲解作准备。

  • 为什么要有结构体类型? 前面,咱们讲过,变量类型分为内置类型自定义类型char , float ,int 等这些为内置类型,也就是说这些内置的类型是C语言给你规定好的,直接用就OK了。数组,结构体,联合体和枚举这些就是自定义类型,需要我们自己来定义,定义后才能使用。当我们描述简单的变量时候,一般用内置类型(单一变量类型)就OK了,比如,定义一个整形变量,int i=0; 但是,当我们描述一个复杂的对像时,单一变量就不行了,比如,描述一个学生。描述一个学生需要描述名字,身高,体重和学号。这些描述中有字符类型,整形类型和浮点类型。而我们的单一变量类型就不满足了,需要定义结构体类型来进行描述。
  • 结构体的定义结构体是一些值的集合,这些值被称为成员变量,这些成员变量可以是不同类型的变量。进行结构体的结构展示:
struct  tag
{member-list ; //成员列表
}varible-list; // 定义的结构体变量

可以在创建结构体的时候定义变量,这个时候的变量为全局变量。也可以先创建好结构体,在后面使用的时候,再创建对应的结构体变量,就是局部变量。进行代码展示:

struct stu
{int age;char name[20];double hight;
}s1,s2;  // s1 ,s2为全局变量 

s1 ,s2为全局变量 。。

struct stu
{int age;char name[20];double hight;
};
int main()
{struct stu s1; //s1为局部变量return 0;
}

s1为局部变量

结构体变量的创建和初始化

  • 结构体的创建:我们已经在上面写过了结构体的创建格式。我们再来创建一个描述学生的结构体类型吧。
描述一个学生,名字,年龄,身高,学号和体重
struct stu
{char name[20];int age;double hight;char ID[40];double weight;
};
  • 结构体的初始化:在这里我们要分为两种情况,一种是初始化一部分(不正经的写法)另一种就是全部初始化。我们直接创建局部变量。
    • 初始化一部分(不正经的写法):进行代码展示;
#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
struct stu
{char name[20];int age;double hight;char ID[40];double weight;
};
int main()
{struct stu s1 = {"zhangsan",18};return 0;
}

结果运行图:在这里插入图片描述
我们创建的结构体类型中,有很多的成员,但是我们只初始化了几个成员,而且也没有报错。这样初始化是OK的,对于其它没初始化的成员空间,就会自动初始化为0。调试图所示:在这里插入图片描述
但是,这是不正经的写法我们既然创建了一个结构体类型,肯定为描述对象,所创建的数据类型(成员变量)刚刚好,我们就是为了全面描述对象的,为什么还初始化不全面呢?对吧。所以,我们要全部初始化,才是正经的写法。

  • 初始化全部成员,进行代码展示。
#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
struct stu
{char name[20];int age;double hight;char ID[40];double weight;
};
int main()
{struct stu s1 = {"zhangsan",18,180.2,"32301022004",75.3};return 0;
}

我们还可以不按顺序进行初始化,进行代码展示:

#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
struct stu
{char name[20];int age;double hight;char ID[40];double weight;
};
int main()
{struct stu s1 = {"zhangsan",18,180.2,"32301022004",75.3};struct stu s2 = {.age=18,.ID="32301022004",.hight=180.3,.weight=75.3,.name="zhangsan"};return 0;
}
  • 结构体的特殊声明:一般结构体的声明,咱们都知道,它是有标签名的(tag)。但是,=结构体的声明可以不用写标签名,这种特殊声明就叫匿名结构体。进行代码展示:
// 匿名结构体
struct
{char name[20];int age;double hight;char ID[40];double weight;
}s1; //匿名结构体只能定义全局变量
  • 匿名结构体要注意的地方匿名结构体只能定义全局变量,不能定义局部变量。为什么呢?接下来进行代码讲解:
假如我们用上面的匿名结构体来定义变量:struct s1 。大家是不是看着很不对劲,这是匿名结构体
定义的变量s1 。但是,我们也可以看成 struct  s1==struct  tag(标签),其中s1就是个标签。
所以,计算机会把struct  s1当成正常命名的结构体。所以,为了能够定义匿名结构体变量,我们
只能定义全局变量。
  • 结构体使用注意事项同种类型的同一个结构体可以使用多次,不同种类型的同一个结构体只能使用一次。我们先来写个代码;
写个结构体的类型,我们创建个普通的变量和指针型的变量。我们取出这个普通变量
的地址,存放到结构体类型指针中。

我们先来展示正常的结构体创建的变量代码:

#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
struct str
{int i;char arr[20];
}s1;
struct str
{int i;char arr[20];
}*p;
int main()
{p = &s1;return 0;
}

结果运行图:在这里插入图片描述
结果运行是错误的,在这里我们分开使用了结构体类型,又分别创建了两个不同类型的变量。我们进行&s1,取出的是s1的地址,按理来说是可以赋值给p的。但是,编译器会把这一个结构体类型当成不同的结构体类型,所以就会报错。这就回到咱们开头讲的:同类型的变量可以使用多次,不同类型的变量只能使用一次。进行展示正确的代码:
代码展示【1】

#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
struct str
{int i;char arr[20];
}s1,*p;
int main()
{p = &s1;return 0;
}

结构运行图:在这里插入图片描述
代码展示【2】

#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
struct str
{int i;char arr[20];
}s1;
int main()
{struct str *p=NULL;p = &s1;return 0;
}

结果运行图:在这里插入图片描述
这两种的写法才是正确的,上面展示的两种代码就属于共用同一个类型的结构体。虽然创建的是两种不同类型的变量,但是你没有分开使用,编译器就会认为你使用的是同一个结构体类型,所以不会报错。总结:创建不同类型的变量时,同一个结构体不能分开使用,匿名结构体也是如此
不是同一个结构体也可以使用(虽然成员列表相同),如下:在这里插入图片描述

  • 重命名使用:上面,咱们讲了,同一个结构体定义不同类型变量时,只能使用一次。那么我们有没有什么办法可以用多次呢?——重命名。关于重命名,咱们讲过,#definetypedef。进行代码展示——以typedef举例:
#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
typedef struct str
{int i;char arr[20];
}node;
int main()
{node* p = NULL;node a;p = &a;return 0;
}

结果运行图:在这里插入图片描述
当我们重命名后就可以随便用了,匿名结构体也是如此。

  • 结构体的自引用:当我们在结构体里面包含一个同一个结构体是否可以呢?进行代码展示:
struct Node
{int data;struct Node next;
};

上面的代码,我们定义了一个数据结构里面的链表节点。所谓数据结构就是:数据在内存中的存储方式。我们知道数组就是一种存储数据的方式之一,其实数据在内存中的存储方式很多中。其中有一种不是连续存储的方式就是链表存储。每个链表都有一个节点,这个节点里面存有数据和下一个节点的信息,如图所示:在这里插入图片描述
大家感觉到上面的代码有什么问题吗?我们知道每个数据类型都有大小是吧,那么我来计算一下这个节点的大小。我们发现竟然无法计算。Int data我们清楚占有4个字节,但是 struct Node next占有多少个字节就不清楚了(因为它里面又会包含 struct Node next),就会形成 “套娃” 就会无穷大。我们表示节点示不用这种方式自引用,我们可以存放下一个节点的地址,指针大小咱们知道是固定的。所以节点大小就可以计算了,进行代码展示:

struct Node
{int data;struct Node* next;
};
  • 重命名的自引用注意事项我们重命名后,不能在结构体里面自引用这个重命名的结构体。进行代码展示:
typedef struct Node
{int data;Node* next;
}Node;

结果运行图:在这里插入图片描述
结果报错了。原因 :因为程序是一步一步在执行的,当执行到 Node* next;这句代码的时候,编译器在之前没见它就会报错(因为你在后面才重命名的,所以编译器看不到)。进行正确代码展示:

typedef struct Node
{int data;struct Node* next;
}Node

这样写就OK了。

结构体成员访问操作符

  • 成员访问操作符:有两种访问操作符' .'' ->'。其中‘ ->’只能用于指针形式的访问
    • ' .'的访问方式:进行代码展示:
#include <stdio.h>
struct stu
{int i;char name[30];
};
int main()
{struct stu s1 = {100,"zhangsan"};printf("%d %s",s1.i,s1.name);return 0;
}

结果运行图:在这里插入图片描述
我们还可以直接赋值,进行代码展示:

#include <stdio.h>
struct stu
{int i;char name[30];
}s1;
int main()
{s1.i = 100;//s1.name = "zhangsan";printf("%d %s",s1.i,s1.name);return 0;
}

结果运行图:在这里插入图片描述
我们不能进行点的直接访问数组,原因如下图所示:在这里插入图片描述

  • ' ->'访问方式:进行代码展示:
#include <stdio.h>
struct stu
{int i;char name[30];
};
int main()
{struct stu s1 = {100,"zhangsan"};struct stu* p = &s1;printf("%d %s", p->i,p->name);return 0;
}

结果运行图:在这里插入图片描述

彩蛋时刻!!!

https://www.bilibili.com/video/BV1MwtteWECz/?spm_id_from=pageDriver&vd_source=7d0d6d43e38f977d947fffdf92c1dfad
在这里插入图片描述
每章一句不要看见别人发光,就觉得自己暗淡感谢你能看到这里,点赞+关注+收藏+转发是对我最大的鼓励,咱们下期见!!!

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

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

相关文章

mac怎么设置ip地址映射

最近开发的项目分为了两种版本&#xff0c;一个自己用的&#xff0c;一个是卖出去的。 卖出的域名是和自己的不一样的&#xff0c;系统中有一些功能是只有卖出去的版本有的&#xff0c;但我们开发完之后还得测试&#xff0c;那就需要给自己的电脑配置一个IP地址映射了&#xf…

【机器学习(九)】分类和回归任务-多层感知机(Multilayer Perceptron,MLP)算法-Sentosa_DSML社区版

文章目录 一、算法概念二、算法原理&#xff08;一&#xff09;感知机&#xff08;二&#xff09;多层感知机1、隐藏层2、激活函数sigma函数tanh函数ReLU函数 3、反向传播算法 三、算法优缺点&#xff08;一&#xff09;优点&#xff08;二&#xff09;缺点 四、MLP分类任务实现…

JAVA毕业设计183—基于Java+Springboot+vue的旅游小程序系统(源代码+数据库)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootvue的旅游小程序系统(源代码数据库)183 一、系统介绍 本项目前后端不分离&#xff0c;分为用户、管理员两种角色 1、用户&#xff1a; 注册、登录、公告信息(…

解读: 火山引擎自研vSwitch技术

最近看到一篇文章介绍火山云的网络vSwitch技术&#xff0c;虽然是2022年的比较老的介绍&#xff0c;但是对于我们看到vSwitch技术的发展还是有些参考的。下面就截取了当时火山vSwitch关心的几个问题&#xff0c;做了一下梳理。 背景 在云计算发展过程中&#xff0c;虚拟网络的…

虚拟环境默认安装到C盘的修改办法

问题&#xff1a; 创建的虚拟环境默认安装到了C盘。 将路径改成D盘下。 解决办法&#xff1a; 我是按照博客w11下载anaconda在d盘&#xff0c;新建的虚拟环境总是在c盘怎么解决_如何保证anaconda的全在e盘-CSDN博客 中的方法1解决的。 用记事本打开.condarc文档&#xff0…

C++之STL—函数对象谓词

函数对象&#xff08;仿函数&#xff09; 函数对象(仿函数)是一个**类**&#xff0c;不是一个函数 类名&#xff08;&#xff09; 仿函数 直接调用&#xff1a; 、 谓词 定义&#xff1a;返回类型为bool 类型的仿函数 一元谓词&#xff1a;operator()接受一个参数 二元谓词&a…

JavaScript高级——事件循环模型

1、 2、所有代码分类 ① 初始化执行代码&#xff08;同步代码&#xff09;&#xff1a;包含绑定 dom 事件监听&#xff0c;设置定时器&#xff0c;发送 ajax 请求的代码 ② 回调执行代码&#xff08;异步代码&#xff09;&#xff1a;处理回调逻辑 3、js 引擎执行代码的基本流…

ubuntu系统下mamba-yolo模型的深度学习环境搭建

本文将介绍如何在ubuntu系统下配置目标检测模型mamba-yolo的深度学习环境 1. 环境要求 Python > 3.9 &#xff08;本文使用python-3.11&#xff09; CUDA > 11.6 &#xff08;本文使用CUDA-11.8&#xff09; Pytorch > 1.12.1 &#xff08;本文使用torch-2.4.0&…

【4.6】图搜索算法-DFS和BFS解合并二叉树

一、题目 给定两个二叉树&#xff0c;想象当你将它们中的一个覆盖到另一个上时&#xff0c;两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是 如果两个节点重叠&#xff0c;那么将他们的 值相加作为节点合并后的新值&#xff0c;否则不为 NUL L…

计算机视觉实战项目4(图像分类+目标检测+目标跟踪+姿态识别+车道线识别+车牌识别+无人机检测+A*路径规划+单目测距与测速+行人车辆计数等)

往期热门项目回顾&#xff1a; 计算机视觉项目大集合 改进的yolo目标检测-测距测速 路径规划算法 图像去雨去雾目标检测测距项目 交通标志识别项目 yolo系列-重磅yolov9界面-最新的yolo 姿态识别-3d姿态识别 深度学习小白学习路线 AI健身教练-引体向上-俯卧撑计数…

Vmware VC登录报错:Vmware报错 HTTP状态 500 - 内部服务器错误

问题现象&#xff1a; 登录Vmware VC系统报错&#xff1a;Vmware报错 HTTP状态 500 - 内部服务器错误、 然后登录管理服务&#xff08;访问端口&#xff1a;5480&#xff09;重启一下异常服务&#xff0c;结果提示证书过期。 初步判断VC SSL证书到期 判定方法&#xff1a; 1…

从源码到上线:轻松搭建您的地方门户分类信息平台 带完整的安装代码包以及搭建部署教程

系统概述 地方门户分类信息平台逐渐成为居民获取本地资讯、生活服务、商家信息、二手交易等多元化信息的重要渠道。然而&#xff0c;传统的信息平台搭建往往需要较高的技术门槛和较长的开发周期&#xff0c;这对于许多中小企业和个人开发者而言无疑是一大挑战。因此&#xff0…

ab压测工具进行流量测试

可以使用httpd服务携带的httpd-tools工具中的ab小的压测工具进行流量测试&#xff0c;服务端IP为192.168.6.1&#xff0c;并安装httpd服务&#xff0c;测试端安装httpd-tools工具。 1、服务端上安装httpd服务 [rootlocalhost ~]# yum install httpd -y [rootlocalhost ~]# s…

CKKS同态加密通用函数近似方法和openFHE实现

摘要 同态加密可以直接在密文上进行运算&#xff0c;尤其是CKKS&#xff0c;可以直接在实数的密文上进行运算。服务器可以利用强大的计算能力&#xff0c;在不泄露用户隐私的情况下&#xff0c;为用户提供便捷的外包运算服务。然而&#xff0c;CKKS只能进行算术运算&#xff0…

Word:表格公式计算

一、求和公式 以下演示是在windows操作系统环境&#xff0c;office软件进行操作的 SUM(LEFT) 全部步骤图如下&#xff1a; 步骤一 光标置于单元格&#xff0c;依次单击【表格工具-布局】→【数据】→【公式】 步骤二 在【公式】一栏中&#xff0c;默认的是“SUM(LEFT)”求和…

Linux——k8s、deployment、pod

声明式配置文件&#xff1a;要求集群中的某一个资源&#xff0c;处于指定的状态。集群中都有哪些可以管理的资源&#xff1f;控制器&#xff1a; 用来控制pod数量、运行参数deployment 管理灵活&#xff0c;而pod的创建、删除、运行、更新等均无需直接操作pod&#xff0c;只需…

重磅信息!灰豚数字人发布首个为直播而生的AI语音大模型

AI社消息&#xff0c;近日灰豚数字人发布首个为直播而生的AI语音大模型。该声音大模型在我国获得多个之最。 灰豚语音大模型 与市面上所有声音机械化语音大模型不同的是&#xff0c;灰豚语音大模型的声音媲美真人。该大模型有语种、有内容、有韵律、有音色、有情绪、观众听众无…

windows通过文件系统访问ftp传输中文乱码

windows通过文件系统访问ftp传输中文乱码 问题原因&#xff1a;windows默认的编码格式使ftp发送文档时不支持中文&#xff0c;导致发送出去的文档是乱码文件&#xff0c;此问题是客户端问题&#xff0c;非服务端解析问题。 1、问题 windows通过文件系统访问ftp服务器&#x…

华为 HCIP-Datacom H12-821 题库 (28)

&#x1f423;博客最下方微信公众号回复题库,领取题库和教学资源 &#x1f424;诚挚欢迎IT交流有兴趣的公众号回复交流群 &#x1f998;公众号会持续更新网络小知识&#x1f63c; 1.使用 NAT 技术&#xff0c;只可以对数据报文中的网络层信息&#xff08;IP 地址&#xff09…

2024百度云智大会:众数信科携寻知AI亮相,荣获“大模型先锋伙伴”奖

9月25日&#xff0c;百度云智大会在北京中关村国际创新中心顺利举行。百度智能云携手众多伙伴围绕算力、模型、应用三个话题&#xff0c;共同探讨如何在新一轮技术变革中更好抢抓机遇、激发产业活力、实现智能跃升。 众数信科作为百度智能云的重要合作伙伴受邀出席本次大会&…