当前位置: 首页 > 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的时候…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

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

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

Linux中《基础IO》详细介绍

目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改&#xff0c;实现简单cat命令 输出信息到显示器&#xff0c;你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...

《信号与系统》第 6 章 信号与系统的时域和频域特性

目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...

从零手写Java版本的LSM Tree (一):LSM Tree 概述

&#x1f525; 推荐一个高质量的Java LSM Tree开源项目&#xff01; https://github.com/brianxiadong/java-lsm-tree java-lsm-tree 是一个从零实现的Log-Structured Merge Tree&#xff0c;专为高并发写入场景设计。 核心亮点&#xff1a; ⚡ 极致性能&#xff1a;写入速度超…...

高保真组件库:开关

一:制作关状态 拖入一个矩形作为关闭的底色:44 x 22,填充灰色CCCCCC,圆角23,边框宽度0,文本为”关“,右对齐,边距2,2,6,2,文本颜色白色FFFFFF。 拖拽一个椭圆,尺寸18 x 18,边框为0。3. 全选转为动态面板状态1命名为”关“。 二:制作开状态 复制关状态并命名为”开…...

vxe-table vue 表格复选框多选数据,实现快捷键 Shift 批量选择功能

vxe-table vue 表格复选框多选数据&#xff0c;实现快捷键 Shift 批量选择功能 查看官网&#xff1a;https://vxetable.cn 效果 代码 通过 checkbox-config.isShift 启用批量选中,启用后按住快捷键和鼠标批量选取 <template><div><vxe-grid v-bind"gri…...