C陷阱和缺陷
1,将常数0转型为“指向返回值为void的函数的指针”类型:(void (*)())0
2,宏定义不要忽视空格
必须知道的495个C语言问题
1,typedef int (*funcptr)();意思是定义了一个类型funcptr,表示指向返回值为int型(参数未指明)的函数的指针。它可以用来声明一个或多个函数指针。
2,如何声明返回指向同类型函数的指针的函数?即函数指针返回一个函数指针;设计一个状态机,用函数表示每种状态,每个函数都会返回一个指向下一个状态的函数的指针。
不能直接完成这个任务:一种方法是让函数返回一个一般的函数指针,然后在传递这个指针的时候进行适当的类型转换
typedef int (*funcptr) ();//一般的函数指针
typedef funcptr (*ptrfuncptr) ();//指向函数返回的函数指针
funcptr start(),stop(); funcptr state1(),state2(),state3();
void statemachine()
{
ptrfuncptr state=start;
while(state!=stop)
{
state=(ptrfuncptr)(*state)();
}
}
funcptr start(){ return (funcptr) state1;}
第二个类型定义ptrfuncptr隐藏了一些十分隐晦的语法。如果没有这个定义,变量必须声明为(funcptr)(*state)(),而调用的时候就得用(funcptr(*)())(*state)()
3,函数调用只能出现在自动变量(即局部非静态变量)的初始式中。
4,右值既不能赋值,也不能自增。void *指针只能保存对象(数据)指针,将函数指针转换为void*是不可移植的。所有的函数指针类型都可以相互转换,只要在调用前转回
正确的类型即可,因此,可以使用任何函数类型(int (*) ())或void (*) () 即未指明参数,返回类型int或void的函数。
5,数组是一个由同一类型的连续元素组成的预先分配的内存块,指针是一个对任何位置的(特定类型的)数据元素的引用。数组自动分配空间但不能重分配或改变大小。指针必须被赋值以指向分配空间
可以使用malloc但是可以随意重新赋值指向不同对象。
6,数组和下标可以互换。
7,动态的分配多维数组:分配一个指针数组,然后把每个指针初始化为动态分配的“行”;for循环
8,多数malloc/free的实现并不把释放的内存返回操作系统,而是留着供同一程序的后续malloc使用。
9,在定义函数式的宏的时候:宏扩展必须使用括号,以便保护表达式中低优先级的操作符;在宏定义内部,所有参数的出现必须用括号括起来,以便保护实参中任何低优先级的操作符不受宏扩展的其他部分影响。
C陷阱和缺陷,必须知道的495个C语言问题
最新推荐文章于 2023-01-06 14:38:11 发布