1、函数参数压栈的顺序
很多人都知道压栈的顺序时从右向左进行压栈,具体的可观测的结果如下程序运行。我们都知道Pascal的参数入栈顺序时自左向右的,但是为什么C语言会选择自右向左呢?这也是C语言比pascal高级的一个地方-C语言通过这种参数入栈的顺序实现了对变长参数函数的支持!
#include <stdio.h> int Add1(int a, int b) { printf("Add1\n"); return a+b; } int Add2(int a, int b) { printf("Add2\n"); return a+b; } int Add3(int a, int b) { printf("Add3\n"); return a+b; } int Func(int a, int b, int c) { return a+b+c; } int main() { int ans = Func(Add1(1,2),Add2(2,3),Add3(3,4)); return 0; }
运行结果如下图所示:
2、函数指针的使用
函数指针,顾名思义,就是指向一个函数的指针,通常来说,函数名就是一个函数指针。
下面我来展示一个程序来表示函数指针的使用,理解函数指针的用法和作用。该函数的功能就是输入命令实现加减乘除,但是是用函数指针的方式来实现,具体见代码。
#include <stdio.h> typedef double (*FUNCP)(double, double); double Add(double a, double b) { return a+b; } double Sub(double a, double b) { return a-b; } double Mul(double a, double b) { return a*b; } double Div(double a, double b) { return a/b; } FUNCP func[10]; char cmd[10][10]; int Find(char *op, int L) { int i; for(i=0; i<L; i++) { if(strcmp(op, cmd[i])==0) return i; } return -1; } int main() { func[0] = Add; strcpy(cmd[0], "Add"); func[1] = Sub; strcpy(cmd[1], "Sub"); func[2] = Mul; strcpy(cmd[2], "Mul"); func[3] = Div; strcpy(cmd[3], "Div"); double a,b; char op[10]; while(scanf("%s",op)!=EOF) { scanf("%lf%lf",&a,&b); int opId = Find(op,4); printf("%s %.2lf %.2lf = %.2lf\n",op, a, b, func[opId](a, b)); } return 0; }
程序运行结果:
函数指针最大的用处便是用于回调函数,通过定义一类函数类型的函数指针,然后将该类型的函数指针作为另外一个函数的参数,在这个函数内使用传进去的函数指针调用该指针指向的函数,实现相应的功能。
---------------------------------------------------------------------------------------
点击关注我的新浪微博:Sina weibo。
欢迎扫描关注微信公众账号:CodingRush,将不定时为您推送算法、编程等IT知识和人生感悟相关文章。