background image

指针函数和函数指针

一、指针函数

指针函数是指声明其返回值为一个指针的函数,实际上就是返回一个地址给调用函数。
格式:

 

类型说明符 *函数名(参数)

例如: void *GetDate(int ID);

二、函数指针

指向函数的指针包含了函数的地址,可以通过它来调用函数。
格式:

 

类型说明符 (*函数名)(参数)

例如: int (*fptr)(int ID);
其实这里不能称为函数名,应该叫做指针的变量名。这个特殊的指针指向一个返回整型值的函数。指针的声明

笔削和它指向函数的声明保持一致。指针名和指针运算符外面的括号改变了默认的运算符优先级。如果没有圆括号
就变成了一个返回整型指针的函数的原型声明。

可以采用下面的形式定义函数指针数据类型:

typedef int (*T_MY_FUNC)(int ID);/* 

此时 T_MY_FUNC fptr;”

等价于 int (*fptr)(int ID);” */

可以采用下面的形式把函数的地址赋值给函数指针:

fptr=&Function;

/* 

或用 fptr=Function;” */

可以采用下面的形式通过指针来调用函数:

(*fptr)(ID);

/* 

或用 fptr(ID); ”的格式,使用这种调用格式看上去与调用普通函数无异,因此使

用前一种调用格式可以明确指出是通过指针而非函数名来调用函数的。*/

三、指针的指针

指针的指针用于指向指针的地址,它的声明有两个星号。例如:char **cp;
如果有三个星号,那就是指针的指针的指针,有四个星号那就是指针的指针的指针的指针,依次类推。

四、指向指针数组的指针

    指针的指针另一用法是处理指针数组。有些程序员喜欢用指针数组来代替多维数组,一个常见的用法就是处理
字符串。

char *Names[]=
{
     "Bill",
     "Sam",
     "Jim",
     0
};

main()
{
    char **nm=Names;

/* 

 

定义一个指向指针数组的指针的指针 */

    while(*nm!=0) printf("%s\n",*nm++);
}

3