类型提升
printf("%d",sizeof'A');//不是1而是4(int)
注意不仅是表达式中的操作数会被类型提升,函数的参数同样如此。printf的%d可以打印出char,short,long,因为它们都被隐式转换为int。
指针转换
char *a;
(unsigned short*)a //小指针转大指针,容易越界,多访问1个字节
//不同类型的指针索引不同大小的内存
long *a;
(short*)a //大指针转小指针,丢失2个字节,动态内存可能内存泄漏
//但是要注意,如果用char* 或者void*来指向内存中开辟好的空间,
//每次使用的时候都会强制转换为其真实类型的指针的情况下,则不怕上述的转换,
//只要你保证指针转换的时候指向了内存开始的地方,同时保证不会索引到非法内存就可以了,
/C语言很灵活(容易出错)
Hash,散列表
hash散列表是一种提高访问表中数据的方法,它不是线性的搜索表中的元素,而是一下子跳到最相像的元素来存储值。
这是通过精心地向表中载入元素实现的,应用散列函数代替线性顺序,把数据值和位置联系起来,散列函数会产生0-表长度减1的数值,它就是所需要存储数据的索引。
如果这个位置已经被填充,那么就从这个位置继续向前搜索,直到找到一个空的位置。另一种办法是建立一个链表,挂在这个位置的后面,所有散列到这个位置的元素都添加到这个链表中,甚至可以在这个位置后面在挂一个散列表。
当查找一个数据的时候,不需要从表的第一个数据开始查起,而是先产生该数据项的散列函数值,并根据这个值找到表中相应的位置,并从该位置开始查找该数据项。
散列表是一种被广泛使用和严格测试过的表查找优化方法,编译器,操作系统和数据库中都有它的影子。
Reference
C专家编程