结构体
由于我水平十分有限,这个系列的随笔也只是对C语言进行查漏补缺,结构体接触的十分少,依稀记得大学里教的C语言到指针就结束了,结构体只停留在知道它是个混合类型的类似数组的东西,所以先进行基础知识的恶补。
C数组允许定义可存储相同类型数据项的变量,结构式 C 编程中另一种用户可以自己定义的可用的数据类型,它允许存储不同类型的数据项。
结构体的定义必须使用 struct 语句,格式如下:
tag 是结构体标签,member-list 是标准的变量定义,variable-list 结构变量,定义在末尾
long time ago................
刚看完菜鸟的 C 结构体,有些许一知半解,但是还好,我接着看linux C
我们所使用的大多数类型,具有单一的值,例如整数、字符、布尔值、浮点数,这些称之为基本数据类型(Primitive Type)。字符串是一个例外,它由很多字符组成,这样由基本类型组成的数据称之为复合数据类型(Compound Type)由基本类型组成符合类型也有组合规则,结构体、数组、字符串。一方面组合数据类型可以当作一个数据来使用,也可以单独访问各自组成单元。复合数据类型这种两面性体提供了一种数据抽象(Data Abstraction)的方法。
学习一门语言特别要注意以下3个方面:
开始定义结构体:
首先我们定义了 my_game 这个标识符,它的命名规则和变量一样,但是它不是一个变量,它表示一个类型,自己定义的复合类型,它在C中称之为 Tag ,{ } 括起来整体可以看作是一个复合类型名字,就像是int,char这样,我们用它定义了 L4D2 PUBG FGO 三个变量,只要定义了Tag,以后就可以直接这样定义其他的变量了:
这个定义可以写在函数外面,这样就可以在任何函数中使用,就和全局变量一样。
结构体变量可以在定义时初始化
如果在一开始就定义变量,就可以不写 Tag 了:
但是这样意味着,以后没办法再次引用这个结构体类型,因为它没有名字。
结构体初始化的时候可以直接赋值:
如果 { } 中的数据比结构体的成员多,就会报错,如果数据比结构体成员少,那么未指定的成员就会用0来代替。
虽然可以在定义的时候直接赋值,但是定义之后就不能全体赋值了。
如下图14行的方法就会报错。
结构体访问:
使用 . 这个运算符来访问结构体成员:
赋值可以在定义完结构体后单独给结构体成员赋值
但是需要注意的是,单独给结构体成员赋值必须写在函数里,写在函数外会报错。结构体初始化可以写在函数外,但是结构体赋值不能写在函数外,这是结构体和一般变量不同的地方。
结构体类型的值在表达式中有很多限制,不像基本数据那么*,+ - * / && || !都不能用于结构体类型,if while 的控制表达式的值也不能是结构体类型。
可以做运算的的类型称为算术类型(Arithmetic Type)算数类型包括整型和浮点。
可以做逻辑与或非的操作数或者if for while 的控制表达式的类型称为标量类型(Scalar Type)标量类型包括算数类型和指针类型。
结构体之间使用赋值运算时允许的,可以用一个结构体去初识化另外一个结构体:
赋值也可以:
结构体可以有返回值,也可以当函数的参数,也可以用结构体去定义结构体:
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 相加。
也就是一个复数的加法,实部和实部相加,虚部和虚部相加。
数据抽象:
这是一种全新的编程思维,我从来没接触过,看完了又是一波恍然大悟,之后我消化结束就从新整理。