[关闭]
@pnck 2015-11-01T14:28:20.000000Z 字数 3426 阅读 3033

编程语言的精髓:function

presentation


  1. #include <stdio.h>
  2. int f(int x); //数学卷子上写的最多的函数名:f(x)
  3. int main(int argc, char *argv[])
  4. {
  5. int x,num;
  6. scanf("%d",&num);//最大
  7. while(x++<num)
  8. {
  9. printf("%d ",f(x));//依次计算x项的值
  10. }
  11. putchar(10);
  12. return 0;
  13. }
  14. int f(int x) //计算fibonacci数列第x项的值
  15. {
  16. if(x==1||x==2)//边界条件:当前这层f(x)的x已到达1或者2
  17. return 1;//那么不再继续调用自己,而是直接返回
  18. else return f(x-1) + f(x-2);//调用自己:在下一个“自己”到达边界之前都会继续调用自己,而不会返回
  19. //当最里层的f(x),x==1||x==2的时候(边界条件)才开始返回
  20. //最里层的函数返回之后之外所有层的函数都会依次返回
  21. }

  1. //program1
  2. #include <stdio.h>
  3. #include <memory.h>
  4. void prog1_func(void *p)
  5. {
  6. void (*pPUTS)(char*) = p;
  7. char str[] = {"prog1_func"};
  8. pPUTS(str);
  9. }
  10. int main()
  11. {
  12. char buff[1024];
  13. FILE *fp = fopen("a.r","wb");
  14. memcpy(buff,prog1_func,1024);//关键点
  15. fwrite(buff,1024,1,fp);//写入文件
  16. fclose(fp);
  17. }
  1. //program2
  2. #include <stdio.h>
  3. #include <memory.h>
  4. int main()
  5. {
  6. char buff[1024];
  7. FILE *fp = fopen("a.r","rb");
  8. fread(buff,1024,1,fp);//读
  9. fclose(fp);
  10. void (*pfunc)(void*) = (void*)buff;//这行将数组转为函数
  11. pfunc(puts);//调用原本是数组的函数
  12. }

回顾一下我都讲了些啥:

  1. 为什么function被翻译成“函数”;更高级更抽象的语言称之为method(方法)
  2. 函数有什么用
    1. 让z神找了一段汇编
    2. 程序跟学校院系一样,有结构
    3. 不同的人写不同的功能部分,完成同一个程序
  3. 库函数,展示了一下/usr/include里一堆.h头文件,只需了解用法就能在任何程序里直接拿来用
  4. 找人上来写了一个max()函数返回两个数里比较大的(讲函数定义)
  5. 讲了一下使用函数的方法,告诉大家不要听上课讲的形式参数实际参数,只需记住定义和调用的格式就够了
  6. 大写版的#define MAX(a,b)
  7. 黑科技1:函数生成器(自命名),“精通C语言的程度”
  8. 堆栈:一句话:后入先出的一种结构
  9. 函数嵌套调用的过程,与堆栈一致
  10. 两叠纸比喻了好久……还撕坏了别人的作业……讨论函数在进入和离开的时候占用的空间该由谁清理,为什么只有调用者清理空间才能实现printf这种可变参数的函数
  11. 参数传递,说明传递地址和传递值的区别(我要告诉你一个秘密,写在纸上把纸给你和直接告诉你有什么区别),为什么想要修改函数外的变量的值只能通过传递地址的方式
  12. 返回值的作用,main函数return 233这个数,并在命令行终端中见到了,返回0是约定俗成,出错的命令(command not found)返回了127
  13. 递归适用条件:问题能分解成相似的子问题(略了)
  14. 写函数递归的两个要点:调用自己和边界条件(略了)
  15. 黑科技2,把程序1的函数二进制代码存起来,在程序2里读入并成功执行,如果把存下来的二进制文件删掉,程序2出错,程序2从头到位没定义过任何函数,但却能执行不属于它而属于程序1的函数(没人看懂唉)

  1. #include <stdio.h>
  2. //“函数生成器”
  3. #define decl_typed_mul(TYPE) TYPE typed_mul_##TYPE(TYPE v1,TYPE v2) {return v1*v2;}
  4. //“函数调用器”
  5. #define call_typed_mul(TYPE,v1,v2) typed_mul_##TYPE(v1,v2)
  6. decl_typed_mul(int);
  7. /*
  8. 上面这行将被替换成:
  9. int typed_mul_int(int v1,int v2) {return v1*v2;} <-注意这是一个完整的函数定义,写成了一行
  10. (就是把int换到了TYPE的位置,##是用来连接的)
  11. */
  12. decl_typed_mul(double)
  13. //double typed_mul_double(double v1,double v2) {return v1*v2;}
  14. //同样是一个完整的函数定义
  15. int main()
  16. {
  17. printf("int type mul: %d\n",call_typed_mul(int,10,2));
  18. //call_typed_mul(int,10,2)被替换为
  19. //typed_mul_int(10,2)
  20. //相当于调用了第一个生成的函数
  21. printf("double type mul: %lf\n",call_typed_mul(double,1.2,3.5));
  22. //typed_mul_double(1.2,3.5)
  23. //调用了第二个生成的函数
  24. }


[1] 这段代码差不多
[2] 声明是告诉其它的代码部分,有这么一个函数,它是这样的,并不说明实现的细节;而函数的定义包含了整个函数完整的实现的部分,也就是function(){这些部分}。我们在使用函数的时候最关心“怎么用”,说明“怎么用”就是声明的意义
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注