C指针的定义
来源:互联网 发布:外国网络社交平台 编辑:程序博客网 时间:2024/05/16 15:59
【前言】
由于最近对函数指针的理解比较模糊,所有又重新学习了一把关于函数指针的知识,参考了很多书籍和网上的文章。现在本人进行一下分享和总结。本文的其实只是整理和总结别人现有的文章,作为备用参考文档。
【正文】
要理解一个C程序,仅仅理解组成该程序的符号是不够的。程序员还必须理解这些符号是如何组合成声明、表达式、语句和程序的。
我们先来看看下面的一个语句:
- ( *( void(*)())0)();
这是当计算机启动时,硬件将调用首地址为0位置的子例程。像这样的表达式恐怕会令每个C/C++程序员的内心都“不寒而栗”吧。然而,完全不用害怕,任何C变量的声明都是由两部分组成:类型以及一组类似表达式的声明符。最简单的声明变量,如:
- float f , g ;
- float ff();
- float *pf;
以上这些形式在声明中还可以组合起来,就像在表达式中进行组合一样,因此:
- float *g() , (*h)();
一旦我们知道了如何声明一个给定类型的变量,那么该类型的类型转换符就很容易得到了:只需要把声明中的变量名和声明末尾的分号去掉,再将剩余的部分用一个括号整个“封装”起来即可。例如:
- float (*h)();
- (float (*)())
那么,我们现在来看看前面我们提出的表达式:
- ( *( void(*)())0)();
- (*fp)();
我们将在分析的第二步来解决这个问题。如果C编译器能够理解我们大脑中对于类型的认识,那么我们可以这样写:
- (*0)()
如果fp是一个指向返回值为void类型的函数的指针,那么(*fp)()的值为void,fp的声明如下:
- viod (*fp)();
- (void (*)())0
- ( *( void(*)())0)();
- typedef void (*fp)();
- (*(fp)0)();
我们再来考虑signal库函数,一般情况下,程序员并不主动声明signal函数,而是直接使用头文件signal.h中的声明。那么,在头文件signal.h中,signal函数是如何声明的呢?
首先,让我们从用户定义的信号处理函数开始考虑,这无疑是最容易解决的。该函数可以定义如下:- void sigfunc(int n){
- /* 特定信号处理部分*/
- }
- void sigfunc(int );
- void (*sfp)(int);
- void (*signal(something))(int);
那么,signal函数的参数又是如何呢?signal函数接受两个参数:一个整型的信号编号,以及一个指向用户定义的信号处理函数的指针。我们此前一定定义了指向用户定义的信号处理函数的指针sfp:
- void (*sfp)(int);
- void (*signal(int,void(*)(int)))(int);
同样地,使用typedef可以简化上面的函数声明:
- typedef void (*HANDLER)(int);
- HANDLER signal(int , HANDLER);
- C指针的定义
- C 指针的定义
- C/C++,指针的定义和使用
- c语言函数指针的定义
- c指针的定义与使用总结
- 关于C语言各种指针的定义
- c语言函数指针的定义
- C-030.指针的定义和初始化
- C语言指针的基本定义
- 漫谈C指针第十七讲---定义函数的指针类型
- c语言指针定义
- 常用的C变量的定义方式:指针有关
- C语言指针1-定义
- C 指针阅读与定义
- C语言函数指针定义
- C语言中结构体指针的定义和引用
- 指针变量的定义和初始化[c][code]
- 函数指针数组和C变量的定义方式
- iOS - 操作文件目录的方法
- 常用业务主键生成器
- 常用正则表达式学习
- 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 - HDU 2191 dp
- 使用PagePhaseListener观察ADF生命周期的各个阶段
- C指针的定义
- 探cocos2dx粒子特效模块(particle_nodes),源码版本(2.2.3)
- 如何通过程序触发按钮上的Action事件?
- 小P的故事——神奇的饭卡
- APUE:一些函数
- 斗地主发牌小程序
- hdoj 1086 You can Solve a Geometry Problem too 【计算几何】
- 产品管理-需求篇——(Persona——Web人物角色介绍(转))
- TWaver Group共享网元