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. android sdk屏幕截图工具

    调用android sdk中的工具,在开发板上截图. 使用usb线连接android设备,打开adb调试. 进入目录 sdk/tools/ 运行 traceview.bat 运行 uiautomato ...

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

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

  3. mulitp request

    1.设置cookie 2.设置header 3.通过requst.getInputStream(); 4.通过request.getsession();

  4. 理解javascript函数调用和“this”

    http://blog.csdn.net/littlechang/article/details/8180550

  5. Hive将txt、csv等文本文件导入hive表

    1.将txt文本文件放置hdfs目录下 2.登录hive并进入到指定数据库 3.创建表 create external table if not exists fun_user_external ( ...

  6. iOS开发之--NSData与UIImage之间的转换

    //NSData转换为UIImage NSData *imageData = [NSData dataWithContentsOfFile: imagePath]; UIImage *image = ...

  7. .Net CCNet C#6.0 自动化编译问题解决

    一.问题描述 由于C#6.0一些新的语法特性,导致先前部署的CCNet持续集成平台出现问题,无论是手动还是命令行均不能编译.   二.解决方案 1.下载BuildTools_Full.exe,地址:h ...

  8. IOS开发学习笔记039-autolayout 代码实现

    本文转载至 http://www.cnblogs.com/songliquan/p/4548206.html 1.代码实现比较复杂 代码实现Autolayout的步骤 利用NSLayoutConstr ...

  9. git练习

    git commit 提交记录 git branch <branch_name> 建立名为branch_name的分支 git checkout <name>:git comm ...

  10. 第九讲 C#练习题

    1.接收一个整数N 如果N是正数就输出1·N 如果是负数就提示出错输出 由丰老师提供 -_-~ 2.编一个程序,从三个红球,五个白球,六个黑球中任意取出八个球,且其中必须有白球,输出所有可能的方案. ...