嵌入式技术论坛
直播中

Mr_RMS

7年用户 327经验值
擅长:可编程逻辑 嵌入式技术 处理器/DSP 接口/总线/驱动 控制/MCU
私信 关注
[经验]

函数指针与指针函数

一、函数指针
函数指针是一个指针,定义的每一个函数在编译时都会被分配一个入口地址,函数指针指向的地址就是这个入口地址,可使用该指针调用该函数。
        函数指针的声明方法为:
       返回值类型 ( * 指针变量名) ([形参列表]);
       注1:“返回值类型”说明函数的返回类型,“(指针变量名 )”中的括号不能省,括号改变了运算符的优先级。若省略整体则成为一个函数说明,说明了一个返回的数据类型是指针的函数,后面的“形参列表”表示指针变量指向的函数所带的参数列表。例如:
       int func(int x); /* 声明一个函数 */
       int (*f) (int x); /* 声明一个函数指针 */
       f=func; /* 将func函数的首地址赋给指针f */
       注2:函数括号中的形参可有可无,视情况而定。

例1:
#include
int max(int x,int y){return (x>y? x:y);}
int main()
{
    int (*ptr)(int, int);
    int a, b, c;
    ptr = max;
    scanf("%d%d", &a, &b);
    c = (*ptr)(a,b);
    printf("a=%d, b=%d, max=%d", a, b, c);
    return 0;
}


二、指针函数
        指针函数是一个函数。函数都有返回类型(如果不返回值,则为无值型),只不过指针函数返回类型是某一类型的指针。函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有“函数返回值”,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。
        指针函数的声明方法为:
        类型名 *函数名(函数参数列表);
        其中,后缀运算符括号“()”表示这是一个函数,其前缀运算符星号“*”表示此函数为指针型函数,其函数值为指针,即它带回来的值的类型为指针,当调用这个函数后,将得到一个“指向返回值为…的指针(地址),“类型名”表示函数返回的指针指向的类型”。
        “(函数参数列表)”中的括号为函数调用运算符,在调用语句中,即使函数不带参数,其参数表的一对括号也不能省略。其示例如下:
        int *pfun(int, int);
        由于“*”的优先级低于“()”的优先级,因而pfun首先和后面的“()”结合,也就意味着,pfun是一个函数。即:
        int *(pfun(int, int));
        接着再和前面的“*”结合,说明这个函数的返回值是一个指针。由于前面还有一个int,也就是说,pfun是一个返回值为整型指针的函数。
        返回类型可以是任何基本类型和复合类型。返回指针的函数的用途十分广泛。事实上,每一个函数,即使它不带有返回某种类型的指针,它本身都有一个入口地址,该地址相当于一个指针。比如函数返回一个整型值,实际上也相当于返回一个指针变量的值,不过这时的变量是函数本身而已,而整个函数相当于一个“变量”。

回帖(4)

王栋春

2018-1-23 12:41:47
这个知识点学习一下
举报

h1654155956.5608

2018-2-1 13:32:01
这东西挺绕的。
举报

Mr_RMS

2018-2-1 17:48:35
引用: zhifubao 发表于 2018-2-1 13:32
这东西挺绕的。

不过挺有用的                                                                                    
举报

h1654155956.5608

2018-2-1 18:57:23
引用: Mr_RMS 发表于 2018-2-1 17:48
不过挺有用的

C语言他是精华,但是对于C++他就是要丢弃的了。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分