1. 程式人生 > >C語言函式呼叫時引數壓棧的順序以及函式指標的作用

C語言函式呼叫時引數壓棧的順序以及函式指標的作用

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知識和人生感悟相關文章。