C语言----初始结构体详解

article/2025/8/30 6:06:30

此文是作者初次学习C语言的时候,写的笔记博文,如有错误请及时指正,谢谢!!!


目录

1,什么是结构体

2. 结构体的声明

2,1结构体声明

2,2结构体成员的类型

2,3结构体变量的定义的初始化

3. 结构体成员的访问

4. 结构体传参

5,拓展




1,什么是结构体

我们已经学过的数据类型有 char, int,long, short, long long, float, double,这些类型只能描述单一的对象,不能描述复杂的对象。 比如现在我们要描述一个学生类型的复杂对象,需要描述他的名字, 年龄, 性别, 成绩----。 我们就需要吧char类型的, int类型的, float类型的。整合到一起共同构成这个复杂对象。把这些单一对象和在一起就需要用到结构体。

结构是一些值的集合,这些值称为成员变量。结构的每一个成员可以是不同类型的变量。

2. 结构体的声明

2,1结构体声明

基本结构:

struct 结构体名

{

        成员列表;

}变量列表;

这里struct  结构体名,共同构成了一个数据类型名。


//结构体类型的声明
struct stu//这里的struct是用来定义结构体//stu是结构体名(自定义的)
{char name;//名字int age;//年龄char sex[8];//性别float score;//分数};//注意这里有一个;
struct stu
{char name;int age;}s1, s2, s3;
//这里的s1,s2,s3是通过struct stu类型创建的变量
//可以写也可以不写,可以写一个也可以写多个。
//此时创建的s1, s2, s3,是全局变量。
//但是平时很少这样定义

同样结构体类型变量也可以在主函数内创建


int main()
{//在主函数内部也可以创建结构体变量struct stu s4;struct stu s5;//这里的s4, s5就是局部变量//struct stu整体才是结构体类型, 不能随便省略任何单个词//如果觉得结构体类型太长, 这里可以用到typedef//类型重定义或者类型重命名typedef struct stu stu;//把struct stu 重新起个名字叫stustu s5;stu s6;//这里经过类型重定义,就可以用自定义的类型名来创建变量s5,s6return 0;
}

类型重定义也有别的表示方式,例如在定义结构体的时候给它重命名。


typedef struct stu
{char name;int age;char sex[8];float score;
}stu;//然后以后就可以用 stu 来定义结构体变量。

2,2结构体成员的类型

结构的成员可以是标量,数组, 指针,甚至是其他结构体。

2,3结构体变量的定义的初始化

结构体变量的定义

struct Point
{int x;int y;
}p1; //声明类型的同时定义变量p1struct Point p2; //定义结构体变量p2

结构体变量的初始化

//简单结构体初始化
struct Point
{int x;int y;
}p1 = {100, 200};//用大括号来初始化struct Point p2 = { 100, 200 };
//复杂结构体的初始化
struct s
{char a;struct point po;double b;char arr[10];
};//也是使用大括号来初始化
struct s ss = { 'w', {100, 200}, 1.1, "abcdef" };

//复杂结构体初始化
struct Node
{int data;struct Point p;struct Node* next;
}n1 = { 10, {4,5}, NULL }; //结构体嵌套初始化struct Node n2 = { 20, {5, 6}, NULL };//结构体嵌套初始化


3. 结构体成员的访问

这里就要用到结构体成员访问操作符 " . " 和 " -> " 。

看实例

struct stu
{char name[30];int age;double score;
};struct point
{int x;int y;
};struct test
{int a;struct stu b;struct point c;char d;
};#include<stdio.h>void print1(struct test tt)//传过来的是数据,实参把数据传给形参
{printf("%d\n", tt.a);printf("%s %d %lf\n", tt.b.name, tt.b.age, tt.b.score);printf("%d %d\n", tt.c.x, tt.c.y);printf("%c\n", tt.d);
}void print2(struct test* tt)//传过来的是地址
{printf("%d\n", tt->a);printf("%s %d %lf\n", tt->b.name, tt->b.age, tt->b.score);printf("%d %d\n", tt->c.x, tt->c.y);printf("%c\n", tt->d);//注意这里不可以tt->b->name}int main()
{struct test tt = { 1, {"张雪峰", 21,100.0}, {100, 200}, 'w' };//用”.“字符,     结构体变量.结构体成员print1(tt);//传值调用//用”->“字符//通常运用于结构体指针print2(&tt);//这里是传址调用。     结构体指针->结构体成员return 0;
}

也可以通过访问符来修改数据

int main()
{struct test tt = { 1, {"张雪峰", 21,100.0}, {100, 200}, 'w' };tt.a = 1000;strcpy(tt.b.name, "刘雪萍");tt.b.age = 20;tt.b.score = 99.0;tt.c.x = 10000;tt.c.y = 20000;tt.d = 'q';print1(tt);//打印return 0;
}



4. 结构体传参


struct S
{int data[1000];int num;
};
struct S s = {{1,2,3,4}, 1000};//结构体值传参
void print1(struct S s)
{printf("%d\n", s.num);
}//结构体址传参
void print2(struct S* ps)
{printf("%d\n", ps->num);
}int main()
{print1(s);  //传结构体print2(&s); //传地址return 0;
}

上面print1和print2函数显然第二个会更好一点

原因:

1,函数传参的时候,参数是需要压栈的。

2,如果传递的一个结构体对象的时候,结构体过于大,参数压栈的系统开销就比较大,所以会导致性能的下降。

结论:结构体传参的时候,要传结构体的地址。

5,拓展

内存被分为栈区, 堆区, 静态区。

栈区:局部变量, 函数的参数(形式参数)

堆区:动态内存开辟, mal loc, free loc, rea loc

静态区: 静态变量, 全局变量


http://chatgpt.dhexx.cn/article/tV5kv0WZ.shtml

相关文章

openVAS 介绍

含义及作用&#xff1a; OpenVAS是开放式漏洞评估系统&#xff0c;也可以说它是一个包含着相关工具的网络扫描器。其核心部件是一个服务器&#xff0c;包括一套网络漏洞测试程序&#xff0c;可以检测远程系统和应用程序中的安全问题。 OpenVAS 的功能包括非认证测试、认证测…

040 OpenVAS的下载与安装

文章目录 一&#xff1a;OpenVAS的下载二&#xff1a;OpenVAS的安装2.1&#xff1a;中文版本步骤2.2&#xff1a;英文版本步骤 一&#xff1a;OpenVAS的下载 OpenVAS是开源的网络漏洞扫描器&#xff0c;自从Nessus收费了之后&#xff0c;分支出来的免费的 官网&#xff1a;htt…

Linux 漏洞扫描 openvas

什么是OpenVAS OpenVAS是一款开源的漏洞扫描攻击&#xff0c;主要用来检测网络或主机的安全性。其强大的扫描能力来自于集成数万个漏洞测试程序&#xff0c;这些测试程序以插件的形式提供&#xff0c;可以从官方网站免费更新. 一套完整的OpenVAS系统如下图显示 ① 客户层组件 …

关于openvas

目录 一&#xff1a;什么是openvas 二&#xff1a;作者 三&#xff1a;系统简介 四&#xff1a;建立架构 五&#xff1a;openvas功能 六&#xff1a;OpenVAS的核心组件 七&#xff1a;OpenVAS部署 八&#xff1a;openvas的组件构成 一&#xff1a;什么是openvas OpenV…

openvas

目录 一、openvas的简介 1、简介 2、建立的构架 二、openvas的环境 三、openvas的组件构成 四、openvas安装及使用 一、openvas的简介 1、简介 OpenVAS是开放式漏洞评估系统&#xff0c;也可以说它是⼀个包含着相关⼯具的⽹络扫描器。其核⼼部件是⼀个服务器&#xff0c;包括…

风险评估系统OpenVAS配置使用教程说明

penVAS是一款免费的开放式风险评估工具&#xff0c;可以检测远程系统和应用程序中的安全问题。最初作为Nessus一个子工具&#xff0c;被称为 GNessUs。其特点就是允许继续免费开发。最早是由Portcullis Computer security公司的渗透测试人员发布的&#xff0c;之后由Slashdot网…

OpenVas 漏洞扫描器使用教程

Openvas简介 Openvas是开源的&#xff0c;是Nessus项目分支&#xff0c;用于管理目标系统的漏洞&#xff0c;检测目标网络或主机的安全性。它的评估能力来源于数万个漏洞测试程序&#xff0c;openvas 早起版本还有一个客户端&#xff0c;现在的版本已经不提供客户端程序&#…

OpenVAS介绍

一、背景&#xff1a; OpenVAS&#xff08;Open Vulnerability Assessment System&#xff09;是开放式漏洞评估系统&#xff0c;其核心部分是一个服务器。该服务器包括一套网络漏洞测试程序&#xff0c;可以检测远程系统和应用程序中的安全问题。OpenVAS不同与传统的漏洞扫描…

openVAS简介

文章目录 openVAS一、openVAS开发团队二、openVAS背景三、openVAS作用四、openVAS部署kali部署部署openVAS镜像简单使用新建目标&#xff08;target&#xff09;新建任务&#xff08;tasks&#xff09;开始扫描扫描详情下载报告 openVAS O p e n V A S 是 开 放 式 漏 洞 评 估…

OpenVAS 安装及基本配置

OpenVAS 安装及基本配置 1 .概要 系统简介 OpenVAS是开放式漏洞评估系统&#xff0c;也可以说它是一个包含着相关工具的网络扫描器。其核心部件是一个服务器&#xff0c;包括一套网络漏洞测试程序&#xff0c;可以检测远程系统和应用程序中的安全问题。建立架构 OpenVAS是…

5.数据验证

数据验证 1、数据绑定失败&#xff1a;比如需要数字却输入了字母&#xff1b; 2、数据不合法&#xff1a;可以认为是业务错误&#xff0c;通过自定义验证器验证&#xff0c;如用户名长度必须在5-20之间&#xff0c;我们却输入了100个字符等&#xff1b; 3、错误对象&#xff1a…

认证篇——消息认证码

目录 一、消息认证码介绍 &#xff11;&#xff09;消息认证码的使用步骤&#xff1a; &#xff12;&#xff09;消息认证码的密钥配送问题&#xff1a; &#xff13;&#xff09;消息认证码的实例&#xff1a; &#xff14;&#xff09;消息认证码的实现&#xff1a; 二…

获得验证信息

用的最多的验证信息为URL&#xff0c;TEXT&#xff0c;TITLE 以百度为例 from selenium import webdriverurl "https://www.baidu.com/" driver webdriver.Chrome() driver.get(url) driver.maximize_window() ### 获取当前页面的title title driver.title prin…

密码框验证信息

效果展示&#xff1a; 代码展示 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><link rel"stylesheet" type"text/css" href"fontss2/iconfont.css" /><style&g…

信息认证技术

这个章节会介绍一些比较有意思的东西&#xff0c;例如哈希函数&#xff0c;数字签名&#xff0c;身份认证等&#xff01; 1.一个安全的认证 系统应满足什么样的条件&#xff1f; 合法的接受者能够检验所接受消息的合法性和真实性 合法的发送方对所发送的消息无法进行否认 除了合…

验证登录信息

验证登录信息 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 开发工具与关键技术&#xff1a;Visual Studio 作者&#xff1a;李继金 撰写时间&#xff1a;2019年 5月24日 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 每个项目都会有登录页面&#xff0c;…

如何识别验证码

http://www.jianblog.com/2009/02/09/574/ 周俭 Blog 基于OpenCV的PHP图像人脸识别技术 二月 9, 2009 at 10:13 上午 由 catch Filed under PHP, 编程 今天无意中发现用OpenCV可以实现人脸识别。找个时间研究下用来识别验证码看可行不&#xff1f;呵呵。。 安装测试了一下&am…

功能验证流程

下图显示了功能验证流程&#xff1a; 这个验证过程可以被分解成三个主要阶段&#xff1a; 制定验证策略和验证计划&#xff1b; 创建验证平台&#xff0c; 运行和调试&#xff1b; 覆盖率分析和回归测试&#xff1b; &#xff11; 制定验证策略和验证计划阶段 制定验证策略和验…

Javascript正则表达式实现输入框验证信息

1.了解正则表达式可以: 测试字符串的某个模式。例如&#xff0c;可以对一个输入字符串进行测试&#xff0c;看在该字符串是否存在一个电话号码模式或一个信用卡号码模式。这称为数据有效性验证替换文本。可以在文档中使用一个正则表达式来标识特定文字&#xff0c;然后可以全部…

JS输入框验证信息提示

描述&#xff1a; 1、首先输入框默认显示手机号&#xff0c;下面提示&#xff1a;请输入你的手机号 2、光标放上去的时候开始填写&#xff0c;填写完毕后&#xff08;那么就要先提取鼠标失去光标这个事件&#xff09;如果手机号码不正确&#xff1a; 文本框变红&#xff0c;并…