zoukankan      html  css  js  c++  java
  • “对外部(局部)变量的访问”是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);
    }
    
    /* 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
    ",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

    《代码的未来》

  • 相关阅读:
    Python文件的两种用途
    模块的搜索路径
    循环导入问题
    import和from...import
    模块的四种形式
    函数小结
    面向过程编程
    内置函数
    匿名函数
    递归
  • 原文地址:https://www.cnblogs.com/rsapaper/p/10494904.html
Copyright © 2011-2022 走看看