C语言程序设计---读书笔记3

· 读书笔记按照章节记录,原书作者 丹尼斯里奇

· 笔记  C语言程序设计---读书笔记2

· 笔记中相同的知识点可能来自书中不同的章节

· 解释与思考部分并不全是书中的内容,也包括经验之谈、网上资料

   结构

结构是一个或者多个变量的集合

6.1 结构的基本知识

声明结构体类型:

struct poind {

Int  x;

Int y;

};

定义结构体变量:

定义结构变量xyz

struct poind {

........

}x,  y,  z;

定义结构变量pt

struct poind pt;

 结构体初始化:

struct point maxpt = {320,200}

  • 关键字struct 引入结构声明,结构声明有包含在花括号内的一系列声明组成。
  • struct 后面的名字是可选的,成为结构标记。
  • 结构中定义的变量成为成员,结构成员、结构标记、和普通变量可以采用相同的名字。
  • 不同结构中的成员可以使用相同的名字。

6.2 结构与函数

  • 结构的几种合法操作:

   作为一个整体复制和赋值;

   通过 & 运算符取地址;

   访问其成员。

  • 对与结构体变量访问成员使用 运算符 . 对与结构体指针访问成员使用 运算符 ->
  • 复制和赋值包括函数传递参数以及从函数返回值:

例如:从传入函数的参数和返回值都是结构体类型

struct poind addpoindstruct poind p1,  struct poind p2

{

p1.x += p2.x;

p1.y += p2.y

return  p1;

}

传入的参数直接赋值给 p1p2,同时返回结构类型

6.3 结构与数组

定义结构体数组

struct key

{

char *word

int count;

}keytab[NKEYS];

struct key

{

char *word

int count;

};

struct key keytab[NKEYS];

 

定义并初始化

struct key

{

char *word

int count;

}keytab[] = {

“auto”, 0,

“break”, 0,

“char”, 0,

“const”, 0

};

初值可以用花括号 {} 括起来:

{“auto”, 0},

{“break”, 0},

{“const”, 0}

6.4 指向结构的指针

 如果 p 是一个指向结构的指针,则对 p 的算术运算需要考虑结构的长度,所以 p++执行时,将在 p 地址上加上一个结构的长度

6.5 自引用结构

统计输入单词出现的次数,使用自引用结构组成一种树的数据结构:

struct tnode{

char *word

int count

sturct tnode *left

struct tnode *right

};

解释与思考6.5

自引用结构需要用结构体指针,使用变量会无法确定结构体的大小。

6.6 表查找

6.7 类型定义(typedef

C 语言使用typedef 建立新的数据结构类型名。

typedef int Length;

Length len, maxlen;

Length *lengths[];

与使用int 完全相同

typedef int (*PFI) (char*, char*);

该语句定义了类型PFI 是一个指向函数的指针,该函数具有两个 char* 类型的参数,返回值为 int 类型。

6.8 联合

使用联合可以在单块存储区中管理不同类型的数据,而不需要在程序中嵌入任何同机器有关的信息。

定义:

union u_tag {

int ival;

float fval;

char *sval;

}u;

上述联合体中的任何一种类型的对象都可以赋值给 u,且可以使用在随后的表达式中,但是必须保证是一致的:读取的类型必须是最近一次存入的类型。如果保存的类型与读取的类型不一致,其结果取决于具体的实现。

联合的访问方式和结构相同:

联合名.成员

联合指针->成员

6.9 位字段

例子:

sturct {

unsigned int is_keyword : 1;

unsigned int is_extern : 1;

unsigned int is_static : 1;

}flags;

这里定义了一个变量 flags,它包含 3 个一位的字段。冒号后的数字便是字段的宽度。字段被声明为 unsigned int 类型,保证它们是无符号量。

单个字段的引用方式与其它结构成员相同:

flags.is_extern = flags.is_static = 1;

flags.is_extern = flags.is_static = 0;

某些机器上字段的分配是从字的左端至右端,而某些则相反。这意味着尽管字段对维护内部定义的数据结构很有用,但是在选择外部定义数据的情况下,必须仔细考虑那段优先的问题。依赖这些因素的程序是不可移植的。

字段没有地址,因此不能对它们使用 & 运算符。

 

你可能感兴趣的:(C语言,读书笔记,C语言程序设计)