Linux C 编程学习第四天_结构体&数据抽象

结构体

由于我水平十分有限,这个系列的随笔也只是对C语言进行查漏补缺,结构体接触的十分少,依稀记得大学里教的C语言到指针就结束了,结构体只停留在知道它是个混合类型的类似数组的东西,所以先进行基础知识的恶补。

C数组允许定义可存储相同类型数据项的变量,结构式 C 编程中另一种用户可以自己定义的可用的数据类型,它允许存储不同类型的数据项。

结构体的定义必须使用 struct 语句,格式如下:

Linux C 编程学习第四天_结构体&数据抽象

 

 tag 是结构体标签,member-list 是标准的变量定义,variable-list  结构变量,定义在末尾

long time ago................

刚看完菜鸟的 C 结构体,有些许一知半解,但是还好,我接着看linux C

我们所使用的大多数类型,具有单一的值,例如整数、字符、布尔值、浮点数,这些称之为基本数据类型(Primitive Type)。字符串是一个例外,它由很多字符组成,这样由基本类型组成的数据称之为复合数据类型(Compound Type)由基本类型组成符合类型也有组合规则,结构体、数组、字符串。一方面组合数据类型可以当作一个数据来使用,也可以单独访问各自组成单元。复合数据类型这种两面性体提供了一种数据抽象(Data Abstraction)的方法。

学习一门语言特别要注意以下3个方面:
Linux C 编程学习第四天_结构体&数据抽象

 

 开始定义结构体:

Linux C 编程学习第四天_结构体&数据抽象

 首先我们定义了 my_game 这个标识符,它的命名规则和变量一样,但是它不是一个变量,它表示一个类型,自己定义的复合类型,它在C中称之为 Tag ,{ } 括起来整体可以看作是一个复合类型名字,就像是int,char这样,我们用它定义了  L4D2   PUBG    FGO  三个变量,只要定义了Tag,以后就可以直接这样定义其他的变量了:

Linux C 编程学习第四天_结构体&数据抽象

这个定义可以写在函数外面,这样就可以在任何函数中使用,就和全局变量一样。 

结构体变量可以在定义时初始化

如果在一开始就定义变量,就可以不写 Tag 了:

Linux C 编程学习第四天_结构体&数据抽象

 但是这样意味着,以后没办法再次引用这个结构体类型,因为它没有名字。

结构体初始化的时候可以直接赋值:

Linux C 编程学习第四天_结构体&数据抽象

Linux C 编程学习第四天_结构体&数据抽象

如果 { } 中的数据比结构体的成员多,就会报错,如果数据比结构体成员少,那么未指定的成员就会用0来代替。

虽然可以在定义的时候直接赋值,但是定义之后就不能全体赋值了。

如下图14行的方法就会报错。

Linux C 编程学习第四天_结构体&数据抽象

 

 

结构体访问:

 使用   .   这个运算符来访问结构体成员:

Linux C 编程学习第四天_结构体&数据抽象

 

 赋值可以在定义完结构体后单独给结构体成员赋值

Linux C 编程学习第四天_结构体&数据抽象

 

 但是需要注意的是,单独给结构体成员赋值必须写在函数里,写在函数外会报错。结构体初始化可以写在函数外,但是结构体赋值不能写在函数外,这是结构体和一般变量不同的地方。

结构体类型的值在表达式中有很多限制,不像基本数据那么*,+ - * /  && || !都不能用于结构体类型,if  while 的控制表达式的值也不能是结构体类型。

可以做运算的的类型称为算术类型(Arithmetic Type)算数类型包括整型和浮点。

可以做逻辑与或非的操作数或者if for while  的控制表达式的类型称为标量类型(Scalar Type)标量类型包括算数类型和指针类型。

结构体之间使用赋值运算时允许的,可以用一个结构体去初识化另外一个结构体:

Linux C 编程学习第四天_结构体&数据抽象

 

 赋值也可以:

Linux C 编程学习第四天_结构体&数据抽象

结构体可以有返回值,也可以当函数的参数,也可以用结构体去定义结构体:

 1 #include <stdio.h>
 2 
 3 struct complex_struct
 4 {
 5     int i;
 6     int j;
 7 }z1 = {1, 2};
 8 
 9 struct complex_struct add_complex(struct complex_struct z1, struct complex_struct z2)
10 {
11     z1.i = z1.i + z2.i;
12     z1.j = z1.j + z2.j;
13     return z1;
14 }
15 
16 int main(int argc, char const *argv[])
17 {
18     complex_struct z2 = {2, 4};
19     complex_struct z3;
20 
21     z3 = add_complex(z1,z2);
22     printf("%d\n%d\n", z3.i, z3.j);
23     return 0;
24 }

上述代码中,第九行定义了一个函数,函数的参数为两个结构体 z1 z2,同时函数返回一个结构体 z1 ,在函数中,实现了两个结构体的 i 相加,j 相加。

也就是一个复数的加法,实部和实部相加,虚部和虚部相加。

Linux C 编程学习第四天_结构体&数据抽象

 

 

数据抽象:

这是一种全新的编程思维,我从来没接触过,看完了又是一波恍然大悟,之后我消化结束就从新整理。

上一篇:Luogu P3793 由乃救爷爷


下一篇:【学习笔记】数理统计习题八