指针函数与函数指针的区别

1、指针函数:是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针

类型标识符  *函数名(参数表)

int *fun(x,y);

首先它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同一类型的指针变量来接收。也就是说指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。

(1)、定义指针函数的一般形式如下:

类型名  *函数名(参数);

例如:

int *fun(int a);
int *p;
p =fun(a);

2、函数指针:函数指针是指向函数的指针变量,即本质是一个指针变量。

(1)、什么是函数指针

如果在程序中定义了一个函数,在编译时,编译系统为函数代码分配了一段存储空间,这段存储空间的起始地址(又称为入口地址)称为这个函数的指针。

可以定义一个指向函数的指针变量,用来存放某一函数的起始地址,这就意味着此指针变量指向该函数。例如:

int (*p) (int ,int );//定义p是一个指向函数的指针变
//量,它可以指向函数的类型为整型且有两个整型参数
//的函数。p的类型是int (*)(int ,int )表示。

(2)、用函数的指针变量调用函数

如果想调用一个函数,除了可以通过函数名调用以外,还可以通过指向函数的指针变量来调用该函数。

例子1:用函数求整数a和b中的大者。

(1)、通过函数名调用函数

/*************************
(1)、通过函数名调用函数
*************************/
#include <stdio.h>

int main()
{
    int max(int, int);//函数的声明
    int a, b, c;
    printf("Pleade input 2 integer numbers:");
    scanf_s("%d,%d", &a, &b);
    c = max(a, b);//通过函数名调用max函数
    printf("a=%d
b=%d
max=%d
", a, b, c);
    getchar();
    return 0;
}
int max(int x,int y)//定义max函数
{
    int z;
    if (x > y)
        z = x;
    else
        z = y;

    return (z);
}

(2)、通过指针变量访问它所指向的函数

/*************************
(2)、通过指针变量访问它所指向的函数
*************************/
#include <stdio.h>

int main()
{
    int max(int, int);//函数的声明
    int (*p)(int,int);//定义指向函数的指针变量p
    int a, b, c;
    p = max;//使p指向max函数
    printf("Pleade input 2 integer numbers:");
    scanf_s("%d,%d", &a, &b);
    c =(*p)(a, b); //通过指针变量调用max函数
    printf("a=%d
b=%d
max=%d
", a, b, c);
    system("pause");
    return 0;
}
int max(int x,int y)//定义max函数
{
    int z;
    if (x > y)
        z = x;
    else
        z = y;

    return (z);
}

上面的两个程序的运行结果一样。

注意:

对于“int (*p)(int ,int);”,*p两侧的括号不能省略,表示p先与*结合,是指针变量,然后再与后面的()结合,()表示的是函数,即该指针变量不是指向一般的变量,而是指向函数。

如果写成“int * p(int ,int );”,由于()优先级高于*,它相当于“int *(p(int,int));”就成了声明一个p函数了(这个函数的返回值是指向整型变量的指针)。

“p=max;”的作用是将函数max的入口地址赋给指针变量p。和数组名代表数组首元素地址类似,函数名代表函数的入口地址。这样p就是指向函数max的指针变量,此时p和max都指向函数的开头。调用*p就是调用max函数。

(3)、怎样定义和使用指向函数的指针变量

定义指向函数的指针变量的一般形式如下:

类型名   (*指针变量名)(函数参数列表);

注意:

1、定义指向函数的指针变量,并不意味着这个指针变量可以指向任何函数,它只能指向定义时指定的类型的函数。如:“int (*p) (int ,int );”表示指针变量p只能指向函数返回值为整型且有两个整型参数的函数。

2、如果要用指针调用函数,必须先使指针变量指向该函数。如:p = max;

3、在给函数指针变量赋值时,只需给出函数名而不必给出参数,如:

p = max;//将函数的入口地址赋给p

如果写成:

p = max(a,b);

就错了,因为p=max(a,b)是将调用max函数所得到的函数值赋给p,而不是将函数的入口地址赋给p。

4、用函数指针变量调用函数时,只需将(*p)代替函数名即可(p为指针变量名,存放的是函数的入口地址),在(*p)之后的()中根据需要写上实参。例如:

c =(*p) (a,b);

5、对指向函数的指针变量不能进行算术运算,如:p+n、p++、p--等运算是没有意义的。

6、用函数名调用函数,只能调用所指定的一个函数,而通过指针变量调用函数则比较灵活,可以根据不同的情况先后调用不同的函数。

原文地址:https://www.cnblogs.com/dengxiangliu/p/6235482.html