第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);

——所有代码仅表示关键步骤,可能无法正常运行

发布了19 篇原创文章 · 获赞 0 · 访问量 1052

猜你喜欢

转载自blog.csdn.net/L_fengzifei/article/details/104715708
今日推荐