C语言学习笔记(八): 自定义数据类型
结构体变量
什么是结构体
C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体
结构体的成员可以是任何类型的变量,如整数,字符串,浮点数,其他结构体,指针等
struct Student //struct表示建立结构体,Student为结构体类型名
{ int num; //学号为整型 char name[20]; //姓名为字符串 char sex; //性别为字符型 int age; //年龄为整型float score; //成绩为实型 char addr[30]; //地址为字符串
}; //注意最后有一个分号
/*花括号里的子项称为结构体的成员每个成员都是结构体的一个域
*/
与此同时,结构体的成员还可以是其他结构体里的成员
struct Date //声明一个结构体类型 struct Date
{ int month; //月int day; //日int year; //年
}; struct Student //声明一个结构体类型 struct Student
{ int num;
char name[20];
char sex;
int age;
struct Date birthday; //成员birthday属于struct Date类型
char addr[30];
};
定义结构体类型变量
有两种定义结构体变量的方式,如下代码所示
/*先定义结构体类型,再定义结构体变量*/
struct Student
{ int num; //学号为整型 char name[20]; //姓名为字符串 char sex; //性别为字符型 int age; //年龄为整型float score; //成绩为实型 char addr[30]; //地址为字符串
}; //注意最后有一个分号
struct Student student1, student2; //student1和student2是结构体变量
/*同时定义结构体类型和结构体变量*/
struct Student
{ int num; char name[20];char sex; int age;float score;char addr[30];
}student1, student2;
结构体的初始化
include <stdio.h>
int main()
{struct Student //声明结构体类型struct Student{long int num; //以下4行为结构体的成员char name[20];char sex;char addr[20];}a = { 10101,"Li Lin",'M',"123 Beijing Road" }; //定义结构体变量a并初始化struct Student* p = &a;printf("NO.:%ld\nname:%s\nsex:%c\naddress:%s\n",p->num, a.name, a.sex, a.addr);return 0;
}
结构体的引用
/*对结构体的成员赋值*/
student1.num=10010; //结构体变量student1中的成员num
student1.birthday.month=6; //结构体变量student1中的成员birthday中的成员month
/*结构体成员可以像普通变量进行各种运算*/
student2.score=student1.score; //赋值运算
sum=student1.score+student2.score; //加法运算
student1.age++; //自加运算
student1=student2; //假设student1和student2已定义为同类型的结构体变量
/*scanf输入给结构体变量赋值,只能一个一个来*/
scanf(″%d″,&student1.num); //输入student1.num的值
printf(″%o″,&student1); //输出结构体变量student1的起始地址scanf(″%d,%s,%c,%d,%f,%s\n″,&student1); //这种是错误的
结构体数组
结构体数组的定义
/*同时定义结构体类型和结构体数组*/
struct Person
{ char name[20];int count;
} leader[3]; //定义结构体数组
/*先定义结构体类型,再定义结构体数组*/
struct Person
{ char name[20];int count;
}
struct Person leader[3]; //leader是结构体数组名
结构体数组的初始化与引用
include <stdio.h>
//先定义后初始化
struct Person
{char name[20];int year;
};int main()
{ struct Person leader[3] = { {"Li",11},{"Zhang",12},{"Sun",13} };printf("第三位同学的名字叫%s,年龄是%d岁", leader[2].name,leader[2].year); //输出了13
}
include <stdio.h>
//同时定义与初始化
struct Person
{char name[20];int year;
}leader[3] = { {"Li",11},{"Zhang",12},{"Sun",13} };int main()
{printf("第三位同学的名字叫%s,年龄是%d岁", leader[2].name, leader[2].year); //输出了13
}
结构体指针
什么是结构体指针
所谓结构体指针就是指向结构体变量的指针,一个结构体变量的起始地址就是这个结构体变量的指针。如果把一个结构体变量的起始地址存放在一个指针变量中,那么,这个指针变量就指向该结构体变量。
指向结构体变量的指针
include <stdio.h>
include <string.h>
int main()
{struct Student //声明结构体类型struct Student{long num;char name[20];char sex;float score;};struct Student stu_1; //定义struct Student类型的变量stu_1 struct Student* p; //定义指向struct Student 类型数据的指针变量p p = &stu_1; //p指向stu_1 stu_1.num = 10101; //对结构体变量的成员赋值 strcpy_s(stu_1.name, "Li Lin"); //用字符串复制函数给stu_1.name赋值stu_1.sex = 'M';stu_1.score = 89.5;printf("\nNo.:%ld\nname:%s\nsex:%c\nscore:%5.1f\n", (*p).num, p->name, (*p).sex, (*p).score); //通过结构体指针变量来引用结构体变量:(*p).num或p->numreturn 0;
}
指向结构体数组的指针
include <stdio.h>
struct Student //声明结构体类型struct Student
{int num;char name[20];char sex;int age;
};
struct Student stu[3] = { {10101,"Li Lin",'M',18},{10102,"Zhang Fang",'M',19},{10104,"Wang Min",'F',20} };//定义结构体数组并初始化int main()
{struct Student* p = stu; //定义指向struct Student结构体变量的指针变量int length = sizeof(stu) / sizeof(Student); // 计算结构体数组的长度for (int i = 0; i < length; i++){printf("num: %d\n", (*p).num);printf("name: %s\n", (*p).name);printf("sex: %c\n", (*p).sex);printf("age: %d\n", (*p).age);p++;}return 0;
}
用指针处理链表
链表的内涵

链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构。
head是头指针变量,它里面放了个地址,指向下一个元素。
每个元素又称为结点,它包含两个部分(实际数据、下个结点的地址)。
当某元素不指向其他元素时,这该元素称为表尾,地址放着NULL
建立静态链表
include <stdio.h>
struct Student //声明结构体类型struct Student
{ int num;float score;struct Student*next;
};
int main()
{ struct Student a,b,c,*head,*p; //定义3个结构体变量a,b,c作为链表的结点a.num=10101; a.score=89.5; //对结点a的num和score成员赋值b.num=10103; b.score=90; //对结点b的num和score成员赋值c.num=10107; c.score=85; //对结点c的num和score成员赋值head=&a; //头指针指向结点aa.next=&b; //a.next指向结点bb.next=&c; //b.next指向结点cc.next=NULL; //c结点的next成员不存放其他结点地址p=head; //使头指针p指向头结点ado{ printf("%ld %5.1f\n",p->num,p->score); //输出p指向的结点的数据p=p->next; //使p指向下一结点,即指向结点b}while(p!=NULL); //输出完c结点后p的值为NULL,循环终止return 0;
}
共用体类型
共用体类型的内涵
使几个不同类型的变量共享同一段内存的结构,称为 “共用体”类型的结构。
结构体变量所占内存长度是各成员占的内存长度之和。每个成员分别占有其自己的内存单元。共用体变量可以作结构体的成员,结构体变量也可以作共用体的成员
而共用体变量所占的内存长度等于最长的成员的长度。
共用体变量若其中某个成员的值被改变,那么其他成员的值也会被改变
共用体类型的定义与引用
include <stdio.h>
struct Student //声明结构体类型struct Student
{int num;char name[20];char sex;int age;
};union Data
{int i;//表示不同类型的变量i,ch,f可以存放到同一段存储单元中char ch;
}a; //在声明类型同时定义变量int main()
{printf("%d\n", sizeof(Data)); //输出共用体类型的大小:4union Data a; //用共用体类型定义变量a.i = 99; //对共同体变量初始化,只能一个一个来,不能a={1,'A',1.1}这样一次性赋完//a.ch = 'd';printf("%d,%c", a.i, a.ch); //输出99,c (字符c的ascii码为99) return 0;
}
共用体类型数据的特点
同一个内存段可以用来存放几种不同类型的成员,但在每一瞬时只能存放其中一个成员,而不是同时存放几个。
共用体变量的地址和它的各成员的地址都是同一地址。
允许用共用体变量(同类型)作为函数参数
枚举类型
枚举类型是一种特殊的整型类型,允许程序员为一组整数赋予可读的名称。在C语言中,枚举类型的定义使用关键字enum,并且枚举的每一项都有一个名字和一个对应的整数值
include <stdio.h>
int main()
{enum Color { red, yellow, blue, white, black }; //enum 类型名:定义枚举类型enum Color i, j,k; //定义枚举变量i,ji = red; j = blue,k = yellow; //给枚举变量赋值,只能是上面花括号里的内容printf("%d,%d,%d", i,j,k); //输出的是整数,输出"0,2,1"
}
include <stdio.h>
int main()
{enum color { red, yellow = 2, blue }; printf("%d", red); //输出0printf("%d", yellow); //输出2printf("%d", blue); //输出3
}
typedef声明新类型名
定义新的类型名
- 先按定义变量的方法
int i,将变量名换成类型名int count - 在前面加typedef,如
typedef int count - 这样就可以定义整型变量
count i = 1
定义数组变量
int a[100],int Num[100]typedef int Num[100]Num a相当于定义了int a[100]
其他类型
/*声明新的字符指针类型*/
typedef char *Sring;
String p; //相当于char *p
/*声明新的类型名表示指向函数的指针类型*/
typedef int (*function)() //声明function为指向函数的指针类型,指向的函数为整型
function p1 //p1为function类型的指针变量
typedef struct
{ int month;int day;int year;
}Date; //声明了一个新类型名Date,代表结构体类型
Date birthday; //定义结构体类型变量birthday,不要写成struct Date birthday;
Date* p; //定义结构体指针变量p,指向此结构体类型数据
相关文章:
C语言学习笔记(八): 自定义数据类型
结构体变量 什么是结构体 C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体 结构体的成员可以是任何类型的变量,如整数,字符串,浮点数,其他结构体,指针等 struct Student //s…...
Video Speed Controller谷歌视频加速插件——16倍速
文章目录前言最简单的版本一、如果是简单的话 可以Microsoft Edge使用二、简单的版本 火狐的话使用Global Speed插件三、由于视频受限以上的方法行不通 还是谷歌好用前言 主要是网课刷的时候 太慢所以找到了刷视频的方法 由于前几个的权限受限制 所以还是选用了谷歌浏览器的 V…...
VSCode 的下载安装及基本使用
目录 一、VSCode 是什么? 二、VSCode 的下载和安装 2.1 - 下载 2.2 - 安装 2.3 - 安装汉化插件 三、MinGW-w64 的下载安装及配置 3.1 - 介绍 3.2 - 下载 3.3 - 解压安装 3.4 - 环境变量配置 3.5 - 验证配置是否成功 3.6 - 安装 C/C 插件 四、在 VSCode …...
【操作系统】磁盘IO常见性能指标和分析工具实战
1.磁盘读写常见的指标 (1)IOPS(Input/Output Operations per Second) 指每秒能处理的I/O个数,表示块存储处理读写(输出/输入)的能力,单位为次,有顺序IOPS和随机IOPS比如…...
SpringMVC基础
简介 Spring MVC 属于 SpringFrameWork 的后续产品,已经融合在 Spring Web Flow 里面;Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块;使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择…...
低代码开发平台|制造管理-质检管理搭建指南
1、简介1.1、案例简介本文将介绍,如何搭建制造管理-质检管理。1.2、应用场景质检分别包括来料质检、过程质检、成品质检,来料质检在采购物料入库后会自动发起来料质检的流程,质检合格才可提交结束流程;过程检是在生产过程中的质检…...
推荐一个.Ner Core开发的配置中心开源项目
更多开源项目请查看:一个专注推荐.Net开源项目的榜单 当你把单体应用改造为微服务架构,相应的配置文件,也会被分割,被分散到各个节点。这个时候就会产生一个问题,配置信息是分散的、冗余的,变成不好维护管理…...
Vue3+vite4使用mockjs进行模拟开发遇到的坑
Vue3vite4使用mockjs进行模拟开发遇到的坑 最近没那么忙了,就想着自己写一个后台管理系统的小demo。刚好最近把Vue3的文档撸了一遍,正好可以顺便练习一下Vue3ts。 插件 1、mockjs是必不可少的。 2、vite-plugin-mock。由于现在创建Vue3项目默认都使用vit…...
一起Talk Android吧(第四百九十三回:动画知识总结)
文章目录知识回顾经验总结各位看官们大家好,上一回中咱们说的例子是"精减版动画",这一回中咱们说的例子是" 动画知识总结"。闲话休提,言归正转,让我们一起Talk Android吧!知识回顾 看官们,我们在…...
腾讯云企业网盘正式入驻数字工具箱
腾讯技术公益继腾讯电子签等入驻后,上线近半年的腾讯技术公益数字工具箱再次迎来新成员——腾讯云企业网盘,现已正式接受公益机构申请公益权益。腾讯云企业网盘(https://pan.tencent.com)是由腾讯云推出的一款安全、高效、开放的企…...
2.13练习
1、设备树设备树描述硬件信息的一种树形结构,设备树文件在linux内核启动后被内核解析。描述一个硬件设备信息的节点我们叫做设备节点,一个设备节点内部包含当前硬件的多个不同属性,相同节点不同属性是以链式结构存储2、设备树的文件格式内核顶…...
【iOS】APP IM聊天框架的设计(基于第三方SDK)
【iOS】APP IM聊天框架的设计(基于第三方SDK) 前言 在开发社交聊天类型的APP的时候,IM是必不可少的功能,而且很多公司的IM服务都是接的第三方的,很少用自研的,国内的IM厂商也都很成熟,本文所有…...
centos安装FastDFS,集成到SpringBoot中
前言 本教程采用centos7 实测 安装fastdfs,每一步都存在截图,安装不成功你就我 最关键的是采用springboot 集成 fastdfs,上传保存文件信息 小序 FastDFS是一个开源的分布式文件系统,她对文件进行管理,功能包括&…...
看透react源码之感受react的进化
写在前面 网上有许多关于react源码解读的文章,其中有很多都只是单纯贴源码,罗列变量名。其实大家都知道这个英文怎么读,直译也大概知道意思,但是这个英文在react中起到什么作用,并没有说的很通俗明白。 对于刚刚接触…...
【最优化理论】线性规划
文章目录什么是线性规划(Linear Programming,LP)?线性规划的标准形式非标准形LP模型转化为标准形LP模型基本概念基本解&基矩阵&基变量&非基变量基本可行解&可行基矩阵&非退化的基本可行解&退化的基本可行…...
数据库测试的认知和分类
数据库测试的认知和分类 目录:导读 系统测试 集成测试 单元测试 功能测试 数据库性能 性能优化分4部分 安全测试 现在的软件系统,尤其是业务应用系统,后台都连接着一个数据库。数据库中存储了大量的数据,数据库的设计是否…...
MQ中间件概念一览
一、概述 1. 大多应用中,可通过消息服务中间件来提升系统异步通信、扩展解耦能力 2. 消息服务中两个重要概念: 消息代理(message broker)和目的地(destination) 当消息发送者发送消息以后,将由…...
爱尔兰公司注册要求及条件
简介: 爱尔兰是一个高度发达的资本主义国家,也是欧盟、经济合作与发展组织、世界贸易组织和联合国的成员国。并且也是世界经济发展速度快的国家之一,因经济发达赢得了“欧洲小虎”的美誉。总体来看,爱经济发展势头趋稳,…...
Java中如何打印对象内存地址?
先看一个简单的程序,一般我们打印对象,大部分是下面的情况,可能会重写下toString()方法,这个另说 Frolan frolan new Frolan(); System.out.println(frolan);// 输出结果 com.test.admin.entity.Frolan2b80d80f这个结果其实是调…...
CF1707E Replace
题目描述 给定一个长为 nnn 的序列 a1,…,ana_1,\ldots,a_na1,…,an,其中对于任意的 iii 满足 1≤ai≤n1 \leq a_i \leq n1≤ai≤n。 定义一个二元组函数如下: f((l,r))(min{al,…,ar},max{al,…,ar})(l≤r)f((l,r))(\min\{a_l,\ldots,a_r\}…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
