@Jayfeather
2018-04-28T01:24:48.000000Z
字数 2139
阅读 926
C_Primer_Plus读书笔记
struct book{char title[AXTITL];char author[MAXAUTL];float value;};//注意 这个地方有一个分号!!!
struct:关键字 表明跟在其后的是一个结构
标记(book):可使用该标记引用该结构(可选)
结构成员列表:花括号中的结构,每一个成员都用自己的声明来描述。且成员可以是C的任意数据类型,甚至是其他结构。
右花括号边的分号是必须的,表明结构布局定义结束。
结构声明的位置:
在函数外部:声明之后的所有函数都可以使用该结构。
在函数内部:只能由该函数使用。
结构有两层含义:
结构布局,结构变量;
结构布局告诉编译器如何表示数据,但是并未分配空间;
下面来介绍结构变量:
struct book library;
编译器执行该代码的时候创建了一个结构变量library
编译器使用book模板分配空间:一个内含MAXTITL个char元素的数组和一个float类型的变量。
这些存储空间由一个library结合在一起;
struct book doyle,panshin,*ptbook
这一些声明都可以:
book 相当于 int 或 float。
例如 struct book doyle;相当于:
struct book{char title[AXTITL];char author[MAXAUTL];float calue;} doyle ;//声明右边花括号跟变量名;
当然,声明结构定义和结构变量可以一步完成,不需要添加结构标记,
举例:
struct //无需结构标记{char title[AXTITL];char author[MAXAUTL];float calue;} doyle ;
初始化结构与初始化数组类似:
struct book library = {"The pious Pirate and the Devious Damsel","Renee Vivotte",1.95};
点(.)运算符:
* 例如:library.value即访问library结构中的value成员
* .value相当于book结构的下标。
* 运算结果的类型取决于结构中定义的类型
* .运算符的优先级要比&高
例如scanf("%lf",&library.value)
结构初始化器 :
使用点运算符和成员名标识特定元素
例如:
struct book gift={.value =25.99,.author="James Broadfool",.title="Rue for the Toad"};
另外,最后一次赋值才是实际的值。
例子:
struct book library[MAXBKS];
举例:
library //一个book结构的数组library[2] //一个数组元素,该元素是book结构library[2].title //一个char数组(library[2]的title成员library[2].title[5] //数组中library[2]元素title成员的一个字符
用法:和正常的结构一样。
注意事项:
* 在结构声明中创建嵌套结构时,要进行简单声明
* 文件中应该包含names的声明
* 嵌套数组需要使用至少两次原点运算符
* (.)运算符从左向右进行解释
举例:
struct guy* him; \\声明him=&barney; \\结构变量赋值给指针him=&fellow[0] \\结构数组赋值给指针
两种方法:
1. 使用->运算符
如果 him==&harney ,那么 him->income 即是 barney.income
如果 him==&fellow[0], 那么 him->fellow[0] 即是 fellow[0].income
2. 使用*和.运算符
fellow[0].income==(*him).income == him->income
有两种方法向函数传递结构信息
1. 传递结构本身
2. 传递结构的指针
把指针作为参数
优点:
* 无论什么时候都能使用这种方法
* 执行起来很快
缺点:
* 无法保护数据(可以用const字符避免)
把结构作为参数:
优点:
* 保护原始数据
* 简单不易犯错
缺点
* 较老版本无法处理内容
* 浪费时间和存储空间
简而言之,联合就是在同一个内存空间存储不同类型的数据
声明方式和用法与结构类似
目的:提高程序可读性
用法:和结构相同
关键字:enum