原创博客,转载请说明来源:http://blog.csdn.net/lizhihaoweiwei/article/details/16339353
如果有好的内容会不定期更新
1.const 指针 与 指针 const 与define指针
略过
可参见我的另一篇文章《C与指针摘记》
2.函数指针 & 较复杂的函数指针读法
typedef void (*PFUNC)();//一个简单的函数指针类型之 typedef
void (*signal (int signo,void (*func)(int))) (int);//UNIX信息机制中的 signal函数的声明
首先,signal 后面的括号优先级高于前面的 *,signal与括号结合,表示signal是一个函数,这个函数接受一个 int,一个 函数指针(void (*func)(int))作为参数,signal这个函数前面有一个 * ,表示 signal函数返回一个指针,这个指针再与前面的 void 和最后面的 (int)作用,这个 *先与 (int) 结合,表示这是一个指向函数的指针,最后与 void 结合,表示返回值是 void。
这个声明等价于:
typedef void Sigfunc(int);
Sigfunc *signal(int,Sigfunc *);//接受一个新的信号处理函数,将原来的信号处理函数返回以保存。
这样就明了多了。
3.函数指针调用有两种形式,一是直接通过函数指针,一是通过对函数指针取值
typedef void (*PFUNC)();
void say()
{
printf("hello world\r\n");
}
PFUNC pf = say;
PFUNC pf2 = (PFUNC)(&say);
pf();
(*pf)();
pf2();
(*pf2)();
上面的四种调用 say 函数都是正确的。只需要解释为什么
pf() 和 (*pf)()都能达到目的即可。有人说,编译器自动做了转换,这个理由我感觉有些弱,在这里我试图这样去解释。
pf 就是一个地址类型的变量,它里面存放了一个地址,指向代码区的某个代码块。
最符合逻辑的调用应该是 (*pf)();因为它去那个代码区取得到了目的代码然后执行,这个肯定是正确的!
其次,因为 pf 是一个函数指针的类型,指针的类型就告诉了编译器怎样去解析指针所指的内存区域的解析方式,所以编译器会知道应该把 pf 所指的区域当一个函数去解析。故也可以完成函数调用。
4.指针,数组转换
参考我的另一篇文章《指针,数组转换漫谈》