“对外部(局部)变量的访问”是C语言函数指针的最大弱点
1、“对外部(局部)变量的访问”是C语言函数指针的最大弱点 。
#include <stdio.h>
#include <stdlib.h>
/* 结构体定义 */
struct node {
struct node *next;
int val;
}; /* 函数指针类型 */
typedef void (*func_t)(int); /* 循环用函数 */
void foreach(struct node *list,func_t func) {
while(list) {
func(list->val);
list=list->next;
}
} /* 循环主体函数 */
void f(int n) {
printf("node(?)=%d\n",n);
} /* main函数 */
void main() {
// struct node *list =0,*l;
struct node *list,*l;
int i; /* 准备开始 */
/* 创建链表 */
for(i=0; i<4; i++) {
l=malloc(sizeof(struct node));
l->val = i;
l->next=i;
list=l;
} /* 例题主体 */
i=0;
l=list;
/* while循环 */
while(l) {
printf("node(%d) = %d\n",i++,l->val);
l=l->next;
}
/* foreach循环 */
foreach(list,f);
}
(上边代码有问题)
2、我们已经了解了C语言提供的函数指针的缺点,于是,为了克服这些缺点而出现的功能,就是本次的主题----闭包。
function foreach(list, func) {
while (list) {
func(list.val);
list = list.next;
}
}
var list = null;
for (var i = 0; i < 4; i++) {
list = {
var: i,
next: list
};
}
var i = 0;
foreach(list,
function(n) {
console.log("node(" + i + ") - " + n);
i++
});
上边代码有问题
function extent() {
var n = 0;
return function() {
n++;
console.log("n=" + n);
}
}
f = extent();
f();
f();
f();
闭包2个术语:
作用域scope 变量的有效范围,摸个变量可以被访问的范围
生命周期extent 变量的寿命,一个变量可以在多长的周期范围内存在并被能够访问
extent()执行后会返回函数对象,我们将其赋值给一个变量。这个函数变量在每次被执行时,局部变量就会被更新,从而输出逐次累加的结果。
局部变量
page 88
《代码的未来》
“对外部(局部)变量的访问”是C语言函数指针的最大弱点的更多相关文章
- C#委托与C语言函数指针及函数指针数组
C#委托与C语言函数指针及函数指针数组 在使用C#时总会为委托而感到疑惑,但现在总新温习了一遍C语言后,才真正理解的委托. 其实委托就类似于C/C++里的函数指针,在函数传参时传递的是函数指针,在调用 ...
- C语言函数指针(转载)
二.通常的函数调用 一个通常的函数调用的例子:/* 自行包含头文件 */void MyFun(int x); /* 此处的声明也可写成:void MyFun(int) */int main(int a ...
- C语言函数指针基础
本文写的非常详细,因为我想为初学者建立一个意识模型,来帮助他们理解函数指针的语法和基础.如果你不讨厌事无巨细,请尽情阅读吧. 函数指针虽然在语法上让人有些迷惑,但不失为一种有趣而强大的工具.本文将从C ...
- C语言函数指针 和 OC-Block
C语言函数指针 和 OC-Block 一. C语言函数指针 关于函数指针的知识详细可参考:http://www.cnblogs.com/mjios/archive/2013/03/19/2967037 ...
- C语言函数指针变量和指针函数以及指针数组
C语言中,一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址.我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使该指针变量指向该函数.然后通过指针变量就可以找到并调用这 ...
- C语言函数指针实验
上次看Atmel的示例工程,发现人家使用了函数指针的结构体(函数指针结构体).感叹人家的C语言功夫审核,自己费劲还是只能读懂的份.不过,函数指针确实好用.今天就试试这个超牛的东西.Now let's ...
- c语言函数指针的理解与使用
1.函数指针的定义 顾名思义,函数指针就是函数的指针.它是一个指针,指向一个函数.看例子: A) char * (*fun1)(char * p1,char * p2); B) char * *fun ...
- C语言 函数指针一(函数指针的定义)
//函数指针 #include<stdio.h> #include<stdlib.h> #include<string.h> //函数指针类型跟数组类型非常相似 / ...
- 深入理解C语言函数指针(转)
本文转自:http://www.cnblogs.com/windlaughing/archive/2013/04/10/3012012.html 示例1: void myFun(int x); //声 ...
随机推荐
- intellij idea (Android studio )外部程序 打开某扩展名(格式)
最近在为项目开发写思维导图, 为了留下思考的过程和业务逻辑. 本人使用的工具是很可怜的freemind,所以“脑图”的扩展名是“.mm” 情景: 在intellij idea (Android stu ...
- 记一次性能优化,限制tcp_timewait数量,快速回收和重用
前言 这篇文章的主题是记录一次Python程序的性能优化,在优化的过程中遇到的问题,以及如何去解决的.为大家提供一个优化的思路,首先要声明的一点是,我的方式不是唯一的,大家在性能优化之路上遇到的问题都 ...
- Python进度条小实例
代码理解: 函数view_bar(num,total) num是一个随即数,total是总数( num / total ) * 的int类型可以计算百分比 '\r%d%%%s' % (rate_num ...
- 【Tomcat】Servlet 工作原理解析
Web 技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 Java Web 技术的核心基础.因而掌握 Servlet 的工作原理是成为一名合格的 Java Web 技术开发人员的 ...
- 【Linux高级驱动】I2C驱动框架分析
1.i2c-dev.c(i2c设备驱动组件层) 功能:1)给用户提供接口 i2c_dev_init //入口函数 /*申请主设备号*/ register_chrdev(I2C_MAJOR(), &q ...
- idea svn 不见的问题
问题一: IntelliJ IDEA打开带SVN信息的项目不显示SVN信息,项目右键SVN以及图标还有Changes都不显示解决方法 在VCS菜单中有个开关,叫Enabled Version Cont ...
- const读书笔记
Const 的使用读书笔记 Const的主要主要用法有: 常变量: const 类型说明符 变量名 常引用: const 类型说明符 &引用名 常对象: 类名 const 对象名 常成员函数 ...
- 用OpenGL实现动态的立体时钟
(在学期末做的图形学课程设计,特将学习心得整理如下) 一.设计思路 1,设计一个平面的时钟: 按照 钟面——>中心点——>刻度——>时针——>分针——>秒针 的顺序绘制. ...
- oracle 11G rac 11.2.0.1 打补丁9413827
这是升级到以后11.2.0.2.11.2.0.3.11.2.0.4的基础 主要参考两篇文章: Upgrade_11.2.0.1_GI_CRS_to_11.2.0.2_in_Linux.PDF文件 ht ...
- Java ThreadPool的正确打开方式花钱的年华 | 江南白衣(5星推荐)
线程池应对于突然增大.来不及处理的请求,无非两种应对方式: 将未完成的请求放在队列里等待 临时增加处理线程,等高峰回落后再结束临时线程 JDK的Executors.newFixedPool() 和ne ...