摘要:因为结构体支持所有数据类型,所以结构体内部也可以有数组存在。考虑到每次都是用语法来产生变量的方法未免过于繁琐,语言允许将结构体当作一个数据类型来方便我们更好地使用。结构体与当然,还可以作用于结构体。
本篇文章是一次大胆的尝试,我想试着改变我那枯燥不堪的文笔,试着能不能幽默风趣地讲解知识点。如果效果好的话,我会进一步尝试!希望大家喜欢!
学习结构体之前,我们先来讲讲 非常 ?? 的 typedef 函数!
简单来说,typedef 可以将一个数据类型重命名,使用方法如下:
❓ 额……那它有什么用呢?我们来看下面的例子:
吐槽:unsigned char 真是又臭又长,用得让我很不爽!我真是受够了!使用 typedef ,你就可以给 unsigned char 取新的名字,不要998,只要学会它!就能给这个数据类型取名!你还在等什么?赶快来学吧!
? 举个例子:将 unsigned char 重命名为 u_char
typedef unsigned char u_char; ? ? ? 关键字 数据类型 新名字
这样一来,我们就可以用 u_char 来取代又臭又长的 unsigned char 了!
unsigned char c;u_char c;
值得注意的是!typedef 的影响是有范围限制的,只能在它所处的大括号内使用,也就是出了作用域就会嗝屁。如果你想全局使用,可以在 #include 头文件包含下面就定义 typedef,这样它就有了 主角光环 !就不会这么轻易的狗带了!如下所示:
#include #include typedef char* String; //我是带有主角光环的typedef ✨int my_strlen(String str) { int i, cnt = 0; for(i = 0; str[i] != "/0"; i++) { cnt++; } return cnt;}int main(void) { String s = (String)malloc(sizeof(char) * 10); //还能进行强制类型转换 printf("Enter String: "); scanf("%[^/n]", s); free(s); // s: 我免费了! return 0;}
这么一来,typedef 就可以全局使用了。你学费了吗?亲手敲一敲试试看!
结构体是一些值的集合,这些值称为成员变量。结构的每个成员以是不同类型的变量。
如果说数组是同一类型的变量集合,那么结构体就是各种各样变量的集合。因为结构体支持所有C数据类型,所以结构体内部也可以有数组存在。
? 举个栗子,如果要保存学生的信息(学号,姓名,年级),想将信息捆绑在一起,作为一个变量来管理会十分便利。像这样把多个数据类型捆绑在一起的,就叫做结构体。
? 上述举的例子(保存学生信息):
struct { int id; char name[26]; double gradePoints;} student;
但是,对于有多个学生的情况,需要多个这样的变量。考虑到每次都是用 struct {} 语法来产生变量的方法未免过于繁琐,C语言允许将结构体当作一个数据类型来方便我们更好地使用。如下所示,
ps:tag 表示 结构体标签
struct tag { type1 fieldName1; ... typeN fieldNameN;};struct tag variable_identifier1;struct tag variable_identifier2;
struct student{int id;char name[26];float grade;};struct student xiaoming;struct student xiaohong;
综上所述得出总结:结构体是用户自定义的类型 (user-defined type) 。
下面将演示结构体变量声明后初始化的过程:
? 声明变量时允许指定初始值:
为了接近结构体的变量,我们可以使用 "点操作符(·)" 来获取它。值得一提的是,字符串复制时要使用 strcpy。
? 当然,typedef 还可以作用于结构体。这样可以让结构体用起来更爽,而不用拖着 struct name 又臭又长的玩意来定义变量,使用方法如下:
? 之前举的学生结构体的例子,我们现在可以升级一下了:
? 使用 typedef 前
struct student { int id; char name[26]; float grade;};struct student xiaohong;
⚡ 使用 typedef 后:
typedef struct { int id; char name[26]; float grade;} stu;stu Park;
简直是爽炸了有木有!不爽不要玩!
① 匿名定义
简直是莽夫行为,莽就完事了!直接拿来就用,名字都懒得取了!
struct { ...} var;
? 开玩笑开玩笑,这其实是传说中的 "匿名结构体"
? 匿名结构体:在声明结构的时候,可以不完全声明。匿名结构体在声明时省略掉结构体标签(tag),因为没有结构体标签导致无法构成类型,所以匿名结构体自然只能用一次。
? 匿名结构体使用方法演示:
struct { int a; char b; float c; double d;} s; struct { int a; char b; float c; double d;} *ps;
② tag 定义(结构体标签)
非常常见的定义结构的方式
struct tag { ...} var;struct tag var;
③ typedef 定义
非常爽的定义方式,定义完之后用起来更加得心应手!
typedef struct { ...} test;test var;
当然,如果你怕你忘了 test 是个啥,你也可以加上 tag ,tag 多长都没事,反正你用 typedef 了。
typedef struct This_is_a_test { ...} test;test var;
? 结构体变量间也可以使用赋值操作符的。但是!只有是同一结构体类型时才能使用。
通俗点说,想要结构体变量间赋值,它们得是同一个妈生的才行。
? 例子:
#include int main(void) { typedef struct { int year; int month; int day; } birthday; birthday A = {2000, 4, 12}; birthday B = {2002, 7, 9}; printf("A的生日: %d年%d月%d日/n", A.year, A.month, A.day); printf("B的生日: %d年%d月%d日/n", B.year, B.month, B.day); // 赋值 A = B; printf("A <- B 复制后:/n"); printf("A的生日: %d年%d月%d日/n", A.year, A.month, A.day); printf("B的生日: %d年%d月%d日/n", B.year, B.month, B.day); return 0;}
? 运行结果:
好了!我们点到为止,这一篇只是开个头,下一篇我将会继续讲解结构体!
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/125079.html
摘要:尽管如此,还具有高级的数据类型和灵活性。它配备了大量的标准模块,可用于程序库。一些模块提供如下功能通过这些很赞的特性,瞬时化身为面向过程的语言。开发者可以便捷地将解释器连接到一个使用编写的应用程序,并能随时用作扩展。下一部分会继续分享。 【编者按】本文作者是 Abhishek Jaiswal ,擅长 .NET、C#、Python 等多种语言的技术控。本文中,作者通过活泼有趣的口吻向大家...
摘要:局部变量的作用域是变量所在的局部范围。局部变量的生命周期是进入作用域生命周期开始,出作用域生命周期结束。 目录 1、什么是c语言? 2、数据类型 3、变量、常量 3.1 定义变量的方法 3.2 变量的分类 3.3 变量的作用域和生命周期 3.4定义常量的方法 4、关键字 1、什么是c语言?...
阅读 1715·2021-11-25 09:43
阅读 15092·2021-09-22 15:11
阅读 2604·2019-08-30 13:19
阅读 1982·2019-08-30 12:54
阅读 1800·2019-08-29 13:06
阅读 905·2019-08-26 14:07
阅读 1597·2019-08-26 10:47
阅读 3005·2019-08-26 10:41