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. Linux - Windows10连接linux服务器

    当我们通过windows连接服务器时,大多数用的是ssh客户端软件,推荐使用ssh,安全系数比较高.下面介绍用telnet连接服务器. 客户端:C:\Users\dell>systeminfo主 ...

  2. TensorFlow基础笔记(6) 图像风格化实验

    参考 http://blog.csdn.net/wspba/article/details/53994649 https://www.ctolib.com/AdaIN-style.html Ackno ...

  3. GIMP 使用

    在更改uboot启动logo的时候,需要P图,使用了linux的gimp.本文记录如何更改图片大小以及居中显示. 设置画布大小 在图片中右键 image -> Canvas Size 图片居中 ...

  4. 开源 java CMS - FreeCMS2.2 建站向导

    项目地址:http://www.freeteam.cn/ 建站向导 为了方便用户创建网站,系统提供了建站向导功能. 从左側管理菜单点击建站向导进入. 第一步:创建网站 能够直接设置所属的父网站.填写相 ...

  5. git 怎么看某个commit 修改的代码

    详细的更改: git show commitid 只列出文件名:git show --pretty="format:" --name-only commitid 转自: http: ...

  6. linux基础教程---内容操作

    一.寻找文件里的指定内容 寻找文件里的指定内容,输出内容所在行的所有信息 grep    被搜索内容    文件路径名 >grep     var       passwd       //在 ...

  7. mysql解决乱码问题

    进入mysql(mysql -u root -p),查看当前数据库字符集(status;) 刚开始是latin1,所以乱码. vim /etc/my.cnf 两个节点添加如下: [client]def ...

  8. 数据降维PCA——学习笔记

    PCA主成分分析 无监督学习 使方差(数据离散量)最大,更易于分类. 可以对隐私数据PCA,数据加密. 基变换 投影->内积 基变换 正交的基,两个向量垂直(内积为0,线性无关) 先将基化成各维 ...

  9. Linux环境下Apache配置多个虚拟主机挂载多站点同时运行

    博客地址: http://blog.csdn.net/ClydeKuo/article/details/69569474 这篇博客讲的很详细,很详细.

  10. [4] 算法之路 - 插入排序之Shell间隔与Sedgewick间隔

    题目 插入排序法由未排序的后半部前端取出一个值.插入已排序前半部的适当位置.概念简单但速度不快. 排序要加快的基本原则之中的一个: 是让后一次的排序进行时,尽量利用前一次排序后的结果,以加快排序的速度 ...