《C和指针》学习笔记(二)第七~第十章

一、机器没法判断值的数据类型,编译器根据值的声明类型建立适当的指令,机器只是盲目地执行这些指令而已 二、char * strpbrk(const char * cs,const char * ct)     在源字符串(s1)中找出最早含有搜索字符串(s2)中任一字符的位置并返回,若找不到则返回空指针。 三、函数声明向编译器提供函数的相关信息 四、存根(stub)为还没有编写的程序站好位置 五、无返回值的函数被称为过程(procedure) 六、函数的缺省认定,对于没法见到原型的函数,编译器认定该函数返回一个整型值 七、通常为传值调用,若参数为数组名,使用下标则为传址调用,实际上也是传值只不过是地址的拷贝,能够间接修改数组的内容 八、声明数组参数时不指定长度合法的缘由:函数不为数组分配内存,间接访问将调用数组元素 九、抽象数据类型(ADT)黑盒设计:模块具备功能说明和接口说明,模块用户不知道实现细节不能以任何方式访问模块 十、尾部递归要转换成一个简单的循环 十一、许多问题以递归的方式描述只是由于这样更加清晰,可是这些问题的迭代实现每每比递归实现效率更高 十二、可变参数列表(stdarg宏)使用方法:先定义一个va_list类型的变量,va_start(va_list类型的变量,数量)开始访问可变参数,va_arg(va_list类型的变量,类型名)能够依次读取变量,va_end(var_arg)结束访问 1三、以上这些宏没法判断实际存在的参数类型,这些宏没法判断每一个参数的类型,可变参数只能从第一个到最后一个依次进行访问 1四、数组名(首地址)是一个常量值,是不能被修改的 1五、2[array]与array[2]的做用相同 1六、当根据某个固定数目的增量在一个数组中移动时,使用指针变量将比使用下标产生效率更高的代码,当增量是1时,表现的更加突出 1七、每次函数调用数组时都会再一次初始化,因此说若是数组很大,定义成static只初始化,带来的效率提高是很可观的 1八、分辨初始化列表和字符串常量:当用于初始化一个字符数组时,它就是一个初始化列表,在其余任何地方,他都表示一个字符串常量 1九、int a[3][10]      a的类型:指向包含10个整型元素的数组的指针 20、多维数组做为参数void func(int (*mat)[10]);  或者  void func(int mat[][10]); 2一、不能是void func(int **mat);    这里把mat声明为指向整形指针的指针,与指向包含10个整型元素的数组的指针不是一回事 2二、sizeof数组名返回整个数组所占的字节数 2三、strlen返回一个size_t类型的值,是一个无符号整型 2四、memmove使用时有一个中间暂存区,因此说若是源和目标参数真的可能存在重叠,就应该使用memmove而不是memcpy 2五、strspn函数计算一个字符串的起始部分匹配一个指定字符集中任意字符的字符数,strcspn不匹配的字符数 2六、strtok函数把一个指定字符串分割成几个标记,注意将会修改它所处理的字符串 2七、strerror把一个错误代码做为参数,返回一个指针,指向一个描述错误的字符串 2八、若是想在多个源文件中使用同一种类型的结构,应把结构体的初始化放在一个头文件中 2九、结构体的自引用,不能引用结构能够引用结构体指针,且引用时结构类型名已经被定义 30、不完整声明,用于相互依赖结构,例:struct b;   而后结构b的指针已经能够被引用了 3一、在定义结构体时把较大的元素放在靠前的位置,这样能够节约存储空间。 3二、offsetof() stddef.h  结构为size_t类型的变量,表示这个指定成员开始存储位置距离开始存储位置偏移几个字节 3三、用结构体做为函数参数时应该传递结构体的指针而不是结构体自己 3四、联合变量能够被初始化,可是初始值必须是联合第一个成员的类型,且位于一对花括号中