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

C语言----结构体

结构体

结构体的含义

  1. 自定义的数据类型

  2. 它是由很多的数据组合成的一个整体,结构型数据

  3. 其中的每一个数据,都是结构体的成员

书写的位置:

函数的里面:局部位置,只能再本函数中使用

函数的外面:全局位置,在所有的函数中都可以使用

#include<stdio.h>
#include<string.h>
struct myFriend
{char name[100];int age;char gender;double height;
};
int main()
{struct myFriend f1;//因为这步是要把现定义的字符串传入字符数组,所以使用strcopy函数strcpy(f1.name,"刘慧玲");f1.age = 19;f1.gender = 'F';f1.height = 1.63;printf("我朋友的名字是%s\n",f1.name);printf("我朋友的年龄是%d岁\n",f1.age);printf("我朋友的性别是%c\n",f1.gender);printf("我朋友的身高是%.2f米\n",f1.height);return 0;
}

结构化数组代码案例(3种方式)

直接定义结构体数组
#include<stdio.h>
#include<string.h>
struct student{char name[100];int age;};
int main(){//定义student型变量并传入实参struct student st1 = {"张三",18};struct student st2 = {"李四",19}; struct student st3 = {"王五",20};//定义数组来接收3个student变量struct student strArr[3] = {st1,st2,st3};int i;for(i=0;i<3;i++){printf("学生的名字为:%s;学生的年龄为:%d\n",strArr[i].name,strArr[i].age);}return 0;
}

直接将三个 struct student 对象初始化到一个数组中,这在某些编译器中可能会引发类型不匹配的错误

定义结构体指针数组存放数据
#include<stdio.h>
#include<string.h>struct student
{char name[100];int age;
};int main()
{struct student st1 = {"张三", 18};struct student st2 = {"李四", 19};struct student st3 = {"王五", 20};//定义指针数组来接收3个student变量的内存地址struct student *strArr[3] = {&st1, &st2, &st3};int i;for(i = 0; i < 3; i++){//指向结构体或类对象的指针数组访问数据需使用->//strArr[i]->name 表示访问 strArr 数组中第 i 个元素所指向的对象的 name 成员。printf("学生的名字为:%s;学生的年龄为:%d\n", strArr[i]->name, strArr[i]->age);}return 0;
}
先定义结构体数组,再依次写入数据
#include<stdio.h>
#include<string.h>struct student
{char name[100];int age;
};
int main()
{//struct student strArr[3] = {{"张三", 18}, {"李四", 19}, {"王五", 20}};//上面的定义效果与下面的一致,是依次初始化结构体数组中的元素struct student strArr[3];int i;strcpy(strArr[0].name, "张三");strArr[0].age = 18;strcpy(strArr[1].name, "李四");strArr[1].age = 19;strcpy(strArr[2].name, "王五");strArr[2].age = 20;for(i = 0;i < 3;i++){printf("学生的名字为:%s;学生的年龄为:%d\n", strArr[i].name, strArr[i].age);}return 0;
}

起别名

代码案例
#include<stdio.h>
//其中的gameRole可以省略不写
typedef struct gameRole
{char name[100];int attact;int defend;int blood;
//GR就是起的别名
}GR;
int main()
{//定义时直接使用GRGR gr1 = {"火男",100,50,50};GR gr2 = {"狐狸",100,40,60};GR gr3 = {"岳山",40,80,80};GR *grArr[3] = {&gr1,&gr2,&gr3};int len = sizeof(grArr) / sizeof(grArr[0]);int i;for(i=0;i<len;i++){printf("角色名字:%s;角色攻击:%d;角色防御:%d;角色血量:%d;\n",grArr[i]->name,grArr[i]->attact,grArr[i]->defend,grArr[i]->blood);}return 0;
}

结构体作为函数参数

函数中可以传递结构体

代码案例(通过函数修改结构体变量内的数据)
#include<stdio.h>
//定义一个结构体
typedef struct student
{char name[100];int age;
}S;
//因为函数中需要结构体传参,所以要声明在结构体下方,(代码自上往下依次执行)
void method1(S *str);
void method2(S str);
int main()
{//定义结构体变量S st = {"name",0};//调用method2函数修改结构体变量中的数据method2(st);    printf("main中调用method2修改后的的姓名:%s,年龄%d\n",st.name,st.age);//name,0;结构体数据未被修改printf("--------------------------------------------\n");method1(&st);   printf("main中调用method1修改后的的姓名:%s,年龄%d\n",st.name,st.age);//张三,18;结构体数据已被修改return 0;
}
//method1函数中是传递结构体变量的内存地址,直接指向了结构体变量,所以可以修改函数外部的数据
void method1(S *str)
{printf("接收到的姓名:%s,年龄%d\n",str->name,(*str).age);printf("请输入你要更新的姓名:");scanf("%s",(*str).name);printf("请输入你要更新的年龄:");scanf("%d",&(str->age));printf("method1中修改后的的姓名:%s,年龄%d\n",str->name,(*str).age);
}
//method2函数中是传递结构体变量的数据赋给str,str是函数内的数据,所以函数外部的数据未被修改,修改的是函数内的str
void method2(S str)
{printf("接收到的姓名:%s,年龄%d\n",str.name,str.age);printf("请输入你要更新的姓名:");scanf("%s",str.name);printf("请输入你要更新的年龄:");scanf("%d",&(str.age));printf("method2中修改后的的姓名:%s,年龄%d\n",str.name,str.age);
}

结构体嵌套

结构体中的成员是其他的结构体

代码案例
#include<stdio.h>
#include<string.h>
typedef struct contactWay
{char phone[12];char mail[12];
}CW;
typedef struct student
{char name[100];char sex;int age;double height;CW cw;
}ST;
int main()
{ST st1 = {"小柒",'M',19,1.78,{"15976633334","2222@qq.com"}};ST st2;strcpy(st2.name,"小扒");st2.sex = 'F';st2.age = 19;st2.height = 1.62;strcpy(st2.cw.phone,"15979673555");strcpy(st2.cw.mail,"3333@qq.com");printf("姓名:%s,性别:%c,年龄:%d,身高:%.2lf,电话:%s,邮箱:%s\n",st1.name,st1.sex,st1.age,st1.height,st1.cw.phone,st1.cw.mail);printf("姓名:%s,性别:%c,年龄:%d,身高:%.2lf,电话:%s,邮箱:%s\n",st2.name,st2.sex,st2.age,st2.height,st2.cw.phone,st2.cw.mail);return 0;
}

内存对齐:

不管是结构体,还是普通的变量都存在内存对齐

规则:

只能放在自己类型整数倍的内存地址上

简单理解: 内存地址 /占用字节 = 结果可以整除

举例:

int存放的位置:内存地址一定能被4整除

1ong 1ong存放的位置:内存地址一定能被8整除

double存放的位置:内存地址一定能被8整除

结构体的内存对齐:

结构体在上面的基础上又多了一条,结构体的总大小,是最大类型的整数倍(用来确定最后一个数据补位的情况)

切记!:对齐的时候会补空白字节,但是不会改变原本字节的大小,例:char补位之后,本身还是1个字节

定义结构体时,小的数据类型定义在上面,大的数据类型定义在下面,可以有效节约空间

代码案例
#include<stdio.h>
struct ram
{//内存地址从0开始char a;     //此时内存地址为0  char必须放在1的整数倍的内存地址内     0可以放    放入后就占用了0int c;      //此时内存地址为1  int必须放在4的整数倍的内存地址内      4可以放    放入后就占用了4-8char b;     //此时内存地址为9  char必须放在1的整数倍的内存地址内     9可以放    放入后就占用了9double d;   //此时内存地址为10 double必须放在8的整数倍的内存地址内   16可以放   放入后就占用了16-24
};
int main()
{struct ram a;printf("%d",sizeof(a));//一共占用了24个字节return 0;
}

相关文章:

C语言----结构体

结构体 结构体的含义 自定义的数据类型 它是由很多的数据组合成的一个整体&#xff0c;结构型数据 其中的每一个数据&#xff0c;都是结构体的成员 书写的位置: 函数的里面:局部位置&#xff0c;只能再本函数中使用 函数的外面:全局位置&#xff0c;在所有的函数中都可以…...

基于HKELM混合核极限学习机多输出回归预测 (多输入多输出) Matlab代码

基于HKELM混合核极限学习机多输出回归预测(多输入多输出)Matlab代码 每个输出都有以下线性拟合图等四张图&#xff01;&#xff01;&#xff01;具体看图&#xff0c;独家图像&#xff01;&#xff01;&#xff01; 程序已经调试好&#xff0c;替换数据集根据输出个数修改out…...

经纬恒润荣获小米汽车优秀质量奖!

小米SU7上市已超百天&#xff0c;在品质经过客户严选的同时&#xff0c;产量与交付量屡创新高&#xff0c;6-7月连续两个月交付量均超过10000台。为奖励对小米汽车质量和交付做出卓越贡献的合作伙伴团队及个人&#xff0c;小米向质量表现突出的供应商授予了优秀质量奖。经纬恒润…...

Linux 软件编程学习第十一天

1.管道&#xff1a; 进程间通信最简单的形式 2.信号&#xff1a; 内核层和用户层通信的一种方式 1.信号类型&#xff1a; 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 1…...

hive udtf 函数:输入一个字符串,将这个字符串按照特殊的逻辑处理之后,输出4个字段

这里要继承GenericUDTF 这个抽象类&#xff0c;直接上代码&#xff1a; package com.xxx.hive.udf; import org.apache.commons.lang.StringUtils; import org.apache.hadoop.hive.ql.exec.Description; import org.apache.hadoop.hive.ql.exec.UDFArgumentException; import …...

【实现100个unity特效之16】unity2022之前或者之后版本实现全屏shader graph的不同方式 —— 适用于人物受伤红屏或者一些其他状态效果

最终效果 文章目录 最终效果前言unity2022版本 Fullscreen shader graph首先&#xff0c;请注意你的Inity版本&#xff0c;是不是2022.2以上&#xff0c;并且项目是URP项且基本配置 修改shader graph边缘效果动起来优化科幻风制作一些变量最终效果最终节点图代码控制 2022之前版…...

比特币使用ord蚀刻符文---简单笔记

说明 毕竟符文热度过了&#xff0c;今年四月份做的笔记分享出来 蚀刻符文需要先同步完区块数据&#xff0c;和index文件&#xff0c;不然蚀刻会失败&#xff0c;在testnet和signet网络也一样。 创建钱包&#xff08;会输出助记词&#xff09;&#xff1a; ord --bitcoin-da…...

大数据-74 Kafka 高级特性 稳定性 - 控制器、可靠性 副本复制、失效副本、副本滞后 多图一篇详解

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…...

c# 什么是扩展方法

官方解释 扩展方法使你能够向现有类型“添加”方法&#xff0c;而无需创建新的派生类型、重新编译或以其他方式修改原始类型。 扩展方法是一种静态方法&#xff0c;但可以像扩展类型上的实例方法一样进行调用。 对于用 C#、F# 和 Visual Basic 编写的客户端代码&#x…...

全屏组件封装(react18+antd)

基于reactts封装的公用全屏组件 1、封装组件 在components下面构建FullScreenButton文件&#xff1a; FullScreenButton/index.tsx import React, { useState, useCallback, useEffect } from "react"; import { FullscreenOutlined, FullscreenExitOutlined } fr…...

wordpress全局自适应网址导航整站打包源码,含主题和数据库

wordpress全局自适应网址导航整站打包源码&#xff0c;含主题和数据库。直接恢复就可以使用了。 这个是自适应的布局设计&#xff0c;体验还不错。用网址导航是可以的。 代码免费下载&#xff1a;百度网盘...

PyTorch深度学习框架

最近放假在超星总部河北燕郊园区实习&#xff0c;本来是搞前后端开发岗位的&#xff0c;然后带我的副总老大哥比较关照我&#xff0c;了解我的情况后得知我大三选的方向是大数据&#xff0c;于是建议我学学python、Hadoop&#xff0c;Hadoop我看了一下内容比较多&#xff0c;而…...

Python和AI库NumPy(二):数组创建与操作

目录 1. 数组创建 1.1 基本数组创建 1.2 使用内置函数创建数组 1.3 特殊数组的创建 2. 数组的基本操作 2.1 数组属性 2.2 数组索引和切片 2.3 数组的形状操作 2.4 数组拼接与分割 3. 数组的数学操作 3.1 基本算术操作 3.2 广播机制 3.3 线性代数运算 4. 高级数组…...

GD32 SPI驱动代码

1.0 软件驱动NOR FLASH MOSI&#xff1a;主机发送&#xff0c;从机接收 MISO&#xff1a;主机接收&#xff0c;从机发送 CS&#xff1a;表示的是片选信号 2.0 宏定义各个引脚 // 片选 #define SET_SPI_NSS() gpio_bit_set(GPIOE,GPIO_PIN_2) #define CLR_SPI_NSS() gpio_…...

Qgis 开发初级 《数据库和图层》

Qgis 可以加载很多数据源&#xff0c;像shapefile 文件&#xff0c; gdb文件等&#xff0c;还可以直接链接企业数据库。在这里&#xff0c;我只介绍比较常用的本地数据库 gdb。gdb 是esri 开发的数据库&#xff0c;gdb数据库不是开源的&#xff0c;qigs用了OpenFileGdb的驱动读…...

三大机器学习框架对比:TensorFlow、PyTorch与Scikit-Learn

目录 前言 概述 TensorFlow PyTorch Scikit-Learn 总结 前言 本篇旨在深入探讨三种主流机器学习框架——TensorFlow、PyTorch与Scikit-Learn。随着数据科学和人工智能领域的快速发展&#xff0c;这些框架已成为构建和部署机器学习模型的关键工具。鉴于每种框架的特点和优…...

Apache OFBiz 曝出严重漏洞,允许预身份验证 RCE

近日&#xff0c;研究人员发现 Apache OFBiz 中存在一个新的关键漏洞&#xff0c;该漏洞是 Apache OFBiz 中的一个错误授权问题&#xff0c;被追踪为CVE-2024-38856。该漏洞影响 18.12.14 之前的版本&#xff0c;18.12.15 版本解决了该漏洞。 SonicWall 的安全研究员 Hasib Vh…...

SpringCloud 微服务nacos和eureka

Spring是微服务架构&#xff0c;是一种经过良好架构设计的分布式架构方案。 微服务架构有如下特性 单一&#xff1a;微服务拆分粒度小&#xff0c;每一个服务都对应唯一的业务能力&#xff0c;做到单一职责&#xff0c;避免重复业务开发 面向服务&#xff1a;微服务对外暴漏…...

Java学习篇(一)| 如何生成分布式全局唯一ID

Java学习篇&#xff08;一&#xff09;| 如何生成分布式全局唯一ID 一、使用场景二、常用方法1、UUID &#xff08;尽量不要用&#xff09;2、数据库自增 &#xff08;用的最多-但不适合做分布式ID&#xff09;3、Redis 生成ID &#xff08;可用&#xff09;1、原因2、通过代码…...

c++ 弹窗办法

在C中&#xff0c;创建弹窗的方法有多种。下面我会逐一介绍几种常见的方法&#xff0c;并提供相应的代码示例。 使用Windows API创建弹窗 使用Windows API可以创建原生的Windows弹窗。前面已经提供了一个示例代码&#xff0c;下面我会逐步解释该代码的关键部分&#xff1a; …...

新手友好:借助快马AI零基础实现openclaw101官网登录功能入门教程

今天想和大家分享一个特别适合编程新手的实践项目——如何用最简单的方式实现一个网站登录功能。作为一个刚入门的前端学习者&#xff0c;我发现登录功能看似简单&#xff0c;其实包含了很多核心知识点。通过InsCode(快马)平台&#xff0c;我们可以轻松获得一个完整可运行的登录…...

JSW-8016GM4 加固交换机

■ 三层交换机&#xff0c;功能强大 ■ 支持16个10/100/1000M 以太网接口 ■ 支持4个10G光纤接口 ■ 支持IEEE802相关协议 ■ 2U高度&#xff0c;可在方舱上架安装 ■ 满足电磁兼容要求 ■ 整机加固设计&#xff0c;满足国军标相关要求主要参数产品类型&#xff1a;千兆以太网交…...

别再只用电容了!从π型RC到电子滤波,手把手教你选对硬件滤波方案(附电路图)

硬件滤波方案实战指南&#xff1a;从基础RC到电子滤波的工程决策 在嵌入式系统和电源设计中&#xff0c;噪声抑制是每个工程师必须面对的挑战。想象一下&#xff0c;你精心设计的传感器电路因为电源噪声导致数据跳变&#xff0c;或者音频放大器传出令人不快的嗡嗡声——这些问题…...

第二桌面 + 小龙虾:让企业AI智能体安全落地、全员可用

本文发布于2026年4月1日。引言&#xff1a;从“养虾”到“用虾”&#xff0c;AI落地需要新底座过去几个月&#xff0c;OpenClaw&#xff08;昵称“小龙虾”&#xff09;在开发者圈子里火得一塌糊涂。这个开源AI智能体网关&#xff0c;能听懂人话&#xff0c;还能替你操作电脑、…...

工业机器人嵌入式系统建模与自动化工具项目三基于RAPID指令的故障排查与项目实施

目录 一、 项目背景与研发目标 1.1 项目研发背景 1.2 项目核心目标 二、 项目全周期进展 2.1 需求分析与环境搭建阶段&#xff08;完成度100%&#xff09; 2.2 核心模块编码开发阶段&#xff08;完成度100%&#xff09; 2.3 功能调试阶段&#xff08;核心故障爆发…...

Visual C++组件维护完全指南:从问题诊断到系统优化

Visual C组件维护完全指南&#xff1a;从问题诊断到系统优化 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist Visual C组件维护是Windows系统稳定运行的关键环节&…...

新手福音:用快马平台生成wsl安装ubuntu图文教程,轻松入门linux开发

最近在学Linux开发&#xff0c;发现Windows Subsystem for Linux&#xff08;WSL&#xff09;真是个神器&#xff0c;特别是搭配Ubuntu使用&#xff0c;既保留了Windows的便利性&#xff0c;又能体验原汁原味的Linux环境。不过刚开始安装配置时踩了不少坑&#xff0c;后来用Ins…...

从rdt1.0到rdt3.0:可靠数据传输协议的演进与发送接收端FSM解析

1. 可靠数据传输协议的前世今生 第一次接触可靠数据传输协议&#xff08;Reliable Data Transfer&#xff0c;简称rdt&#xff09;是在十多年前的一个网络编程项目里。当时为了确保数据能准确无误地传输&#xff0c;我翻遍了各种资料&#xff0c;最终在《计算机网络&#xff1a…...

美的集团2025年营收创新高、利润100%分红 落地1.3万个AI智能体

3月30日&#xff0c;美的集团发布2025年年报&#xff0c;实现营业总收入4585亿元&#xff0c;同比增长12.1%&#xff1b;归属于上市公司股东的净利润439.5亿元&#xff0c;同比上升14%。在业绩再创新高的同时&#xff0c;伴随我国“人工智能”行动的全面实施&#xff0c;美的集…...

【数字电路】从双稳态到触发器:时序逻辑的存储基石

1. 数字世界的记忆细胞&#xff1a;双稳态电路探秘 当你按下电脑电源键的瞬间&#xff0c;数十亿个微型存储单元开始工作&#xff0c;它们就像数字世界的记忆细胞&#xff0c;忠实地记录着每一个比特的信息。这一切的起点&#xff0c;正是我们今天要探讨的双稳态电路。想象一下…...