@pnck
2015-11-01T14:28:20.000000Z
字数 3426
阅读 3033
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或者2
return 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)
//调用了第二个生成的函数
}