@pnck
2015-11-01T06:28:20.000000Z
字数 3426
阅读 3376
presentation
返回值类型 函数名(参数类型1 参1,参数类型2 参2){实现}函数名(参数1,参数2...)形参和实参,上面3行就足够了#define MAX(v1,v2) v1>v2 ? v1:v2,使用方法与int max(int v1,int v2)这个真正函数完全相同 将一些字替换成另一些字MAX(10,5)替换成10>5 ? 10:5主函数->函数1->函数2;从函数2返回:函数2->函数1->主函数 --> 函数2最后进入,最先退出
#include <stdio.h>int f(int x); //数学卷子上写的最多的函数名:f(x)int main(int argc, char *argv[]){int x,num;scanf("%d",&num);//最大while(x++<num){printf("%d ",f(x));//依次计算x项的值}putchar(10);return 0;}int f(int x) //计算fibonacci数列第x项的值{if(x==1||x==2)//边界条件:当前这层f(x)的x已到达1或者2return 1;//那么不再继续调用自己,而是直接返回else return f(x-1) + f(x-2);//调用自己:在下一个“自己”到达边界之前都会继续调用自己,而不会返回//当最里层的f(x),x==1||x==2的时候(边界条件)才开始返回//最里层的函数返回之后之外所有层的函数都会依次返回}
//program1#include <stdio.h>#include <memory.h>void prog1_func(void *p){void (*pPUTS)(char*) = p;char str[] = {"prog1_func"};pPUTS(str);}int main(){char buff[1024];FILE *fp = fopen("a.r","wb");memcpy(buff,prog1_func,1024);//关键点fwrite(buff,1024,1,fp);//写入文件fclose(fp);}
//program2#include <stdio.h>#include <memory.h>int main(){char buff[1024];FILE *fp = fopen("a.r","rb");fread(buff,1024,1,fp);//读fclose(fp);void (*pfunc)(void*) = (void*)buff;//这行将数组转为函数pfunc(puts);//调用原本是数组的函数}
形式参数和实际参数,只需记住定义和调用的格式就够了后入先出的一种结构
#include <stdio.h>//“函数生成器”#define decl_typed_mul(TYPE) TYPE typed_mul_##TYPE(TYPE v1,TYPE v2) {return v1*v2;}//“函数调用器”#define call_typed_mul(TYPE,v1,v2) typed_mul_##TYPE(v1,v2)decl_typed_mul(int);/*上面这行将被替换成:int typed_mul_int(int v1,int v2) {return v1*v2;} <-注意这是一个完整的函数定义,写成了一行(就是把int换到了TYPE的位置,##是用来连接的)*/decl_typed_mul(double)//double typed_mul_double(double v1,double v2) {return v1*v2;}//同样是一个完整的函数定义int main(){printf("int type mul: %d\n",call_typed_mul(int,10,2));//call_typed_mul(int,10,2)被替换为//typed_mul_int(10,2)//相当于调用了第一个生成的函数printf("double type mul: %lf\n",call_typed_mul(double,1.2,3.5));//typed_mul_double(1.2,3.5)//调用了第二个生成的函数}