指针函数和函数指针的区别
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++表示先取得指针指向的内容,然后使指针自增。