构造数据类型:结构体,共用体(union)

结构

结构里的类型声明函数外:多个函数都可使用。 在内:这个函数内使用。区分结构变量

声明结构的形式:结构体名首字母大写

struct point{
int x;
int y;
};

struct point p1,p2;p1,p2里有x,y;

结构初始化 先声明结构类型然后再主函数里面创建结构变量并初始化。声明结构时三个分号:

结构成员:成员可以是不同类型,结构用.运算符和名字访问其成员

结构运算:访问整个结构直接用结构变量的名字。结构可以做赋值,取地址,也可以传递给函数参数。

p1=(struct point){5,10}相当于p1.x=5,p2.y=10;

结构指针:结构变量名赋给指针需要用&取地址,结构变量名并不是结构变量的地址,而数组变量名。

结构指针:用->表示指针所指的结构变量的成员。结构指针即是指向结构的指针。1.声明并初始化指针2.用指针访问成员

结构数组

struct book library[10]; 定义了一个struct book类型的数组,library中的每个元素都是一个book类型的结构

结构的结构,嵌套结构。

嵌套结构:在结构声明里创建嵌套结构。嵌套结构如何访问成员:用两个.运算符。

向函数传递结构的信息

向函数传递结构本身,或者传递指针

1.函数参数作为单个值的类型(char,int double等等)

2。函数参数为结构指针型,传入地址。

3.函数参数为结构,传入的是个结构,被调函数里使用的是传入函数的副本,而函数参数是指针时使用的是原来的结构。

结构作为函数参数:.的运算符比&高。传的是值,想改变结构需要创建新的结构函数并返回值(慕课)

其他结构特性

1.相同类型的结构之间能相互赋值

2.结构可以作为返回值返回给主调函数。

结构和结构指针的选择

结构优点:保护了原始数据,因为被调函数使用的是原始数据的副本。而且程序可读性强。缺点:浪费时间和存储空间

指针优点:执行速度快,只需传递地址。缺点:可能意外更改原来结构的数据,但是可以用const限定符来解决这个问题。

结构中的字符数组和字符指针:

使用字符指针有潜在风险,未初始化的指针变量可以是任何地址,程序可以把名放在任何地方,可能导致程序崩溃。字符数组简单安全,即使指针快一点(不用分配存储空间,直接找存储常量的空间用)

结构,指针,malloc()

复合字面量和结构(c99)

把类型名放在圆括号中,用花括号把初始化列表括起来。

只需一个临时结构值,复合字面量很好用。

伸缩性数组成员(c99)

特性:1.该数组不会立即存在。2.使用它确实可以编写一些合适的代码。

规则:伸缩性数组必须是结构中的最后一个成员。

结构中必须至少必须有一个成员

伸缩性数组得方括号是空的。

伸缩性数组没有被分配空间,需要使用malloc来分配内存,当然字节数是结构里变量类型的总和。

匿名结构(c11)

无名称的结构成员。在花括号后面定义结构变量。在你只需要几个变量时可以用。

使用结构数组的函数

把数组名传进参数,函数参数是结构数组。

把结构内容保存到文件中

存储在一个整个结构中的整套信息被称为记录(record),单独的项被称为字段(field)。

联合:一种数据类型,在同一内存空间中存储不同的数据类型(union)

在联合中一次只能存储一个值,共有体所有成员占用同一段内存

匿名联合(c11)无名称

枚举类型:用枚举类型声明符号名称来表示整型常量 目的提高程序可读性。实际上,enum常量是Int类型常量。符号常量被称为枚举符。

花括号里的枚举常量都有默认值,依次从0.1.2.3等等递增。

也可以对枚举常量赋值,如果只赋值了一个枚举变量,则后面的依次递增1,而且前面从0开始递增。

例子

enum={red,green,blue};

默认第一个变量是0,后面的变量递增1,也可以在花括号内自定义green=2;这样red还是0,但green是2,后面的blue递增1为3.

typedef类型:为某一类型自定义名称。创建的符号名用于类型,不能用于值。

该定义的作用域取决于typedef定义的位置,函数外则具有文件作用域,函数内则局部作用域

自定义数据类型

(typedef):typedef struct{
} Date;

*,(),[]优先级:

(),[]优先级相同但都比*优先级高,遵循从左到右的规则。

函数和 指针

声明一个指向函数的指针,函数指针常用于另一个函数的参数。qsort()可以处理任意类型的数组。第一个参数接受指向函数的指针。

声明指针指向函数的参数类型,返回类型。 例如 void (*pt)(char *)(*pt)是一个参数列表为char*返回值为void的函数,pt是一个指向函数的指针。

声明一个指向特定类型函数的指针,可以先声明这个函数然后把函数名替换成(*pt)。函数名表示地址。

声明函数指针后,可以把类型匹配的函数名赋值给指针。

自定义数据类型

(typedef):typedef struct{
} Date;

union联合类型(共用体)

所有成员共享同一个空间,同一时间只有一个成员有效,union的大小是其最大的成员