结构体笔记

 

结构体

C语言中的数据类型:

基本数据类型:char/int/short/double/float/long

构造数据类型:数组,指针,结构体,共用体,枚举

概念:

结构体是用户自定义的一种数据类型,可以是相同的数据类型,也可以是不同的数据类型的集合

格式:

struct 结构名

{

数据类型 成员1;

数据类型 成员2;

数据类型 成员3;

数据类型 成员4;

......

数据类型 成员n;

}; //结尾的";"不可省略

*分析:

struct:是结构体的关键字

结构名:满足命名规范

{}:不能省略

数据类型:可以是基本数据类型,也可以是构造数据类型

成员:可以是任意个成员

结构体的声明可以在任意位置,但一般在头文件中

结构体在声明类型时不占用内存空间,当使用结构体类型定义变量时申请空间

结构体的初始化和赋值

间接初始化和赋值

格式:

struct 结构名

{

数据类型 成员1;

数据类型 成员2;

数据类型 成员3;

数据类型 成员4;

......

数据类型 成员n;

};

struct 结构名 变量={数据类型 成员1,...,数据类型 成员n} //按顺序初始化

struct 结构名 变量={.成员1=,...,.成员n=} //不按顺序初始化(用". 成员"+成员对应的数据类型的数据)

输出结构体(结构体变量访问内部成员,通过"."访问)

printf("占位符\n",变量.成员1,变量.成员2,...)

间接初始化练习:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>struct student
{char name[128];int age;double score;
};   int main(int argc, const char *argv[])
{struct student s1={"张三",24,98};struct student s2={"李四",36,87};struct student s3={"王五",18,43};printf("姓名:%s年龄:%d成绩%lf\n",s1.name,s1.age,s1.score);printf("姓名:%s年龄:%d成绩%lf\n",s2.name,s2.age,s2.score);printf("姓名:%s年龄:%d成绩%lf\n",s3.name,s3.age,s3.score);return 0;
}

间接赋值练习:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct student
{char name[128];int age;double score;
};
int main(int argc, const char *argv[])
{//间接初始化 struct student s1={"张三",24,98};struct student s2={"李四",36,87};struct student s3={"王五",18,43};                                            printf("姓名:%s年龄:%d成绩%lf\n",s1.name,s1.age,s1.score);printf("姓名:%s年龄:%d成绩%lf\n",s2.name,s2.age,s2.score);printf("姓名:%s年龄:%d成绩%lf\n",s3.name,s3.age,s3.score);//赋值方式1struct student s4;strcpy(s4.name,"牛二");s4.age=25;s4.score=67;printf("姓名:%s年龄:%d成绩%lf\n",s4.name,s4.age,s4.score);//赋值方式2struct student s5;printf("输入学生姓名\n");scanf("%s",s5.name);printf("输入学生年龄\n");scanf("%d",&s5.age);printf("输入学生成绩\n");scanf("%lf",&s5.score);printf("姓名:%s年龄:%d成绩%lf\n",s5.name,s5.age,s5.score);return 0;
}

直接初始化和赋值

直接初始化是将变量定义在结构体类型的后面

如果使用直接初始化,可以省略结构名不写

如果省略结构名,则只能使用已有的结构类型变量

格式:

struct 结构名

{

数据类型 成员1;

数据类型 成员2;

数据类型 成员3;

数据类型 成员4;

......

数据类型 成员n;

}

变量1={.成员1=,...,.成员n=},

变量2={.成员1=,...,.成员n=},

变量3={.成员1=,...,.成员n=}

...

练习:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct dog
{char name[128];int age;char color[128];
}d1={.name="小黑",.age=2,.color="白色"},d2={.name="小白",.age=2,.color="黑色"},d3,d4;
void out(struct dog d)
{printf("名字:%s年龄:%d毛色:%s\n",d.name,d.age,d.color);
}
int main(int argc, const char *argv[])
{out(d1);out(d2);//赋值方式1struct dog d3;strcpy(d3.name,"小黄");d3.age=25;strcpy(d3.color,"黄色");out(d3);//赋值方式2struct dog d4;printf("输入姓名\n");scanf("%s",d4.name);printf("输入年龄\n");scanf("%d",&d4.age);printf("输入毛色\n");scanf("%s",d4.color);out(d4);return 0;
}

结构体数组

数组:一次性定义多个类型相同的变量

结构体数组:一次性定义多个类型相同的结构体变量

结构体数组的初始化和赋值

间接初始化和赋值

#include <stdio.h>                                                                           
#include <string.h>
#include <stdlib.h>
struct student
{char name[128];int age;int id;
};
void out(struct student *s,int n)
{for(int i=0;i<n;i++){printf("名字:%s 年龄:%d 学号:%d\n",s[i].name,s[i].age,s[i].id);}
}
int main(int argc, const char *argv[])
{struct student s[3]={{"张三",18,1008},{"李四",18,1009}};    //按顺序初始化struct student s1[3]={[2]={.id=1009,.name="王五",.age=20}};   //不按数据初始化out(s,3);out(s1,3);return 0;
}

直接初始化和赋值

#include <stdio.h>                                                           
#include <string.h>
#include <stdlib.h>
struct student
{char name[128];int age;int id;
}
s[3]={{"张三",23,1010}}
;
void out(struct student *s,int n)
{   for(int i=0;i<n;i++){   printf("名字:%s 年龄:%d 学号:%d\n",s[i].name,s[i].age,s[i].id);}
}
void in(struct student *s,int n)
{for(int i=0;i<n;i++){printf("输入姓名\n");scanf("%s",s[i].name);printf("输入年龄\n");scanf("%d",&s[i].age);printf("输入学号\n");scanf("%d",&s[i].id);}}
int main(int argc, const char *argv[])
{   out(s,3);return 0;
}

结构体指针

结构体指针:存储结构体变量的地址

格式:

struct 结构名 *变量名;

结构指针访问内部变量通过"->"访问

练习:

在栈区中用结构体指针实现结构体元素的输入输出

在堆区中用结构体指针实现结构体元素的输入输出

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct student
{char name[128];int age;int id;
};
void out(struct student *s,int n)
{for(int i=0;i<n;i++){printf("名字:%s 年龄:%d 学号:%d\n",(s+i)->name,(s+i)->age,(s+i)->id);}
}
void in(struct student *s,int n)
{for(int i=0;i<n;i++){printf("输入姓名\n");scanf("%s",(s+i)->name);printf("输入年龄\n");scanf("%d",&(s+i)->age);printf("输入学号\n");scanf("%d",&(s+i)->id);}}
int main(int argc, const char *argv[])
{struct student s[3];struct student *p=s;in(p,3);out(p,3);                                                                              struct student *str=(struct student *)malloc(sizeof(struct student)*3);struct student *q=str;in(q,3);out(q,3);return 0;
}

typedef结合结构体

格式:

typedef 直接修饰结构体类型(常用)

typedef struct student

{

int id;

int age;

}stu;

stu s; ---> struct student s

typedef 间接修饰结构体类型

struct student

{

int id;

int age;

};

typedef struct student stu;

stu s; ---> struct student s

typedef 起多个名字

typedef struct student

{

int id;

int age;

}student,*ptr_student;

student s; ---> struct student s

ptr_student p=$s; ---> struct student *p

结构体的嵌套

格式:

typedef struct birthday

{

int year;

int month;

}bir;

typedef struct student

{

char name[128];

int age;

bir b; //嵌套一个结构体

}stu;

stu s = {18,"11",2003,12,12};

结构体的嵌套结构体数组

格式:

typedef struct car

{

double price;

char name[128];

}car;

typedef struct student

{

char name[128];

int age;

car b[3]; //嵌套一个结构体数组

}stu;

stu s = {18,"11",{1,"名字"},{2,"名字"},{3,"名字"}};

结构体字节对齐(字节计算 笔试

结构体各个成员的地址是连续的

结构体变量的地址是第一个成员的地址

64位操作系统,8字节对齐:

  1. 结构体的总字节大小是各个成员字节的总和,但是需要满足是最宽成员的倍数
  2. 结构体的首地址是最宽成员的倍数
  3. 结构体各个成员的首地址是该成员字节的整数倍,否则填充空字节

32位操作系统,4字节对齐:

  1. 结构体的总字节大小是各个成员字节的总和,但是需要满足是最宽成员的倍数
  2. 结构体的首地址是最宽成员的倍数
  3. 结构体各个成员的首地址是该成员字节(或该成员字节数大于4则是4)的整数倍,否则填充空字节

共用体

概念:不同或者相同的数据,共用一段内存空间

作用:实现一段内存,存放不同的数据

格式:

union 共用名

{

数据类型 成员1;

数据类型 成员2;

数据类型 成员3;

数据类型 成员4;

......

数据类型 成员n;

}; //结尾的";"不可省略

*分析:

union:是结构体的关键字

共用名:满足命名规范

{}:不能省略

数据类型:可以是基本数据类型,也可以是构造数据类型

成员:可以是任意个成员

共用体的声明可以在任意位置,但一般在头文件中

共用体在声明类型时不占用内存空间,当使用共用体类型定义变量时申请空间

共用体的内存空间是最宽成员的内存大小

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python NLTK 情感分析不正确

1、问题背景 一位 Reddit 用户使用 Python 的 NLTK 库来训练一个朴素贝叶斯分类器以研究其他句子的情感&#xff0c;但是无论输入什么句子&#xff0c;分类器总是预测为正面。 2、解决方案 经过仔细检查&#xff0c;发现原始代码中的问题在于 wordList 为空。因此&#xff0…

Cadence23学习笔记(十四)

ARC就是圆弧走线的意思&#xff1a; 仅打开网络的话可以只针对net进行修改走线的属性&#xff1a; 然后现在鼠标左键点那个走线&#xff0c;那个走线就会变为弧形&#xff1a; 添加差分对&#xff1a; 之后&#xff0c;分别点击两条线即可分配差分对&#xff1a; 选完差分对之后…

Redis:管道

1. 面试题 如何优化频繁命令往返造成的性能瓶颈&#xff1f; 问题由来 edis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。一个请求会遵循以下步骤&#xff1a; 1 客户端向服务端发送命令分四步(发送命令→命令排队→命令执行→返回结果)&#xff0c;并监听Socket…

前端框架 element-plus 发布 2.7.8

更新日志 功能 组件 [级联选择器 (cascader)] 添加持久化属性以提升性能 (#17526 by 0song)[日期选择器 (date-picker)] 类型添加月份参数 (#17342 by Panzer-Jack)[级联选择器 (cascader)] 添加标签效果属性 (#17443 by ntnyq)[加载 (loading)] 补充加载属性 (#17174 by zhixi…

vue-快速入门

Vue 前端体系、前后端分离 1、概述 1.1、简介 Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;可以高效地开发用户界面。…

SpringBoot的约车APP-计算机毕业设计源码96773

摘要 本文基于Spring Boot框架设计并实现了一款约车APP&#xff0c;旨在为用户提供便捷的出行服务。通过后端Spring Boot框架和前端交互界面的设计&#xff0c;实现了用户快速叫车、实时定位、路线规划等功能。系统结合了高效的后端处理和直观的用户体验&#xff0c;为用户提供…

分类常用的评价指标-二分类/多分类

二分类常用的性能度量指标 精确率、召回率、F1、TPR、FPR、AUC、PR曲线、ROC曲线、混淆矩阵 「精确率」查准率 PrecisionTP/(TPFP) 「召回率」查全率RecallTP/(TPFN) 「真正例率」即为正例被判断为正例的概率TPRTP/(TPFN) 「假正例率」即为反例被判断为正例的概率FPRFP/(TNFP)…

降Compose十八掌之『鱼跃于渊』| Gesture Handling

公众号「稀有猿诉」 原文链接 降Compose十八掌之『鱼跃于渊』| Gesture Handling UI是用户界面&#xff0c;一个最为基础的功能就是与用户进行交互&#xff0c;要具有可交互性。要想有可交互性就需要处理用户输入事件。手势是最为常见的一种用户输入&#xff0c;今天就来…

SAPUI5基础知识18 - 自定义CSS和主题色

1. 背景 在上一篇博客中&#xff0c;我们通过使用SAPUI5提供的CSS类实现元素间距的调整。在本篇博客中&#xff0c;让我们看一下如何实现自定义的CSS样式。 2. 背景知识 2.1 CSS基础语法 CSS&#xff0c;全称为级联样式表&#xff08;Cascading Style Sheets&#xff09;&a…

6.6 使用dashboard商城搜索导入模板

本节重点介绍 : 模板商城中搜索模板导入模板修改模板 大盘模板商城地址 免费的 地址 https://grafana.com/grafana/dashboards 搜索模板技巧 详情 导入dashboard 两种导入模式 url导入id导入json文件导入 导入 node_exporter模板 https://grafana.com/grafana/dashboa…

“葫芦娃”竟上了SCI论文!当童年碰上科研,你还会觉得科研枯燥吗?

本周投稿推荐 SCI • 能源电力类&#xff0c;1.5-2.0&#xff08;25天来稿即录&#xff09; • 1区计算机类&#xff0c;3.5-4.0&#xff08;1个月录用&#xff09; • CCF推荐&#xff0c;1区-Top&#xff08;3天初审&#xff09; EI • 各领域沾边均可&#xff08;2天录…

[CISCN2019 华东南赛区]Web11

进来先做信息收集&#xff0c;右上角显示当前ip&#xff0c;然后有api的调用地址和请求包的格式以及最重要的是最下面的smarty模版&#xff0c;一看到这个就得想到smarty模版注入 测试了一下两个api都无法访问 直接切到数据包看看能不能通过XFF来修改右上角ip 成功修改&#x…

Flink笔记整理(四)

Flink笔记整理&#xff08;四&#xff09; 文章目录 Flink笔记整理&#xff08;四&#xff09;六、Flink中的时间和窗口6.1 窗口&#xff08;Window&#xff09;窗口的概念窗口的分类窗口API概览窗口分配器窗口函数&#xff08;Window Functions&#xff09; 6.2 时间语义&…

Windows电脑如何启动RTSP服务实现本地摄像头数据共享

技术背景 提起Windows共享本地摄像头&#xff0c;好多人想到的是通过ffmepg或vlc串流到服务器&#xff0c;实际上&#xff0c;用轻量级RTSP服务更简单&#xff0c;本文就介绍下&#xff0c;如何用大牛直播SDK的Windows轻量级RTSP服务&#xff0c;采集摄像头&#xff0c;生成本…

React Router-v6.25.1

以下例子是根据vitereactts构建的&#xff0c;使用路由前先安装好这些环境&#xff01;&#xff01;&#xff01;&#xff01; 1、路由的简单使用 首先要创建一个浏览器路由器并配置我们的第一个路由。这将为我们的 Web 应用启用客户端路由。 该main.jsx文件是入口点。打开它…

什么是大型语言模型 (LLM)

本章探讨下&#xff0c;人工智能如何彻底改变我们理解和与语言互动的方式 大型语言模型 (LLM) 代表了人工智能的突破&#xff0c;它采用具有广泛参数的神经网络技术进行高级语言处理。 本文探讨了 LLM 的演变、架构、应用和挑战&#xff0c;重点关注其在自然语言处理 (NLP) 领…

Unity XR Interaction Toolkit设置或监听手柄按键事件(三)

提示&#xff1a;文章有错误的地方&#xff0c;还望诸位大神不吝指教&#xff01; 文章目录 前言一、XRI Default Input Actions1.导入官方案例2.设置控制器绑定&#xff0c;如手柄、主/辅助按钮、操纵杆等1.要设置控制器绑定&#xff0c;如左右手 手柄、主/辅助按钮、操纵杆等…

UART编程框架详解

1. UART介绍 UART&#xff1a;通用异步收发传输器&#xff08;Universal Asynchronous Receiver/Transmitter)&#xff0c;简称串口。 调试&#xff1a;移植u-boot、内核时&#xff0c;主要使用串口查看打印信息 外接各种模块 1.1 硬件知识_UART硬件介绍 UART的全称是Unive…

微信小程序教程001:小程序简介

文章目录 学习目标小程序简介1、小程序和普通网页开发的区别2、注册小程序账号3、获取小程序的AppID4、安装开发者工具4.1 了解开发者工具4.2 下载开发工具 5、设置开发者工具外观 学习目标 如何创建小程序项目小程序项目的基本组成结构小程序页面由几部分组成小程序常见的组件…

小模型狂飙!6家巨头争相发布小模型,Andrej Karpathy:大语言模型的尺寸竞争正在倒退...

过去一周&#xff0c;可谓是小模型战场最疯狂的一周&#xff0c;商业巨头改变赛道&#xff0c;向大模型say byebye~。 OpenAI、Apple、Mistral等“百花齐放”&#xff0c;纷纷带着自家性能优越的轻量化小模型入场。 小模型(SLM)&#xff0c;是相对于大语言模型&#xff08;LLM…