指针高级

原创博客,转载请说明来源: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.指针,数组转换

参考我的另一篇文章《指针,数组转换漫谈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值