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;
}

运行结果如下图所示:

C语言函数调用时参数压栈的顺序以及函数指针的作用_第1张图片


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;
}

程序运行结果:

C语言函数调用时参数压栈的顺序以及函数指针的作用_第2张图片

函数指针最大的用处便是用于回调函数,通过定义一类函数类型的函数指针,然后将该类型的函数指针作为另外一个函数的参数,在这个函数内使用传进去的函数指针调用该指针指向的函数,实现相应的功能。

---------------------------------------------------------------------------------------

点击关注我的新浪微博:Sina weibo

欢迎扫描关注微信公众账号:CodingRush,将不定时为您推送算法、编程等IT知识和人生感悟相关文章。

     C语言函数调用时参数压栈的顺序以及函数指针的作用_第3张图片

你可能感兴趣的:(c,cmd,语言,div,pascal)