标签:c++
指针函数
1、指针函数是指带指针的函数,即本质是一个函数。当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需要指针或地址的表达式中。
函数返回类型是某一类型的指针:
格式:
类型标识符 *函数名(参数表)
int *match(void *key_x,void *key_y);
解析:首先来说它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。
例如:
float *match();
float *p;
p = match(a);
重要知识点:
指针函数
2、函数指针是指向函数的指针变量,即本质是一个指针变量。
函数指针三指向可执行代码段或调用可执行代码段的信息块的指针,而不是指向某种数据的指针。函数指针将函数当作普通的数据那样存储和管理。
格式如下:
类型说明符 (*函数名)(参数)
int (*match) (int x); /* 声明一个函数指针 */
int *f = match; /* 将match函数的首地址赋给指针f */
PS:
其实这里不能称为函数名,应该叫做指针的变量名。这个特殊的指针指向一个返回整型值的函数。指针的声明必须和它指向函数的声明保持一致。
指针名和指针运算符外面的括号改变了默认的运算符优先级。如果没有圆括号,就变成了一个返回整型指针的函数的原型声明。
例如:
void (*fptr)();
把函数的地址赋值给函数指针,可以采用下面两种形式:
fptr = &Function;
fptr = Function;
取地址运算符&不是必需的,因为单单一个函数标识符就标号表示了它的地址,如果是函数调用,还必须包含一个圆括号括起来的参数表。
可以采用如下两种方式来通过指针调用函数:
x = (*fptr)();
x = fptr();
第二种格式看上去和函数调用无异。但是推荐使用第一种格式,因为它明确指出是通过指针而非函数名来调用函数的。
函数指针和指针函数最主要的区别是一个是指针变量,一个是函数。
指针的指针
三、指针的指针
例如:
char ** data;
如果有三个星号,那就是指针的指针的指针,四个星号就是指针的指针的指针的指针,依次类推。当你熟悉了简单的例子以后,就可以应付复杂的情况了。在实际程序中,一般也只用到二级指针,三级指针和四级指针就很少用啦。
指针的指针需要用到指针的地址。
char c = ‘A‘;
char *p = &c;
char **data= &p;
通过指针的指针,不仅可以访问它指向的指针,还可以访问它指向的指针所指向的数据。下面就是几个这样的例子:
char *p1=*cp;
char c1=**cp;
利用指针的指针可以允许被调用函数修改局部指针变量和处理指针数组,参考网上的例子:
void FindCredit(int **); main() { int vals[]={7,6,5,-4,3,2,1,0}; int *fp=vals; FindCredit(&fp); printf(%d\n,*fp); } void FindCredit(int ** fpp) { while(**fpp!=0) if(**fpp<0) break; else (*fpp)++; }
四、指向指针数组的指针
指针的指针另一用法就是处理指针数组。其中最常见的一个用法就是处理字符串。
char *Names[]= { zhangsan, lisi, wangwu, maliu, fu, 0 }; main() { char **nm=Names; while(*nm!=0) printf(%s\n,*nm++); }
数组中的最后一个元素被初始化为0,while循环一次来判断是否到了数组末尾。具有零值的指针常常被用做循环数组的终止符。其中零值指针为空指针(NULL)。
深入理解 [指针函数] 、[函数指针]、[指针的指针]、[指向指针数组的指针]
标签:c++
原文地址:http://blog.csdn.net/u013476464/article/details/43277047