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\}…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...

大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...

MySQL的pymysql操作
本章是MySQL的最后一章,MySQL到此完结,下一站Hadoop!!! 这章很简单,完整代码在最后,详细讲解之前python课程里面也有,感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...
上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式
简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...
鸿蒙(HarmonyOS5)实现跳一跳小游戏
下面我将介绍如何使用鸿蒙的ArkUI框架,实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...