C陷阱和缺陷,必须知道的495个C语言问题

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,在定义函数式的宏的时候:宏扩展必须使用括号,以便保护表达式中低优先级的操作符;在宏定义内部,所有参数的出现必须用括号括起来,以便保护实参中任何低优先级的操作符不受宏扩展的其他部分影响。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值