C语言应用--数据类型定制一定义和引用
目前,定制正在变的越来越普遍,定制服务、定制衣服、甚至使用的键盘都是定制了。在C语言中虽然也包括了整型、字符型和浮点型等基本类型,也有基本的组合数据类型数组。但是这些类型都是针对某一种特定类型时应用没有问题,但是类型本身严格限定了数据的存储特征、取值范围、能够进行的操作等方面。但是在面对复杂多变的世界时,有些数据只用基本数据表示,使用将边的异常复杂;甚至有的时候只是借助基本类型都无法表示有些数据,因此数据的多样性就非常有必要了。多样的主要途径就是数据类型定制,C语言中数据定制的基础包括:指针、结构体、位段、联合体、枚举和关键字typedef,通过将这些东东进行简单的组合实现数据的类型定义。
一、结构体概念和干年:
1、主要针对需要较多种类的数据才能表示的数据,采用结构体表示会非常方便,例如需要表示在校生的学号、姓名、年龄、性别、成绩、其他等信息时数据类型规划如下:
学号 long
姓名 char[]
年龄 int
性别 boolj
成绩 float
很明显看出,无论是采用那种基本的数据类型都无法完整的表示学生的信息。采用自定义数据类型就成了唯一的选择,采用结构体数据类型才能把这些数据有效的组织在一起。
2、结构体的关键字:struct,常见的教材中的声明方式为结构体关键字struct,结构体的标签stu,结构体的成员声明long sNo; char sName[30]; int sAge; bool sSex; float sScore;等,可以包括其他的自定义类型的数据,所有的成员放置到一对大括号{}中,括号后面必须有“;”表明结构体声明的结束,在此直接接一个结构体的变量名,这是第一种结构体变量声明的方法:
struct stu{
long sNo;
char sName[];
int sAge;
bool sSex;
float sScore;
} stu1;
初始化的方法为:
stu1.sNo = ;
//stu1.sName = "zhangsan";
strcpy(stu1.sName, "zhangsan");
stu1.sAge = ;
stu1.sSex = true;
stu1.sScore = 78.5;
输出方法很简单:
printf("%s's info: sNo--%d\t sAge--%d\t sSex--%d\t sScore--%f\n", stu1.sName, stu1.sNo, stu1.sAge, stu1.sSex, stu1.sScore);
应该没有任何问题,但是存在一个问题就是,在定义结构体的同时进行结构体变量的定义,另外的结构体变量声明方法,若想再次定义,必须使用struct stu stu2之类的方式定义
struct stu stu2;
stu2.sNo = ;
strcpy(stu2.sName, "lisi");
stu2.sAge = ;
stu2.sSex = true;
stu2.sScore = 80.8;
printf("%s's info: sNo--%d\t sAge--%d\t sSex--%d\t sScore--%f\n", stu2.sName, stu2.sNo, stu2.sAge, stu2.sSex, stu2.sScore);
整个的结果是:
zhangsan's info: sNo--1 sAge--20 sSex--1 sScore--78.500000
lisi's info: sNo--2 sAge--21 sSex--1 sScore--80.800003
说明:1、结构体类型声明必须有struct关键字,后又数据类型名
2、定义体现了用户使用的自主性,可以有不同的数据组合
3、结构体所有成员,包含类型和名称,必须包含在大括号中,成员可以为基本类型和自定义类型(结构体、枚举、联合体、指针、数组等),甚至可以为结构体自身,结构体定义可以嵌套
4、结构体成员内部之间不允许有重名,但是可以和其他的结构体成员名称一样,结构体成员在结构体的命名空间中
5、结构体的声明只能告诉编译器结构体的特征,以及使用时的数据特征,必须等结构体变量完成初始化后,才有内存分配
6、结构体定义一般作为全剧变量,放置到所有函数的外部,或者放置到实现文件的外部,放置到头文件中
7、结构体一旦定义之后,可以和普通类型一样使用,可以定义结构体数组,结构体变量,结构体指针,甚至,可以让函数传递和返回结构体变量
8、结构体在分配内存时,存在着内存对齐的情况,最好不要人工计算结构体的内存大小,直接使用sizeof(struct stu)可以获取我们定义的结构体的大小
其实我们也可以先定义结构体,在使用struct stu stu2这样的方法来定义结构体变量。
在定义结构体的同时,声明结构体的变量时,可以定义匿名结构体,但是,必须在声明的同时,声明结构体的变量。
struct {
long sNo;
char sName[];
int sAge;
bool sSex;
float sScore;
} stu3;
stu3.sNo = ;
strcpy(stu3.sName, "wangwu");
stu3.sAge = ;
stu3.sSex = true;
stu3.sScore = 83.10;
printf("%s's info: sNo--%d\t sAge--%d\t sSex--%d\t sScore--%f\n", stu3.sName, stu3.sNo, stu3.sAge, stu3.sSex, stu3.sScore);
zhangsan's info: sNo--1 sAge--20 sSex--1 sScore--78.500000
lisi's info: sNo--2 sAge--21 sSex--1 sScore--80.800003
wangwu's info: sNo--3 sAge--23 sSex--1 sScore--83.099998
由此可见,实际上,有名和无名结构体使用时一样的,不一样的就是再次定义时,特别有结构体嵌套时,更加明显。
typedef struct _stu{
long sNo;
char sName[];
int sAge;
bool sSex;
float sScore;
} Student;
Student stu4;
stu4.sNo = ;
strcpy(stu4.sName, "zhaoliu");
stu4.sAge = ;
stu4.sSex = true;
stu4.sScore = 90.16;
printf("%s's info: sNo--%d\t sAge--%d\t sSex--%d\t sScore--%f\n", stu4.sName, stu4.sNo, stu4.sAge, stu4.sSex, stu4.sScore);
执行结果:
zhangsan's info: sNo--1 sAge--20 sSex--1 sScore--78.500000
lisi's info: sNo--2 sAge--21 sSex--1 sScore--80.800003
wangwu's info: sNo--3 sAge--23 sSex--1 sScore--83.099998
zhaoliu's info: sNo--4 sAge--24 sSex--1 sScore--90.160004
这种定义使用时更加的连贯和流畅。
二、结构体的引用和成员的引用
结构体的应用和普通变量的引用完全一样,但是对结构体变量的赋值,实际上是对结构体变量的成员变量赋值操作的过程,注意方式方法。
结构体变量成员的引用,需要使用成员访问符号“.”,方法就是stu4.sName访问结构头体变量stu4中的成员变量sName的值,一切so easy!
但是一旦面对结构体指针变量时,就有两种方法(*ptrStu4).sName访问结构体指针变量ptrStu4中的成员变量sName的值,也可以使用ptrStu4->sName这样的方法,特别是后者,用的很多,但是不做说明,非常容易搞糊涂的。好了,到此为止吧。
C语言应用--数据类型定制一定义和引用的更多相关文章
- C语言应用--数据类型定制一结构体数组
结构体定义成功后,其实和c语言内部的类型区别也不大了,自然可以用来定义结构体类型的数组了.我们根据结构体定义的方式不同,分别用多种方式定义结构体数组:
- C语言指针与数组的定义与声明易错分析
部分摘自<C语言深度解剖> 1.定义为数组,声明为指针 在文件1中定义: char a[100]; 在文件2中声明: extern char *a; //这样是错误的 这里的extern告 ...
- 谈谈C语言的数据类型
本文摘要: 本文主要讲述C语言中的数据类型,从基本的数据类型到派生的数据类型,从int ,char ,float double ....到指针,数组,函数,指向指针的指针,指向数组的指针,指向函数的指 ...
- C语言的数据类型
复习之余,做点笔记<C语言之数据类型> 一.整数数据类型 (1)整数数据类型 整数类型 char 字符型变量 1字节(8Bit) short 短整型 2字节(16Bit) i ...
- c语言基础:数据类型 分类: iOS学习 c语言基础 2015-06-10 21:43 9人阅读 评论(0) 收藏
C语言基本数据类型大体上分为: 整型 和 浮点型 字节: 计算机中最小的储存单位 1 Byte = 8 bit 整型: int 4 ...
- 「C语言」数据类型及混合运算与类型转换
深入学习C语言时,有必要先了解一下数据类型的概念,以及它们之间的混合运算与类型转换. 本篇文章便是根据<C语言程序设计教程>和在线翻阅资料后整理而出.(练习题将逐步更新) 目录: ...
- C语言中数据类型和变量
C语言中的数据类型 数据类型的本质,固定大小内存块的别名. 数组名代表数组首元素的地址. 数组首元素的地址,&代表整个数组的地址. 数组数据类型,怎么定义数据数组类型,定义数组类型指针,数组类 ...
- C语言变量声明问题——变量定义一定要放在所有执行语句/语句块的最前面吗?
报错信息:error C2065: 'salary' : undeclared identifier #include <stdio.h> void main(){ printf(&quo ...
- Go语言基本数据类型(四)
Go语言基本数据类型主要包含:bool,number,string 布尔类型 go中的布尔类型,只能是 true 和 false,例如:var b bool = true 数字类型 整型 类型 描述 ...
随机推荐
- SS L服务
WebHttpBinding _binding = new WebHttpBinding(); WebServiceHost ws = new WebServiceHost(typeof(Servic ...
- 同步IO,异步IO,阻塞,非阻塞的定义与区别
异步I/O 是指用户程序发起IO请求后,不等待数据,同时操作系统内核负责I/O操作把数据从内核拷贝到用户程序的缓冲区后通知应用程序.数据拷贝是由操作系统内核完成,用户程序从一开始就没有等待数据,发起请 ...
- Java 之 缓冲流
一.缓冲流概述 缓冲流,也叫高效流,是对四个 FileXXX 流的增强,所有也有四个流,按照类型分类: 字节缓冲流:BufferedInputStream,BufferedOutputStream 字 ...
- Pycharm和Android工具之github使用
请查看以下链接https://blog.csdn.net/m0_37306360/article/details/79322947 基本操作步骤 打开setting->version contr ...
- awk 条件及循环语句和字符串函数
条件语句 if(条件表达式) 动作1 else if(条件表达式) 动作2 else 动作3 循环语句: while循环: while(条件表达式) 动作 do while循环: do 动作 whil ...
- 深入浅出Git(偏向理论)
目录 一.理论概述 1. 什么是Git 版本控制系统分类 2. GitLab和GitHub是什么 3.Git功能 二.结合具体命令了解其工作 1.环境 2.部署 Git仓库的使用 简单命令解释 Git ...
- base64码通过http传输 +号变 空格 以及 图片编码后字符串较长导致POST提交失败 问题解决
场景:图片上传OSS存储,接口拿字符串去接前端传的base64码,服务器打印入参传的值,发现和前端打印的值有所区别,服务器中打印的值所有+号全部变成空格. 解决办法: Java中使用:url = ur ...
- thefuck安装和使用(ubuntu)
系统环境(已测试可用): ubuntu 18.04 lts (server或desktop),ubuntu 19.04(server或desktop) sudo apt update sudo apt ...
- 再见 Docker,是时候拥抱下一代容器工具了
本文首发于:微信公众号「运维之美」,公众号 ID:Hi-Linux. 「运维之美」是一个有情怀.有态度,专注于 Linux 运维相关技术文章分享的公众号.公众号致力于为广大运维工作者分享各类技术文章和 ...
- [dev][ipsec][distributed] strongswan如何做热迁移/高可用/High Availability
问题描述: 原生的基于kernel 的 strongswan 如何做高可用,HA,High Availability 问题分析: 基于我们已知的,ipsec,strongswan的知识.问题分解如下: ...