第三章 高级C语言数据类型
52、识别函数使用的特殊的语言结构,就能更好的理解使用它的代码。
53、能够识别和分辨每种使用指针的原因。
54、在C语言的程序中指针被用来表现链式数据结构,动态分配的数据结构,实现引用调用,通过数据项访问和迭代,传递数组参数的时候,表示函数的引用,作为别的值的别名引用,表现字符串,或者直接访问系统的内存。
55、函数参数通过引用来传递参数可用于返回函数的结果值,或者为了避免重新复制传递的参数。
56、指向数组的指针可以被用来访问指定序号位置的数组项。
57、对指向数组的指针进行的运算,等价于按照数组数据项序号方式分别进行运算。
58、函数使用的全局或者局部静态变量在大多数的情况下是不可再入的。
59、字符串指针于字符数组是不同的。
60、能够识别和分辨每种使用联合结构的原因。
61、在C语言的程序中,结构体用来将数据项都组织在一起作为一个整体,或用来从一个函数中返回多个数据项,或用来构建链表数据结构,或者用来映射硬件设备的数据组织结构、网络连接和存储媒体,或用来表现抽象的数据类型,或者用来按面向对象的风格编写C语言程序。
62、在C语言中,联合用来优化存储空间,实现多态,或者用来访问内部数的不同表现。
63、指针被初始化指向N的数据项的存储区域,如果该存储区域是一个N数据项的数组,则该指针能够被解引用。
64、动态分配的内存应该明确的释放,或者在程序终止释放,或者使用垃圾收集器;在栈上分配的内存会在调用它的函数退出的时候释放掉。
65、在C语言中,typedef声明用来增强代码的可读性,解决代码的可移植性问题,或者模仿C++和Java中的类声明动作。
66、将typedef声明作为变量的定义:变量的名字就是type的名字,变量的类型就是type相应的类型。
第四章 C语言数据结构
67、留意底层抽象数据类中的外部数据结构的操作。
68、向量的典型实现直接使用C语言中的内建数组数据类型,但没有从底层实现抽象向量的特性。
69、完整的遍历N维数组的使用语句for (i = 0; i < N ; i++)。
70、表达式sizeof(X)总是返回使用memset或memcpy处理后的数组X(不是指针)占用的字节数。
71、数组的范围通常值数组的第一个数据项和最后一个数据项之后的区域。
72、动态数组中的数据项个数相当于改变动态数组的上界和下界得到的结果。
73、当动态数组的上界等于它的下界的时候,表示数组范围为空。
74、动态数组的下界表示数组中第一个分配到内存的数据项,上界表示第一个超出数组空间的数据项。
75、数组数据结构有时用来表现由若干记录和字段组成的数据表。
77、指向数组列的指针或者指向某个数据项的指针都可以用来存储动态分配的一块内存,这两种指针都可以作为二维数组来访问。
78、一维数组也可以用来存储动态分配的一块内存,这种指针使用一维数组最常用的方法来访问。
79、抽象数据类型提供了度量底层数据实现被使用(或者被滥用)的方法。
80、数组可以按照整数0作为关键码开始,进行一系列的查找。
81、数组有时被用来提高数据结构控制流程的效率,从而简化程序的逻辑。
82、数组使用码来存储每个数据项和指向数据项处理函数。
83、在程序中通过存储数据、抽象码、虚拟机等方式,数组能够改变程序的控制行为。
84、表达式sizeof(x)/sizeof(x[0])表示数组x的数据项的个数。
85、包含指向下一个数据项指针的数据结构可以用作实现单链表中的一个节点。
86、持久指针(例如:全局的、静态的或者在堆上分配的)指向的链表节点通常表示链表的头节点。
87、包含指向下一个和前一个数据项指针的数据结构可能表示双链表中的一个节点。
88、把数据项画成方框、指针画成箭头可以用来跟踪复杂的数据结构中的指针行为。
89、可递归的数据结构通常采用可递归的算法来处理。
90、通用数据结构行为和算法通常采用函数或者参数化模板来实现。
91、图节点可以存储在数组、链表或者连接图的各边的链表中。
92、图的边可以用来表现隐含的指针或者隐含的离散数据结构。
93、图的边通常用动态分配的数组或者链表来存储,他们同时也用于实现图的节点。
94、无向图中两个相连的数据节点视为相等,同样处理码的时候也不再区分节点的方向。
95、在无向图中,穿越码用来连接孤立的子图。
96、在处理包含闭环的图时,穿越码用来避免图的循环。
97、在复杂的图中,有可能隐含的、离散的数据结构。
第五章 高级控制流
98、递归的算法和数据结构通常采用递归函数来实现。
99、递归函数要进行基本用例测试、并构建一系列的不可递归、可执行的非正式参数用来测试。
100、简单的语言通常使用符合语言语法结构的一系列的函数来解析。
101、递归函数设计之前就应该考虑递归概念的定义。
102、在函数结尾处进行递归调用相当于循环结构中返回到循环的开始点。
103、在移除掉类方法中的throws语句之后,你可以轻易地使用Java编译器来定位运行时刻可能抛出的隐含异常代码。
104、使用多处理器的代码通常由线程和进程处理组成。
105、并行处理模型在处理器中合理分派任务、或者创建用来分派通用大型任务的任务池。
106、基于线程的并行处理模型需要维持一个中心线程,中心线程负责调度和阻塞工作线程。
107、基于进程的并行处理模型需要复用已有的程序或数据结构,并使用定义良好的接口进行进程间的通讯。
108、基于管道的并行机制中,每个任务负责接收一些输入数据,完成数据的处理,然后将处理结果传递给下一个任务进一步来处理。
109、并行处理的竞争条件是微妙的,而且通常遍布在多个函数或模块中,结果就会造成竞争条件很难独立出来。
110、尽可能在单个处理中观察可疑的数据结构操作和函数库调用。
111、阅读带有宏定义的代码时,紧记宏既不是函数也不是语句。
112、定义在do ... while (0)块中的宏,相当于其中的语句。
113、宏可以显式的访问本地变量。
114、调用宏能够改变传入其中参数的值。
115、使用宏标记进行串连可以形成新的标识符。