构造数据类型:结构体,共用体(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的大小是其最大的成员。