C的指针疑惑:C和指针13(高级指针话题)上
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(高级指针话题)上的更多相关文章
- C的指针疑惑:C和指针13(高级指针话题)
传递命令行参数 C程序的main函数具有两个形参.第一个通常称为argc,代表命令行参数的数目. 第二个通常称为argv,它指向一组参数值.由于参数的数目并没有内在的限制,所以argv指向这组参数值( ...
- C的指针疑惑:C和指针8数组
]; ]; 上面申明两个数组,不能进行以下赋值 b = a; 你不能使用赋值符把一个数组的所有元素复制给另一个数组,必须使用一个循环,每次复制一个元素 数组和指针 ]; int *b; 声明一个数组, ...
- 【C语言】14-返回指针的函数与指向函数的指针
前言 前面我们花了接近3个章节学习指针,应该都感受到指针的强大了吧.指针可以根据地址直接操作内存中的数据,使用得当的话,不仅能使代码量变少,还能优化内存管理.提升程序性能.关于指针的内容还非常多,比如 ...
- 【C语言】-返回指针的函数与指向函数的指针
本文目录 前言 一.返回指针的函数 二.指向函数的指针 说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能够快速上手C语言.如果你还没有编程经验,或者对C语言.i ...
- 《征服 C 指针》摘录3:数组 与 指针
一.数组 和 指针 的微妙关系 数组 是指将固定个数.相同类型的变量排列起来的对象. 正如之前说明的那样,给指针加 N,指针前进“当前指针指向的变量类型的长度 X N”. 因此,给指向数组的某个元素的 ...
- 《征服 C 指针》摘录4:函数 与 指针
一.指向函数的指针 函数名可以在表达式中被解读成“指向函数的指针”,因此,正如代码清单 2-2 的实验那样,写成 func 就可以取得指向函数的指针. “指向函数的指针”本质上也是指针(地址),所以可 ...
- 联合与枚举 、 高级指针 、 C语言标准库(一)
1 输入一个整数,求春夏秋冬 1.1 问题 在实际应用中,有的变量只有几种可能取值.如人的性别只有两种可能取值,星期只有七种可能取值.在 C 语言中对这样取值比较特殊的变量可以定义为枚举类型.所谓枚举 ...
- 你好,C++(40)7.1 一切指针都是纸老虎:彻底理解指针
第7章 C++世界的奇人异事 在武侠小说中,初入武林的毛头小子总是要遇到几位奇人,发生几件异事,经过高人的指点,经历一番磨炼,方能武功精进,从新手成长为高手.在C++世界,同样有诸多的奇人异事.在C+ ...
- 不要伤害指针(5)--void和void指针详解
原文转载地址:http://blog.csdn.net/sunchaoenter/article/details/6587426 增加自己的想法,作为笔记. 1.概述 许多初学者对C/C++语言中的v ...
随机推荐
- 很多人都不知道的监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法
版权声明:本文为博主原创文章,未经博主允许不得转载. 在实际的应用中,我们常常需要实现在移动app和浏览器中点击返回.后退.上一页等按钮实现自己的关闭页面.调整到指定页面或执行一些其它操作的 需求,那 ...
- Yii2.0实现微信公众号后台开发
接入微信 Yii2后台配置 1.在app/config/params.php中配置token参数 return [ //微信接入 'wechat' =>[ 'token' => 'your ...
- JavaScript的arguements
---恢复内容开始--- arguments 对象 在函数代码中,使用特殊对象 arguments,开发者无需明确指出参数名,就能访问它们. 例如,在函数 sayHi() 中,第一个参数是 messa ...
- Ubantu apt source 国内
位置 /etc/apt/sources.list apt-get update deb http://mirrors.163.com/ubuntu/ precise main restricted u ...
- C#中文件和byte[]互换问题
如何将图片和声音转化成byte[],并通过webservice进行传输? 如何将webservice传输过来的byte[],转化成我们想要的文件? (一)文件转化为byte[] 方法 ...
- Spark源代码阅读笔记之MetadataCleaner
MetadataCleaner执行定时任务周期性的清理元数据(metadata),有6种类型的元数据:MAP_OUTPUT_TRACKER.executor跟踪各个map任务输出的存储位置的数据,依据 ...
- php求数学对数
php的对数函数并不是很强大 有自然对数 有10的对数的函数,不过没有自定义底的对数函数,所以自己写了一个 <?php function xsqrt($x, $value) { $count = ...
- git与sourceTree
Window:http://my.oschina.net/lunqi/blog/500881?fromerr=bzaPk1Lx MAC:http://www.ithao123.cn/content-8 ...
- webpack配置(一)
这里再配置的时候走了些弯路,现在,把配置前的准备工作做好很重要: 首先,安装node.js,当然,npm也就有了: 其次,安装xampp,主要是为了配置Apache: 安装好后,xampp---htd ...
- 以打字形式展示placeholder的插件
http://weber.pub/以打字形式展示placeholder的插件/197.html