1,结构体

在前面我们知道变量和数组都可以用来存储数据,变量用来存储单个数据,数组可以用来存储一组同类型的数据,但你有没有发现——它们都只适合单一属性的数据。那现实生活中,很多对象都是具有多属性的。例如一个人,都具有姓名、年龄、身高、体重等各种属性。那该如何是好呢?

别急,C语言中的结构体属于复合类型,它是其他数据类型构造出的一个新数据类型。结构体可以拥有众多的成员,而且各成员的数据类型可以各不相同。因此,它是非常适合拥有多属性的对象进行存储。

Ⅰ,结构体类型的定义

定义格式为:

struct 结构体类型名{
数据类型 成员名;
数据类型 成员名;
...
}; //特别注意此处的分号不要遗忘

下面试着定义关于人的结构体类型,例如:

struct Person{
char name[20]; //姓名
int age; //年龄
float height; //身高
float weight; //体重
};

特别注意,上面定义的是一个结构体类型,它是不能用于存储数据的。就好像int 是一个数据类型,它是不能存储数据一样。如果要存储数据需要再定义出该类型的变量,如:

int a;

下面就说一下如何定义结构体类型的变量。

Ⅱ,结构体变量的定义

1,先定义结构体类型,再定义结构体变量,例如:

struct Person p1;	//注意:这条语句是定义了struct Person 类型的变量p1。也就是说,结构体类型不光是类型名字本身,前面还需加上“struct”关键字。

2,在定义结构体类型的同时定义结构体变量,例如:

struct Person{
char name[20]; //姓名
int age; //年龄
float height; //身高
float weight; //体重
} p2;

3,定义无名结构体类型变量,例如:

struct {
char name[20]; //姓名
int age; //年龄
float height; //身高
float weight; //体重
} p3;

Ⅲ,结构体变量的初始化与赋值

再定义结构体变量时,可以对其进行初始化。结构体变量的初始化方式与数组类似,使用大括号将初始值列表括起来。不过,列表中初始值的类型和顺序要与结构体成员的类型和顺序匹配。例如:

struct Person p1 = {"Tom",20,1.70f,60.1f};

Ⅳ,结构体成员的访问

C语言中,使用成员访问运算符(“.”)来访问结构体变量的各成员,我们常说的点运算说的就是它了:

结构体变量名.成员名

Ⅴ,结构体的大小

基本数据类型都有相对固定的大小,而结构体是符合数据类型,它的成员的类型、数量都是不固定的,但我们可以通过sizeof运算符来获取结构体的大小,例如:

printf("Size of the struct Person: %u bytes.\n",sizeof(struct Person));

Ⅵ,结构体的嵌套

C语言中可以将一个结构体作为另外一个结构体的成员,即允许结构体的嵌套使用,如下例子:

//定义一个日期的结构体类型Date
struct Date{
short year;
short month;
short day;
}; //然后再Person的结构体中再添加一个Date结构体类型的成员birthday,用来表示人的生日
struct {
char name[20];
int age;
float height;
float weight;
struct Date birthday; //生日
} ; //初始化如下:
struct Person ls={"lisi",20,1.52,45.5,{1999,8,28}}; //访问birthday中的成员如下方式
ls.birthday.year;
ls.birthday.month;

2,结构体的运用

上面介绍了结构体类型与结构体变量之后,下面我们就要学着运用它了。不要让结构体孤零零的存在,要让它发挥应用的作用,应该让它与指针、数组、函数等结合起来,只有这样我们的代码才会灵活、高效、优美。

至于江湖中结构体与指针、结构体与数组、结构体与函数以及结构体与字符串的打打杀杀,亦或是人情世故,就留给我们自己到江湖上去体会吧!

如何系统学习C 语言(中)之 结构体篇的更多相关文章

  1. C语言中的结构体,结构体数组

    C语言中的结构体是一个小难点,下面我们详细来讲一下:至于什么是结构体,结构体为什么会产生,我就不说了,原因很简单,但是要注意到是结构体也是连续存储的,但要注意的是结构体里面类型各异,所以必然会产生内存 ...

  2. C语言中处理结构体的原理

    汇编中有几种寻址方式,分别是直接寻址:(ds:[idata]).寄存器间接寻址(ds:[bx]).寄存器相对寻址(ds:[bx + idata].ds:[bx + si])基址变址寻址(ds:[bx ...

  3. Verilog缺少一个复合数据类型,如C语言中的结构体

    https://mp.weixin.qq.com/s/_9UsgUQv-MfLe8nS938cfQ Verilog中的数据类型(Data Type)是分散的,缺少一个复合数据类型:把多个wire, r ...

  4. C语言中的结构体和C++中的结构体以及C++中类的区别

    c++中结构体可以定义一个函数 C中的结构体和C++中结构体的不同之处:在C中的结构体只能自定义数据类型,结构体中不允许有函数,而C++中的结构体可以加入成员函数. C++中的结构体和类的异同: 一. ...

  5. C语言中的结构体

    用户自己建立自己的结构体类型 1.  定义和使用结构体变量 (1).结构体的定义 C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体. (2).声明一个结构体类型的一般形式为: ...

  6. c语言中的结构体指针类型的cast

    1.我们在c语言中会经常碰到强制类型转换. 在这,我介绍一种结构pointer类型转换,但是有前提(有点类似于c++中的继承中的子父对象的cast). 简单的介绍一下: 首先我们要知道一个结构的指针, ...

  7. C语言中全局结构体指针隐含的错误

    前天在嵌入式系统上,调试一个数组的全局变量时,发现该变量一直会动态变化.深入分析, 才发现该全局结构体没有申请内存,而是用了一个指针.这种情况编译器是检查不出来的,在linux 上运行会挂掉,但是在裸 ...

  8. 018_go语言中的结构体

    代码演示 package main import "fmt" type person struct { name string age int } func main() { fm ...

  9. Go语言中的结构体 (struct)

    Golang官方称Go语言的语法相对Java语言而言要简洁很多,但是简洁背后也灵活了很多,所以很多看似很简单的代码上的细节稍不注意就会产生坑.本文主要对struct结构体的相关的语法进行总结和说明. ...

  10. C语言中的结构体是怎么定义的_怎么使用?

    结构体的定义 // 定义结构体st struct st{ int a; // 成员a int b; // 成员b }; #include <stdio.h> struct st{ int ...

随机推荐

  1. kubeadm 如何将节点加入集群

    kubeadm join 使用 token 过期之后(24小时过期),如何加入集群 一.重启生成新token # 创建新token kubeadm token create # 查看是否存在有效的 t ...

  2. P5782-[POI2001]和平委员会【2-SAT】

    正题 题目链接:https://www.luogu.com.cn/problem/P5782 题目大意 \(n\)对人,每对之间恰好有一个人出席.\(m\)对仇恨关系表示两个人不能同时出席. 求是否有 ...

  3. HDFS 10 - HDFS 的联邦机制(Federation 机制)

    目录 1 - 为什么需要联邦 2 - Federation 架构设计 3 HDFS Federation 的不足 版权声明 1 - 为什么需要联邦 单 NameNode 的架构存在的问题:当集群中数据 ...

  4. 初探计算机网络之CPU和内存

    CPU ​ CPU是一块超大规模的集成电路板,是计算机的核心部件,承载着计算机的主要运算和控制功能,是计算机的最终解释模块和执行模块.总之,用一句话概括就是,CPU是由控制器和运算器组成的,而内部寄存 ...

  5. Java编程思想 第九章 接口

    第九章 接口 抽象类和抽象方法 抽象:从具体事物抽出.概括出它们共同的方面.本质属性与关系等,而将个别的.非本质的方面.属性与关系舍弃,这种思维过程,称为抽象. 这句话概括了抽象的概念,而在Java中 ...

  6. JVM 面试题,安排上了!!!

    肝了一篇非常硬核的 JVM 基础总结,写作不易,小伙伴们赶紧点赞.转发安排起来! 原文链接 据说看完这篇 JVM 要一小时 JVM 的主要作用是什么? JVM 就是 Java Virtual Mach ...

  7. mysql学习教程之mysql管理

    MySQL 管理 启动及关闭 MySQL 服务器 Windows 系统下 在 Windows 系统下,打开命令窗口(cmd),进入 MySQL 安装目录的 bin 目录. 启动: cd c:/mysq ...

  8. electron-builder进行DEBUG输出的正确方式

    前言 使用Electron进行打包通常会用到electron-builder或者electron-packager两种工具.在使用electron-builder的时候,由于对机制的不熟悉,我们在打包 ...

  9. CTF入门记录(1

    (https://ctf-wiki.org) 00 基础了解 CTF简介 (wolai.com) 00-1 CTF题目类型 Web 大部分情况下和网.Web.HTTP等相关技能有关. Web攻防的一些 ...

  10. GoLang设计模式10 - 中介者模式

    中介者模式是一种行为型设计模式.在中介者模式中创建了一个中介对象来负责不同类间的通信.因为这些类不需要直接交互,所以也就能避免它们之间的直接依赖,实现解耦的效果. 中介者模式的一个典型案例是老式小火车 ...