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

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;
}

用指针处理链表

链表的内涵

image-20211220210613895

链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构。

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语言允许用户自己建立由不同类型数据组成的组合型的数据结构&#xff0c;它称为结构体 结构体的成员可以是任何类型的变量&#xff0c;如整数&#xff0c;字符串&#xff0c;浮点数&#xff0c;其他结构体&#xff0c;指针等 struct Student //s…...

Video Speed Controller谷歌视频加速插件——16倍速

文章目录前言最简单的版本一、如果是简单的话 可以Microsoft Edge使用二、简单的版本 火狐的话使用Global Speed插件三、由于视频受限以上的方法行不通 还是谷歌好用前言 主要是网课刷的时候 太慢所以找到了刷视频的方法 由于前几个的权限受限制 所以还是选用了谷歌浏览器的 V…...

VSCode 的下载安装及基本使用

目录 一、VSCode 是什么&#xff1f; 二、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.磁盘读写常见的指标 &#xff08;1&#xff09;IOPS&#xff08;Input/Output Operations per Second&#xff09; 指每秒能处理的I/O个数&#xff0c;表示块存储处理读写&#xff08;输出/输入&#xff09;的能力&#xff0c;单位为次&#xff0c;有顺序IOPS和随机IOPS比如…...

SpringMVC基础

简介 Spring MVC 属于 SpringFrameWork 的后续产品&#xff0c;已经融合在 Spring Web Flow 里面&#xff1b;Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块&#xff1b;使用 Spring 可插入的 MVC 架构&#xff0c;从而在使用Spring进行WEB开发时&#xff0c;可以选择…...

低代码开发平台|制造管理-质检管理搭建指南

1、简介1.1、案例简介本文将介绍&#xff0c;如何搭建制造管理-质检管理。1.2、应用场景质检分别包括来料质检、过程质检、成品质检&#xff0c;来料质检在采购物料入库后会自动发起来料质检的流程&#xff0c;质检合格才可提交结束流程&#xff1b;过程检是在生产过程中的质检…...

推荐一个.Ner Core开发的配置中心开源项目

更多开源项目请查看&#xff1a;一个专注推荐.Net开源项目的榜单 当你把单体应用改造为微服务架构&#xff0c;相应的配置文件&#xff0c;也会被分割&#xff0c;被分散到各个节点。这个时候就会产生一个问题&#xff0c;配置信息是分散的、冗余的&#xff0c;变成不好维护管理…...

Vue3+vite4使用mockjs进行模拟开发遇到的坑

Vue3vite4使用mockjs进行模拟开发遇到的坑 最近没那么忙了&#xff0c;就想着自己写一个后台管理系统的小demo。刚好最近把Vue3的文档撸了一遍&#xff0c;正好可以顺便练习一下Vue3ts。 插件 1、mockjs是必不可少的。 2、vite-plugin-mock。由于现在创建Vue3项目默认都使用vit…...

一起Talk Android吧(第四百九十三回:动画知识总结)

文章目录知识回顾经验总结各位看官们大家好&#xff0c;上一回中咱们说的例子是"精减版动画",这一回中咱们说的例子是" 动画知识总结"。闲话休提&#xff0c;言归正转&#xff0c;让我们一起Talk Android吧&#xff01;知识回顾 看官们&#xff0c;我们在…...

腾讯云企业网盘正式入驻数字工具箱

腾讯技术公益继腾讯电子签等入驻后&#xff0c;上线近半年的腾讯技术公益数字工具箱再次迎来新成员——腾讯云企业网盘&#xff0c;现已正式接受公益机构申请公益权益。腾讯云企业网盘&#xff08;https://pan.tencent.com&#xff09;是由腾讯云推出的一款安全、高效、开放的企…...

2.13练习

1、设备树设备树描述硬件信息的一种树形结构&#xff0c;设备树文件在linux内核启动后被内核解析。描述一个硬件设备信息的节点我们叫做设备节点&#xff0c;一个设备节点内部包含当前硬件的多个不同属性&#xff0c;相同节点不同属性是以链式结构存储2、设备树的文件格式内核顶…...

【iOS】APP IM聊天框架的设计(基于第三方SDK)

【iOS】APP IM聊天框架的设计&#xff08;基于第三方SDK&#xff09; 前言 在开发社交聊天类型的APP的时候&#xff0c;IM是必不可少的功能&#xff0c;而且很多公司的IM服务都是接的第三方的&#xff0c;很少用自研的&#xff0c;国内的IM厂商也都很成熟&#xff0c;本文所有…...

centos安装FastDFS,集成到SpringBoot中

前言 本教程采用centos7 实测 安装fastdfs&#xff0c;每一步都存在截图&#xff0c;安装不成功你就我 最关键的是采用springboot 集成 fastdfs&#xff0c;上传保存文件信息 小序 FastDFS是一个开源的分布式文件系统&#xff0c;她对文件进行管理&#xff0c;功能包括&…...

看透react源码之感受react的进化

写在前面 网上有许多关于react源码解读的文章&#xff0c;其中有很多都只是单纯贴源码&#xff0c;罗列变量名。其实大家都知道这个英文怎么读&#xff0c;直译也大概知道意思&#xff0c;但是这个英文在react中起到什么作用&#xff0c;并没有说的很通俗明白。 对于刚刚接触…...

【最优化理论】线性规划

文章目录什么是线性规划&#xff08;Linear Programming&#xff0c;LP&#xff09;&#xff1f;线性规划的标准形式非标准形LP模型转化为标准形LP模型基本概念基本解&基矩阵&基变量&非基变量基本可行解&可行基矩阵&非退化的基本可行解&退化的基本可行…...

数据库测试的认知和分类

数据库测试的认知和分类 目录&#xff1a;导读 系统测试 集成测试 单元测试 功能测试 数据库性能 性能优化分4部分 安全测试 现在的软件系统&#xff0c;尤其是业务应用系统&#xff0c;后台都连接着一个数据库。数据库中存储了大量的数据&#xff0c;数据库的设计是否…...

MQ中间件概念一览

一、概述 1. 大多应用中&#xff0c;可通过消息服务中间件来提升系统异步通信、扩展解耦能力 2. 消息服务中两个重要概念&#xff1a; 消息代理&#xff08;message broker&#xff09;和目的地&#xff08;destination&#xff09; 当消息发送者发送消息以后&#xff0c;将由…...

爱尔兰公司注册要求及条件

简介&#xff1a; 爱尔兰是一个高度发达的资本主义国家&#xff0c;也是欧盟、经济合作与发展组织、世界贸易组织和联合国的成员国。并且也是世界经济发展速度快的国家之一&#xff0c;因经济发达赢得了“欧洲小虎”的美誉。总体来看&#xff0c;爱经济发展势头趋稳&#xff0c…...

Java中如何打印对象内存地址?

先看一个简单的程序&#xff0c;一般我们打印对象&#xff0c;大部分是下面的情况&#xff0c;可能会重写下toString()方法&#xff0c;这个另说 Frolan frolan new Frolan(); System.out.println(frolan);// 输出结果 com.test.admin.entity.Frolan2b80d80f这个结果其实是调…...

CF1707E Replace

题目描述 给定一个长为 nnn 的序列 a1,…,ana_1,\ldots,a_na1​,…,an​&#xff0c;其中对于任意的 iii 满足 1≤ai≤n1 \leq a_i \leq n1≤ai​≤n。 定义一个二元组函数如下&#xff1a; f((l,r))(min⁡{al,…,ar},max⁡{al,…,ar})(l≤r)f((l,r))(\min\{a_l,\ldots,a_r\}…...

【Hello Linux】Linux工具介绍 (make/makefile git)

作者&#xff1a;小萌新 专栏&#xff1a;Linux 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;介绍Linux的常用工具make/makefile git Linux项目自动化构建工具 – make/Makefile 背景 会不会写Makefile 从侧面说明了一个人是否具…...

享元模式flyweight

享元模式属于结构型模式。享元模式是池技术的重要实现方式&#xff0c;它可以减少重复对象的创建&#xff0c;使用缓存来共享对象&#xff0c;从而降低内存的使用。细粒度的对象其状态可以分为两种&#xff1a;内部状态和外部状态。应用场景系统存在大量相似或相同的对象。外部…...

Pulsar

一、简介Apache Pulsar是Apache软件基金会顶级项目&#xff0c;是下一代云原生分布式消息流平台&#xff0c;集消息、存储、轻量化函数式计算为一体&#xff0c;采用计算与存储分离架构设计&#xff0c;支持多租户、持久化存储、多机房跨区域数据复制&#xff0c;具有强一致性、…...

项目介绍 + 定长内存池设计及实现

你好&#xff0c;我是安然无虞。 文章目录项目介绍当前项目做的是什么?技术栈内存池是什么?池化技术内存池内存池主要解决的问题malloc定长内存池学习目的定长内存池设计项目介绍 当前项目做的是什么? 这个项目是实现一个高并发的内存池, 它的原型是 Google 的一个开源项…...

Linux--线程安全的单例模式--自旋锁--0211

1. 线程安全的单例模式 1.1 什么是单例模式 某些类, 只应该具有一个对象(实例), 就称之为单例. 1.1.1 懒汉方式实现单例模式 以上篇博文的线程池为例 Liunx--线程池的实现--0208 09_Gosolo&#xff01;的博客-CSDN博客 实现懒汉模式首先要先将构造函数私有化&#xff0c;…...

图文解说S参数(进阶篇)

S参数是RF工程师/SI工程师必须掌握的内容&#xff0c;业界已有多位大师写过关于S参数的文章&#xff0c;即便如此&#xff0c;在相关领域打滚多年的人&#xff0c; 可能还是会被一些问题困扰着。你懂S参数吗? 图文解说S参数&#xff08;基础篇&#xff09; 请继续往下看...台湾…...

Sentinel源码阅读

基础介绍 Sentinel 的使用可以分为两个部分: 核心库&#xff08;Java 客户端&#xff09;&#xff1a;不依赖任何框架/库&#xff0c;能够运行于 Java 8 及以上的版本的运行时环境&#xff0c;同时对 Dubbo / Spring Cloud 等框架也有较好的支持&#xff08;见 主流框架适配&…...

2023年浙江食品安全管理员考试真题题库及答案

百分百题库提供食品安全管理员考试试题、食品安全管理员考试预测题、食品安全管理员考试真题、食品安全管理员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 一、判断题 7.&#xff08;重点&#xff09;《餐饮服务食品安全…...

Webstorm 代码没有提示,uniapp 标签报错

问题 项目是用脚手架创建的&#xff1a; vue create -p dcloudio/uni-preset-vue my-project 打开之后&#xff0c;添加view标签警告报错的。代码也没有提示&#xff0c;按官方说法&#xff1a;CLI 工程默认带了 uni-app 语法提示和 5App 语法提示。 但是我这里就是有问题。…...

MySQL-Innodb引擎事务原理

文章目录1.事务介绍2 事务特性3. 事务的实现原理4 redo log 保证持久性5 undo log 保证原子性6 MVCC 概念6.1 隐藏字段6.2 版本链6.3 ReadView6.3.1readview 版本控制规则7 隔离性 实现7.2 隔离性- REPEATABLE READ 可重复读下8 一致性1.事务介绍 事务是一组操作的集合&#xf…...

网站建设 解决方案/最近三天的国内新闻

本文为大家分享了mysql 5.7.18 MSI安装教程&#xff0c;供大家参考&#xff0c;具体内容如下1.下载&#xff1a;官网地址可以看到note32位和64位下载是一样的2.双击下载的文件3.安装页面4选择安装类型(选择full后续检查需求有问题&#xff0c;可以直接选custom&#xff0c;注意…...

义务网站建设/今日中央新闻

本系列学习教程使用的是cocos2d-x-2.1.4&#xff08;最新版为3.0alpha0-pre&#xff09; &#xff0c;PC开发环境Windows7&#xff0c;C开发环境VS2010 UI在游戏中占有很重要的地位&#xff0c;但吸引玩家的除了这些看得到的界面和动画之外&#xff0c;游戏在后台中播放的背景音…...

wordpress 分类不显示图片/中国疫情今天最新消息

大学计算机信息技术教程习题集U大学计算机信息技术教程一级B实战习题集南通大学教育技术中心2008.6第一部分 理论部分第一套一、基础知识必做题[1]. 在计算机中为景物建模的方法有多种&#xff0c;它与景物的类型有密切关系&#xff0c;例如对树木、花草、烟火、毛发等&#xf…...

常平镇仿做网站/网站模板源码

引言&#xff1a; 在上一个专题中介绍了C#2.0 中引入泛型的原因以及有了泛型后所带来的好处&#xff0c;然而上一专题相当于是介绍了泛型的一些基本知识的&#xff0c;对于泛型的性能为什么会比非泛型的性能高却没有给出理由&#xff0c;所以在这个专题就中将会介绍原因和一些关…...

开发者模式关掉好还是开着好/网站优化排名易下拉排名

(1) linux后台&#xff1a;yarn application -list 找到相应的命令 粘贴job &#xff08;2&#xff09;去FI manager 的 yarn上粘贴job 看详细过程 &#xff08;3&#xff09;确定后 在linux后台 yarn application -kil xxxx 都是因为华为的集群对hivesql脚本的给出了部分信息…...

软件开发外包公司赚钱不/上海小红书seo

我在我的项目中使用Spring Data JPA和Hibernate JPA提供程序.在我的服务中,我有一个方法,它将实体保存在数据库中,而不是使用返回的对象,我尝试获取有关此实体的更多详细信息.因此,不会获取详细信息.在日志中,我只看到insert语句,没有select的详细信息.这是我的代码&#xff1a…...