C語言函式呼叫時引數壓棧的順序以及函式指標的作用
阿新 • • 發佈:2019-01-25
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; }
程式執行結果:
函式指標最大的用處便是用於回撥函式,通過定義一類函式型別的函式指標,然後將該型別的函式指標作為另外一個函式的引數,在這個函式內使用傳進去的函式指標呼叫該指標指向的函式,實現相應的功能。
---------------------------------------------------------------------------------------
歡迎掃描關注微信公眾賬號:CodingRush,將不定時為您推送演算法、程式設計等IT知識和人生感悟相關文章。