第14章 结构和其他数据形式
——《C Primer Plus》的搬运工,仅记录自己觉得重要的内容,方便以后参考
14.2建立结构声明
如果结构声明置于一个函数的内容,其标记只能在该函数内部使用。
14.6指向结构的指针
14.6.1声明和初始化结构指针
struct guy* him;//指针可以指向任意guy类型的结构变量
him = &barney;//struct guy barney
结构名不是结构的地址,所以要加&
一个结构的大小可能大于成员大小的和
14.6.2用指针访问成员
him = &barney;
him->incom;//struct guy {int come};,等价于barney.income
him = &barney;
*him=barney;
(*him).income;
14.7向函数传递结构的信息
14.7.2传递结构的地址
double sum(const struct funds* money);
struct funds stan;
sum(&stan);//利用&获取结构的地址
14.7.3传递结构
double sum( struct funds moolah);
struct funds stan;
sum(stan)
moolah结构的各成员初始化为结构变量相应成员的值的副本
14.7.4其他结构特性
- 允许一个结构赋值给另一个结构(即使成员是数组也可以赋值),但是一个数组不能赋值给另一个数组
- 将结构作为返回值返回
struct namect makeinfo(struct namect);
person = makeinfo(person);
struct namect makeinfo(struct namect info)
{
info.letters = strlen(info.fname) + strlen(info.lname);
return info;
}
14.7.6结构中的字符数组和字符指针
结构体中定义字符串有两种定义方式
strcut name
{
char first[M];
char* last;
};
struct name n1={"姓","名"};
14.7.7结构、指针和malloc()
还是为结构体中的字符串分配内存
14.7.8复合字面量和结构
当需要一个临时结构变值时,可以创建复合字面量(匿名结构)
(struct book){成员初始化值};
还可以作为参数
struct r
{
double x;
double y;
};
double r(strcut rect r);
r((struct rect){1,2});
//==//
double r(struct rect* p);
r(&(struct rect){1,2})
复合字面量在所有函数的外部,具有静态存储期,如果复合字面量在块中,具有自动存储期。
14.7.9伸缩型数组成员-没看
14.7.10匿名结构(C11)
主要应用于嵌套结构
struct a
{
int x;
int y;
};
strcut b
{
int c;
struct a p;
};
//调用
struct b b1;
b1.p.x;
b1.p.y
//==//
strcut b
{
int c;
struct {double x; double y};
};
//调用
struct b b1;
b1.x;
b1.y
14.7.11使用结构数组的函数
创建结构数组,数组名就是该数组的地址,可以把它传递给函数
该函数还需要访问结构模板
struct funds
{
int a;
int b;
};
int sum(const struct funds arr[]);//调用arr[i].a,arr[i].b
//int sum(const struct funds* arr);//调用(arr+1)->a
struct funds jones[]={{1,2},{3,4}};
sum(jones);
14.10联合简介
联合是一种数据结构,它能够在同一个内存空间中存储不同的数据类型,但不是同时存储。
联合分配的空间是声明中占用最大字节的类型(下列中分配的空间占double类型的字节)
//定义联合
union hold
{
int digit;
double bigdl;
char letter;
}
//声明变量
union hold fit;
union hold save[10];
union hold* pu;
初始化联合,联合只能存储一个值。
union hold valA;
valA.letter ='R';
union hold valB = valA;
union hold valC={88};
union hold valD={.bigfl=118.2};//指定初始化器
14.10.1使用联合
fit.digit=23;
fit.bigfl=2.0;//清除23,存储20.
fit。better='h';//清除2.0,存储‘h’
//使用指针
pu=&fit;
x=pu->digit;
使用联合,在结构中存储与其成员从属关系的信息。——见P473
14.10.2匿名联合(C11)
与匿名结构类似
14.10枚举类型
用声明的符号来表示整型常量
enum spectrum(red, orange, yellow);//枚举了可能的值
enum spectrum color;//定义了color变量,color=red || yellow || orange,这些
默认值从0开始,可以进行赋值操作
14.12typedef简介
利用typedef可以为某一类型自定义名称
typedef不能用于值,只能用于类型
typedef不是预处理器
typedef unsigned char BYTE;//BYTE为unsigned char的别名
typedef char* STRING;
STRING a,b;//== char* a;char* b
//对于结构体
typedef struct rect{}RECT;
typedef struct{}RECT;//省略结构体名
14.13其他复杂的声明-没看
14.14函数和指针
函数指针常用于另一个函数的参数,告诉该函数要使用哪一个函数
函数也有地址,因为机器语言实现由载入内存的代码组成,指向函数的指针存储着函数代码的起始处的地址
声明函数指针时,要声明指针指向的函数类型,即函数的返回类型和形参类型
void ToUpper(char*);
void (*pf)(char*);
pf=ToUpper;
函数指针的调用
char mis[]="hello";
(*pf)(mis);
pf(mis);
等价于ToUpper(mis);
//==//
void ToLower(char*);
void show(void (*fp)(char*),char* str);
char mis[]="hello";
show(ToLower,mis);
——所有代码仅表示关键步骤,可能无法正常运行