《C Primer Plus》 第14章 结构和其他数据形式
目录
14.2建立结构声明
struct book{
char title[MAXTITL];
char author[MAXTITL];
float value;
};
关键字:struct,后面是一个可选标记:book,稍后程序中可以使用该标记引用该结构。
在后面程序中可以这样声明:
struct book library;
这把library声明为一个使用book结构布局的结构变量。
14.3定义结构变量
14.3.1初始化结构
同int等变量一样,结构体同样可以初始化。
struct book library={
"The Pious Pirate and the Devious Damsel",
"Renee Viotte",
1.95
};
14.3.2访问结构成员
结构类似一个“超级数组”。访问结构成员就要用结构成员运算符——点(.)访问。例如library.value即可访问library的value部分。注意:“.”的优先级高于“&”。所以在scanf("%f",...)
中,&library.title和&(library.float)一样。
14.4结构数组
14.4.1声明结构数组
struct book library[MAXBKS];
以上代码把library声明为一个内含MAXBKS个元素的数组。数组的每个元素都是一个book类型的数组。
14.4.2标识结构数组的成员
访问单独结构:
library[0].value
第一个数组元素与value相关联。
library[4].title
第五个数组元素与title相关联。
library[2].title[4]
library数组的第三个结构变量中书名的第五个字符。
14.6指向结构的指针
(指针复杂的一批)QAQ
14.6.1 声明和初始化结构指针
声明结构指针很简单:
struct guy *him
该声明并未创建一个新的结构,但是指针him现在可以指向任意现有的guy类型的结构。
注意:结构变量名并不是结构的地址,因此要在结构变量名前面加上运算符“&”。
14.6.2用指针访问成员
第一种方法:用->运算符
第二种方法:如果him==&fellow[0],那么*him==fellow[0]。
14.7向函数传递结构信息
14.7.1传递结构成员
只要结构成员是一个具有单个值的数据类型(int,char float,double或指针),便可把它作为参数传递给接受接受该特定类型的函数。
14.7.2传递结构的地址
当函数使用指向结构的指针作为它的参数。并把地址传递给该函数,使得指针指向结构变量。然后通过->运算符获取其值。
14.10联合简介
union是一种数据类型,能在一个内存空间中储存不同的数据类型。
union hold{
int digit;
double bigfl;
char letter;
};
声明
union hold fit;//hold类型的联合变量
union hold save[10];//内含10个联合变量的数组
union hold *pu;//指向hold类型联合变量的指针
联合只能储存一个值,这点与结构不同。
14.10.1使用联合
fit.digit=23
fit.bigfl=2.0
fit.letter='h'
联合的成员共享一个共同的存储空间。联合同一时间只能储存一个单独的数据项。
14.11枚举类型
enum关键字,可以创建一个新“类型”并指定它可具有的值(实际上,enum常量是int类型)。默认情况下,枚举列表中的常量都被赋予0,1,2等以此类推
enum kids {nippy,slats,skippy,nina.,ia}
声明中nina的值是3 。
14.12typedef简介
typedef工具是一个高级数据特性,利用typedef可以为某一类型自定义名称。与#define类似,但又不同
- 与#define不同,typedef创建的符号名只受限于类型,不能用于值。
- typedef由编译器解释,不是预处理器。
- 在其受限范围内,typedef比#define更灵活。
typedef unsigned char BYTE;
随后,便可用BYTE来定义变量:
BYTE x,y[10],*z;
14.14函数和指针
函数名代表函数的地址,可以把函数的地址作为参数传递给其他函数,然后这些函数就可以使用被指向的函数。如果把特定函数的地址赋给一个名为pf的函数指针,可以通过以下两种方式调用到该函数:
#include<math.h>
double (*pdf)(double);
double x;
pdf=sin;
x=(*pdf)(1.2);
x=pdf(1.2);