您的位置:首页 - 教程 - C++ - 正文
指针函数和函数指针的区别

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。
此时,*p=j=6;
示意图如下所示:

我们来看下面的示例,从一个int类型数组中,找出一个负数。
使用了两种方法。
方法一,使用的是一级指针
pptest.c

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

输出结果:

在getnegative函数中p是一个局部变量。每次将p加一个步长,直到找到为负的元素。

方法二,使用二级指针
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)++;
    }
}

输出结果:

此方法用到了上面我们介绍的“若*pp=p2;会发生什么?”这部分。
getnegative中pp的值是不变的,指向p的地址,(*pp)++ p指向p+1指向的值,直到找到负数,此时,*p即为查找到的负数。

指针的指针,可用于修改局部指针变量,另外还可以用来,处理指针数组

指向指针数组的指针
可以用指针数组来代替多维数组。如下所示:
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++表示先取得指针指向的内容,然后使指针自增。


评论: