当前位置: 首页 > news >正文

结构体几种实用的用法

结构体的初始化

结构体的初始化是指在声明结构体变量时,为其成员变量赋初值。结构体的初始化可以通过以下几种方式实现:

1. 在声明结构体变量的同时进行初始化:

struct Student

{

char name[20];

int age;

float score;

} student = {"张三", 18, 90.5};

上面的代码定义了一个名为Student的结构体,并在声明结构体变量student的同时进行了初始化。将字符串"张三"、整数18和浮点数90.5分别赋给了name、age和score成员变量。

2. 先声明结构体变量,再进行初始化:

struct Student

{

char name[20];

int age;

float score;

};

struct Student student;

strcpy(student.name, "李四");

student.age = 20;

student.score = 86.0;

上面的代码首先定义了一个名为Student的结构体,然后声明了一个结构体变量student。接下来,我们使用strcpy函数将字符串"李四"复制到name成员变量中,并分别将整数20和浮点数86.0赋给age和score成员变量。

3. 通过指针进行初始化:

struct Student

{

char name[20];

int age;

float score;

};

struct Student *student = (struct Student *)malloc(sizeof(struct Student));

strcpy(student->name, "王五");

student->age = 22;

student->score = 98.5;

上面的代码首先定义了一个名为Student的结构体,然后使用malloc函数动态分配了一块内存空间来存储结构体变量。接下来,我们使用指针访问结构体的成员变量,并将字符串"王五"、整数22和浮点数98.5分别赋给了name、age和score成员变量。最后,记得释放动态分配的内存空间。

结构体指针作为函数返回值的类型

函数的返回类型是结构体指针类型,表示该函数返回一个指向结构体的指针。下面是一个示例代码,演示了如何定义一个返回结构体指针类型的函数:

#include <stdio.h>

// 定义一个结构体类型

typedef struct

{

int id;

char name[20];

} Student;

// 定义一个函数,返回一个指向Student结构体的指针

Student* get_student_info()

{

Student* student = (Student*)malloc(sizeof(Student)); // 动态分配内存空间

student->id = 1;

strcpy(student->name, "John");

return student; // 返回指向Student结构体的指针

}

int main()

{

Student *student_ptr = get_student_info(); // 调用函数获取指向Student结构体的指针

printf("ID: %d\n", student_ptr->id); // 输出学生信息

printf("Name:%s\n",student_ptr->name);

free(student_ptr); // 释放动态分配的内存空间

return 0;

}

在上述示例中,我们定义了一个名为Student的结构体类型,包含两个成员变量id和name。然后,我们定义了一个名为get_student_info的函数,该函数返回一个指向Student结构体的指针。在函数内部,我们使用malloc函数动态分配了一块内存空间来存储Student结构体的信息,并初始化了其成员变量。最后,我们通过返回指针的方式将指向Student结构体的指针传递给调用者。

在main函数中,我们调用了get_student_info函数并将返回的指针赋值给student_ptr变量。然后,我们可以使用student_ptr访问Student结构体的成员变量,并进行相应的操作。最后,我们使用free函数释放了动态分配的内存空间,以避免内存泄漏。

结构体指针作为函数的参数

结构指针作为函数的参数可以实现在函数内部修改结构体变量的值,并且这些修改在函数调用结束后仍然有效。这是因为结构指针作为参数传递的是结构体变量的地址,函数内部对结构体成员的操作实际上是直接修改了结构体变量的内容。

下面是一个示例代码,演示了结构指针作为函数参数的使用:

#include <stdio.h>

#include <string.h>

struct Student

{

char name[20];

int age;

float score;

};

void update_student_info(struct Student *s, const char *new_name, int new_age, float new_score)

{

strcpy(s->name, new_name);

s->age = new_age;

s->score = new_score;

}

 

int main()

{

struct Student student1 = {"张三", 18, 90.5};

printf("Before update: ");

printf("Name: %s, Age: %d, Score: %.2f

",student1.name,student1.age, student1.score);

update_student_info(&student1, "李四", 20, 88.0);

printf("After update: ");

printf("Name: %s, Age: %d, Score: %.2f

",student1.name,student1.age, student1.score);

return 0;

}

上面的代码定义了一个名为Student的结构体,包含三个成员:name(姓名)、age(年龄)和score(成绩)。然后,我们定义了一个名为update_student_info的函数,它接受一个指向Student结构体的指针作为参数,以及新的姓名、年龄和成绩。在函数内部,我们通过指针访问结构体的成员变量,并将新的值赋给这些成员变量。这样,我们就可以通过调用这个函数来修改结构体变量的值了。

在main函数中,我们声明了一个名为student1的结构体变量,并初始化了它的成员变量。然后,我们调用update_student_info函数,将student1的地址作为参数传递给它,同时传递新的姓名、年龄和成绩。在函数调用结束后,我们可以看到student1的成员变量已经被成功修改了。

 

 

相关文章:

结构体几种实用的用法

结构体的初始化 结构体的初始化是指在声明结构体变量时&#xff0c;为其成员变量赋初值。结构体的初始化可以通过以下几种方式实现&#xff1a; 1. 在声明结构体变量的同时进行初始化&#xff1a; struct Student { char name[20]; int age; float score; } student {…...

React Native 源码分析(四)—— TurboModules JSI通信机制

本文会详细分析React Native 基于JSI的通信方式,除不会涉及Hemers引擎部分,其余代码都会详细分析,但比较简单的,不会很啰嗦,可以说是网上最完整详细的分析文章,代码通过断点截图,可以更方便查看运行的过程 1、React Native 源码分析(一)—— 启动流程 2、React Nativ…...

【C#学习】ToString() 格式化数值

格式字符串采用以下形式&#xff1a;Axx&#xff0c;其中 A 为格式说明符&#xff0c;指定格式化类型&#xff0c;xx 为精度说明符&#xff0c;控制格式化输出的有效位数或小数位数。 格式说明符 说明 示例 输出 C 货币 2.5.ToString(“C”) &#xffe5;2.50 D 十进制数 25.…...

install YAPI MongoDB

docker 运行 mongodb sudo docker run -d \ --name mongodb \ --restart always \ --netdocker \ -p 27017:27017 \ -v ./db:/data/db \ -e MONGO_INITDB_DATABASEyapi \ -e MONGO_INITDB_ROOT_USERNAMEroot \ -e MONGO_INITDB_ROOT_PASSWORD123456 \ mongo…...

大数据Doris(二十三):取消导入与其他导入案例参考

文章目录 取消导入与其他导入案例参考 一、取消导入...

SQL-LABS

less8 and 11-- 12 发现存在注入点 接下来我们会接着用联合查询 和以往的题目不一样没显错位&#xff0c;也就是没有报错的内容&#xff0c;尝试用盲注 布尔型 length&#xff08;&#xff09;返回长度 substr&#xff08;&#xff09;截取字符串&#xff08;语法substr&a…...

【中间件篇-Redis缓存数据库07】Redis缓存使用问题及互联网运用

Redis缓存使用问题 数据一致性 只要使用到缓存&#xff0c;无论是本地内存做缓存还是使用 redis 做缓存&#xff0c;那么就会存在数据同步的问题。 我以 Tomcat 向 MySQL 中写入和删改数据为例&#xff0c;来给你解释一下&#xff0c;数据的增删改操作具体是如何进行的。 我…...

物理引擎介绍

物理引擎介绍 文章目录 物理引擎介绍Panda3D物理引擎在节点上启用物理场对节点应用物理效果例子一 重力例子二 旋转的推力力的类型线性力旋转力注意事项线性力的一个例子旋转力的一个例子Bullet 如何演示重力虽然碰撞检测解决了防止对象在大多数应用中碰撞的问题,但某些游戏和…...

Ubuntu18.04平台下Qt开发程序打包的一些问题总结

目录 前言 一、在Ubuntu18.04开发环境下打包有两种方式 1、利用linuxdeployqt软件进行打包 2、利用编写shell脚本的方式进行打包 二、详细介绍shell脚本打包的方式 1、新建一个空的文件夹 2、准备脚本copylib.sh 3、准备脚本xxxx.sh。 4、给上述两个脚本添加可执行权限…...

定时器setTimeout()、setInterval()详解

定时器是JavaScript中常用的一种功能&#xff0c;它可以通过代码控制在指定的时间间隔或者时间点执行特定的代码。常见的定时器有setTimeout()和setInterval()两种。 setTimeout() setTimeout()函数可以让代码在指定的时间后执行一次&#xff0c;其语法如下&#xff1a; setT…...

测试端口开通的几种方法

一、前言 在平时使用中&#xff0c;当测试服务器端口是否开通时&#xff0c;我们首先想到的是Telnet&#xff0c;如下&#xff1a; [rootk8s-master01 ~]# telnet 192.168.1.33 6443 Trying 192.168.1.33... Connected to 192.168.1.33. Escape character is ^].但是实际生产…...

Linux每日智囊

每日分享三个Linux命令&#xff0c;悄悄培养读者的Linux技能。 rename 作用 批量修改文件名称 rename命令能够基于正则表达式对文件名进行批量修改 语法 rename [option] expression replacement file expression:文件命中需要替换的字符串 replacement:将文件名中指定…...

Word添加附件(附件图标被挡住的问题)

本文主要是为了记录一下自己使用word添加附件的时候遇到的一个坑&#xff0c;就是添加了附件&#xff0c;附件图标没有展示的问题。 选择 插入——对象&#xff0c;然后点击由文件创建然后再点击浏览本地电脑中的文件&#xff0c;选择需要添加的文件&#xff0c;当然也可以选择…...

【数据结构】单链表 | 详细讲解

线性表顺序存储结构的优缺点 顺序表优点 无须为了表示中间的元素之间的逻辑关系而增加额外的存储空间&#xff1b;因为以数组形式存储&#xff0c;可以快速地存取表中任一位置的元素。 顺序表缺点 插入和删除操作需要移动大量元素&#xff0c;时间复杂度为O(N)&#xff1b;…...

每日一题:编写程序,使程序分别输出两个整数的加减乘除运算结果

文章目录 每日一题一、编写程序&#xff0c;使程序分别输出两个整数的加减乘除运算结果以下是一个使用 Java 编写的程序&#xff0c;可以输出两个整数的加减乘除运算结果&#xff1a;以下是一个简单的 Python 程序&#xff0c;可以计算两个整数的加减乘除运算结果&#xff1a; …...

alpine linux如何指定软件包安装源

永久修改apk下载源 vi etc/apk/repositories替换成阿里源 http://mirrors.aliyun.com/alpine/v3.8/main/ http://mirrors.aliyun.com/alpine/v3.8/community/更新源 apk update临时修改下载源 直接在软件安装后面 添加源地址 apk add php5.6 --repository http://nl.alpine…...

ubuntu设置脚本开机自启动

rc-local.service flexmitd1:~$ cd /lib/systemd/system/ flexmitd1:/lib/systemd/system$ ls |grep rc-local.service rc-local.service rc-local.service.d flexmitd1:/lib/systemd/system$ pwd /lib/systemd/system flexmitd1:/lib/systemd/system$确保有rc-local.service文…...

cobol-简介

cobol学习笔记 cobol概述 COBOL是一门高级语言。我们必须了解COBOL的工作方式。计算机只能理解机器代码&#xff0c;0和1的二进制流。 COBOL代码必须使用编译器转换成机器代码。通过编译器运行程序源码。编译器首先检查是否有任何语法错误&#xff0c;然后将其转换为机器语言。…...

使用 JMeter 分布式性能测试

作为一个纯 JAVA 的GUI应用&#xff0c;JMeter 对于CPU和内存的消耗还是很惊人的&#xff0c;所以当需要模拟数以千计的并发用户时&#xff0c;使用单台机器模拟所有的并发用户就有些力不从心&#xff0c;甚至还会引起JAVA内存溢出的错误。不过&#xff0c;JMeter 也可以像 Loa…...

【工具流】WSL2安装

一些废话 最近看到了PKU出品的cs自学指南&#xff0c;想要跟着里面的自学路径学国外的优质课程&#xff0c;无奈大多数pre教程里面都是直接Linux环境下的操作&#xff0c;并且我在CSwiki看到了那个熟悉的上学期学了一点的missing-semester课。 上学期自学missing-semester的时候…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器

一、原理介绍 传统滑模观测器采用如下结构&#xff1a; 传统SMO中LPF会带来相位延迟和幅值衰减&#xff0c;并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF)&#xff0c;可以去除高次谐波&#xff0c;并且不用相位补偿就可以获得一个误差较小的转子位…...

springboot 日志类切面,接口成功记录日志,失败不记录

springboot 日志类切面&#xff0c;接口成功记录日志&#xff0c;失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件&#xff0c;这个上传文件是整体功能的一部分&#xff0c;文件在上传的过程中…...