首页 > 技术文章 > 指针函数和函数指针的区别

shijingjing07 2016-07-08 00:19 原文

1.指针函数
指针函数是一个函数,函数的返回值是一个指针。
格式如下:

类型标识符 *函数名(参数表)
如 double *myfunc(double x,double y);

myfunc即为一个指针函数。

代码示例如下:
pfunc.c

#include<stdio.h>
double *myfunc(double x,double y);
int main()
{
    double *p = myfunc(2.5,4.3);
    printf("%f\n",*p);
    return 0;
}
double *myfunc(double x,double y)
{
    double result = x+y;
    return &result;
}

输出结果:

2.函数指针
函数指针是一个指针,它指向函数地址
格式如下:

类型标识符 (*指针名)(参数表)
如 double (*myfuncp)(double x,double y);

myfuncp是一个指针,*myfuncp为指针指向的函数的地址。

我们有以下函数
double myfunc(double x,double y);
则可将函数的地址赋给指针
myfuncp = &myfunc或myfuncp=myfunc(取地址运算符不是必需的)

代码示例如下:
funcp.c

#include<stdio.h>
double (*myfuncp)(double x,double y);
double myfunc(double x,double y);
int main()
{
    myfuncp = &myfunc;
    double result = (*myfunc)(2.5,4.3);
    printf("%f\n",result);
    return 0;
}
double myfunc(double x,double y)
{
    return x+y;
}

输出结果:

3.指针的指针
表示指针指向的值,是一个指针类型
如 int i=5;
int *p = &i;
int **pp = &p;
其中pp即为一个指向指针的指针。
可以用以下示意图来标识。

再看下面的图

若*pp=p2;会发生什么?*pp即p=p2,那么p将指向p2所指的地方,即p指向j。
如下图所示:

4.指针的指针的作用
1)调用函数修改局部指针变量
2)处理指针数组

代码示例如下:
从一个int类型数组中,找出第一个负数。
pptest2.c

#include<stdio.h>
int main()
{
    int vals[]={7,6,5,-4,3,2,1,0};
    int *p=vals;
    getnegative(&p);
    printf("%d\n",*p);
    return 0;
}
void getnegative(int **pp)
{
    while(**pp!=0)
    {
        if(**pp<0)
            break;
        else
            (*pp)++;
    }
}

输出结果:

我们可以用指针数组来代替多维数组,
代码示例如下:
arrayp.c

#include<stdio.h>
int main()
{
        char* names[]={"Bill","Sam","Jim","Paul","Jack","0"};
        char **namesp = names;
        while(*namesp!="0")
        {
                printf("%s ",*namesp++);
        }
        return 0;
}

输出结果:

其中*namesp++表示先取得指针指向的内容,然后使指针自增。

推荐阅读