int *f();

f为一个函数,返回值类型是一个指向整形的指针。

int (*f)();

两对括号,第二对括号是函数调用操作符,但第一对括号只起到聚组的作用。

f为一个函数指针,它所指向的函数返回一个整型值。

int *(*f)();

f是一个函数指针,指向的函数返回值是一个整形指针。

int *f[]

下标的优先级更高,所以f是一个数组,元素类型是指向整形的指针。

int (*f[]) ();

这里有两对括号,第一对括号的表达式*f[]首先进行求值。f是一个元素为某种类型的指针的数组。第二对括号是函数调用操作符。总结:f是一个数组,数组元素的类型是函数指针,它所指向的函数的返回值是一个整型值。

int (*f)(int,float);
int *(*g[])(int,float);

第一个,f是一个函数指针,所指向的函数接受两个参数。并返回一个整形。

第二个,g位一个数组,数组的元素类型是一个函数指针。它所指向的函数接受两个参数,并返回一个整形指针。

函数指针

注意:简单声明一个函数指针并不意味着它马上就可以使用。对函数指针执行间接访问之前必须把它初始化为指向某个函数。

int f(int);
int (*pf)(int) = &f;

注意:初始化表达式中的&操作符是可选的,因为函数名被使用时总是由编译器把它转换为函数指针。&操作符只是显式地说明了编译器将隐式执行的任务。

int ans;
ans = f();
ans = (*pf)();
ans = pf();

第一条语句使用名字调用函数f,但它的执行过程中可能和你想象的不太一样。函数名f首先被转换为一个函数指针,该指针指定函数在内存中的位置。

第二条语句:对pf执行间接访问操作,它把函数指针转换为一个函数名。

第三条语句和前面两条语句的效果是一样的。间接访问操作并非必需,因为编译器需要的是一个函数指针

 函数指针的应用举例:

Node * search_list(Node *node,void const *value,int (*compare)(void const *,void const *))
{
while(node != NULL)
{
if(compare(&node->value,value) == )
break;
node = node->link;
}
return node;
} int compare_ints(void const *a,void const *b)
{
if(*(int *)a == *(int *)b)
return ;
else
return ;
}

上面函数使用:

desired_node = search_list(root,&desired_value,compare_ints);

函数指针数组:声明并初始化一个函数指针数组。唯一需留心之处就是确保这些函数的原型出现在这个数组的声明之前。

double add(double,double);
double sub(double,double);
double mul(double,double);
double div(double,double); double (*oper_func[])(double,double) = {
add,sub,mul,div,...
};

初始化列表中各个函数名的正确顺序取决于程序中用于表示每个操作符的整形代码。这个例子中ADD是0,SUB是1,MUL是2.

调用操作

result = oper_func[oper](op1,op2);

C的指针疑惑:C和指针13(高级指针话题)上的更多相关文章

  1. C的指针疑惑:C和指针13(高级指针话题)

    传递命令行参数 C程序的main函数具有两个形参.第一个通常称为argc,代表命令行参数的数目. 第二个通常称为argv,它指向一组参数值.由于参数的数目并没有内在的限制,所以argv指向这组参数值( ...

  2. C的指针疑惑:C和指针8数组

    ]; ]; 上面申明两个数组,不能进行以下赋值 b = a; 你不能使用赋值符把一个数组的所有元素复制给另一个数组,必须使用一个循环,每次复制一个元素 数组和指针 ]; int *b; 声明一个数组, ...

  3. 【C语言】14-返回指针的函数与指向函数的指针

    前言 前面我们花了接近3个章节学习指针,应该都感受到指针的强大了吧.指针可以根据地址直接操作内存中的数据,使用得当的话,不仅能使代码量变少,还能优化内存管理.提升程序性能.关于指针的内容还非常多,比如 ...

  4. 【C语言】-返回指针的函数与指向函数的指针

    本文目录 前言 一.返回指针的函数 二.指向函数的指针 说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能够快速上手C语言.如果你还没有编程经验,或者对C语言.i ...

  5. 《征服 C 指针》摘录3:数组 与 指针

    一.数组 和 指针 的微妙关系 数组 是指将固定个数.相同类型的变量排列起来的对象. 正如之前说明的那样,给指针加 N,指针前进“当前指针指向的变量类型的长度 X N”. 因此,给指向数组的某个元素的 ...

  6. 《征服 C 指针》摘录4:函数 与 指针

    一.指向函数的指针 函数名可以在表达式中被解读成“指向函数的指针”,因此,正如代码清单 2-2 的实验那样,写成 func 就可以取得指向函数的指针. “指向函数的指针”本质上也是指针(地址),所以可 ...

  7. 联合与枚举 、 高级指针 、 C语言标准库(一)

    1 输入一个整数,求春夏秋冬 1.1 问题 在实际应用中,有的变量只有几种可能取值.如人的性别只有两种可能取值,星期只有七种可能取值.在 C 语言中对这样取值比较特殊的变量可以定义为枚举类型.所谓枚举 ...

  8. 你好,C++(40)7.1 一切指针都是纸老虎:彻底理解指针

    第7章 C++世界的奇人异事 在武侠小说中,初入武林的毛头小子总是要遇到几位奇人,发生几件异事,经过高人的指点,经历一番磨炼,方能武功精进,从新手成长为高手.在C++世界,同样有诸多的奇人异事.在C+ ...

  9. 不要伤害指针(5)--void和void指针详解

    原文转载地址:http://blog.csdn.net/sunchaoenter/article/details/6587426 增加自己的想法,作为笔记. 1.概述 许多初学者对C/C++语言中的v ...

随机推荐

  1. Spring Cloud体系介绍

    上图只是Spring Cloud体系的一部分,Spring Cloud共集成了19个子项目,里面都包含一个或者多个第三方的组件或者框架! Spring Cloud 工具框架 1.Spring Clou ...

  2. SSH三大框架的知识题

    Struts 谈谈你对Struts的理解. 答: 1.struts是一个按MVC模式设计的Web层框架,其实它就是一个大大的servlet,这个Servlet名为ActionServlet,或是Act ...

  3. c/c++学习之c++ 中的list <>容器

    http://blog.csdn.net/mazidao2008/article/details/4802617 push 实例化 即添加 http://www.cnblogs.com/BeyondA ...

  4. 【NOIP模拟题】Incr(dp)

    太水的dp没啥好说的.. #include <cstdio> #include <cstring> #include <cmath> #include <st ...

  5. 【BZOJ】1641: [Usaco2007 Nov]Cow Hurdles 奶牛跨栏(floyd)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1641 这种水题无意义... #include <cstdio> #include < ...

  6. commit命令

    git commit -m "测试提交"

  7. JAVA 并发编程-多个线程之间共享数据(六)

    多线程共享数据的方式: 1.假设每一个线程运行的代码同样.能够使用同一个Runnable对象,这个Runnable对象中有那个共享数据,比如,卖票系统就能够这么做. 2,假设每一个线程运行的代码不同. ...

  8. Amazon(iam)IAM用户启用MFA

    1.1 下载MFA软件 我这里选择Google的Authenticator 1.2 进入IAM 搜索IAM,点击进入 1.3 选择需要设置MFA的用户 1.4 选择安全证书 1.5 管理MFA设置 这 ...

  9. MyEclipse10.6 安装SVN插件方法及插件下载地址

        今天MyEclipse10.6出了点问题,所以重装了它,同一时候也把svn的插件重装了一次,把网上资源和自己的经历顺便在博客这里记录一下.建议直接看方法一好了,简单方便,不必要折腾太多. 下来 ...

  10. ios开发之--CGRect/CGSize/CGPoint/CGVector/CGAffineTransform/UIEdgeInsets/UIOffset和NSString之间的转换

    仅做记录,一个函数和字符串之间的互相转换 方法如下: UIKIT_EXTERN NSString *NSStringFromCGPoint(CGPoint point); UIKIT_EXTERN N ...