结构体无法比较

结构体无法比较

由于结构体的成员不一定是连续地存储在内存中,所以不能用运算符==!=来对结构体进行比较,事实上,在一个结构体的存储区域内可能会出现一些“空洞”,这是由于计算机是按照一定的边界,例如半字、字、双字边界来存储不同数据类型的变量。

怎样从函数返回多个值

怎样从函数返回多个值

l  怎样从函数返回多个值(利用极坐标到直角坐标的转换做例子)

n  1.传入多个指针指向不同的地址,让函数填入需要返回的值

u  clip_image002

n  2.让函数返回包含需要值的结构

u  clip_image003

n  结合指针和结构,让函数接收结构指针,然后再填入需要的数据

u  clip_image004

n  不得已的时候,可以使用全局变量,但是这个方法不推荐,GOD晓得有没有可能在多线程的其他程序中会修改全局变量,所以这是迫不得已时采用的方法。

结构、联合和枚举

结构、联合和枚举

l  所谓的抽象数据类型,应该只在源文件中看到细节才完美;

l  对于大工程而言,最好将函数原型和结构声明放在单独的头文件中;

l  在结构中,比较安全的定义方式是使用指针而不是数组;

l  不能使用==!=来比较结构是因为可能会遇到结构中没有使用的洞hole的随机内容而导致失败;

l  当结构作为函数参数传递的时候,通常会把整个结构都推进栈,需要多少空间就使用多少空间,正是为了避免这个代价,程序员经常使用指针而不是结构

l  为了广泛的可移植性,在读写文件的时候,最好使用二进制b选项;

l  正确地对齐是种编译器高效访问的策略;

l  将结构中的域按照从大到小的顺序排列可以最大限度地降低填充的影响;

l  结构为一级对象,而结构为二级对象,不能直接对结构进行赋值等;

l  在原来的ANSI C中,只有联合中的第一个成员可以被初始化,C99引入了指定初始式,可以用来初始化任意成员

l  联合无法跟踪到底是哪一个域在使用;

l  枚举的优点为:自动赋值;调试器在检验枚举变量时,可以显示符号值;它们服从数据块作用域规则。一个缺点是程序员不能控制这些非致命的警告,有些程序员则反感于无法控制枚举变量的大小;

l  位域冒号:指定二进制大小的方法只适用于结构和联合的成员;

位域是可以移植的;

声明和初始化

声明和初始化

l  char至少有8位,short intint至少有16位,long int至少有32位,在C99中,long long至少有64位;

l  C语言中,唯一能够让你以二进制位的方式指定大小的地方就是结构中的位域;

l  尽管一个全局变量或函数可以在多个编译单元中有多处声明declaration,但是定义definiton却最多只能允许出现一次

l  extern只对数据声明有意义,因为函数默认就有该属性;

l  typedef用来定义新的类型名称,而不是定义新的变量或函数;

l  对于typedefdefine而言,最好使用typedef,因为它可以处理指针类型,而define有时不可以,就算可以,也要加很多的括号;

l  定义结构中包含结构本身指针的较好风格:

n  clip_image002

l  C语言有4种作用域:函数、文件、块和原型;

l  C语言有四种命名空间:

n  行标label:即goto的目的地;

n  标签tag:结构、联合和枚举的名称;

n  结构/联合成员;

n  普通标识符:函数、变量、类型定义名称和枚举常量;