标签:
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++表示先取得指针指向的内容,然后使指针自增。
标签:
原文地址:http://www.cnblogs.com/shijingjing07/p/5652018.html