指针函数和函数指针

来源:互联网 发布:什么翻译软件好用 编辑:程序博客网 时间:2024/06/05 19:56

指针函数和函数指针

指针函数

  • 指针函数是返回值是指针的函数,其本质就是一个函数.
  • 类型标示符 *函数名 ( 参数表 ),下面是一个例子:
    int *f(x,y);
  • 指针函数一定由函数值,且该返回值必须用同类型的指针边量来接受,下面是一个例子:
    double *function();  vs  double (*function)();    double *p;    p = function();

上面是两种声明形式生命的是不同的内容,左边一个是指针函数,右边的是函数指针,怎么区分呢?
其实道理很简单,就看下未明身份的字符前面的是否在括号里,像左边的, function 大家是认识的,就是函数的意思,假如大家遇到一个不认识的词,就看它前面的 有没有和它同在一个括号里,不在,就是指针函数,在的话,就是函数指针.

函数指针

  • 函数指针是指向函数的指针,一次,本质上是一个是指针变量
    int (*f)(int);//声明一个函数指针    f = function;// 赋值(将函数( function) 赋值给指针 f)    ret = f(6);//调用(通过函数指针调用函数)

1.函数指针 - 赋值

    f = &function;    f = function;    f();// 通过函数指针调用函数

2.函数指针 - 调用

-通过指针调用函数,可以采用以下两种形式:

    1.ret = (*f)(6);//明确指出通过读取指针变量调用函数    2.ret = f(6);    f();//通过函数指针调用函数

如何区分

函数名前面的星号*有没有被括号()包含

包含,就是函数指针

没包含,就是指针函数

下面举一个例子:

    int(*(*function)(int*))[10];

擦,这可怎么理解啊!肯定会有人这么说,其实要想理解这个”东西” 逻辑就需要使用左右法则,又称为右左法则.

左右法则

  • The right-left rule: Start reading the declaration from the innermost parentheses, go right, and then go left. When you encounter parentheses, the direction should be reversed. Once everything in the parentheses has been parsed, jump out of it. Continue till the whole declaration has been parsed.

  • 左右法则: 首先从最里面的圆括号(未定义的标示符)看起,然后向右看,再向左看.每当遇到圆括号时,就应该调转阅读方向.一旦解析完圆括号里面的所有的东西,就跳出圆括号.重复这个过程直到整个声明解析完毕.

例子

    int(*function)(int *p);

首先, function 是未定义的标示符,先向右看,是圆括号,再向左看,前面有一个 ※号,那么 function 就是一个指针,跳出圆括号.再向右看又是一个括号,说明( * function)是一个函数,并且是一个函数指针,其参数是 一个整形的指针,返回值也是整形;

例子

    int(*function)(int *p,int (*fun(int*)));

判断方法,先看 function前面有一个*,后面有一个括号,所以,它是一个函数指针,函数的内容有一个整型的指针 p, 还有一个什么呢?

在分析 f, 前面有一个*,后面有一个括号,说明 f 是一个函数指针,函数内有有一个整型的地址,返回值是整型.

所以,总的来说, function 是一个函数指针,其函数体内有一个整型的地址,还有一个函数指针,里面的函数指针里也有一个整型的指针,返回值为int,function 的返回值也是整型.

例子

    int (*func[5])(int *p);

判断方法, func 是一个数组,前面有*,所以是一个存放地址的数组,后面还有圆括号,所以又是一个函数指针,是一个存放是一个存放数组地址的函数指针,看后面的括号,存放的是整型的指针指向的地址.再向前看, int返回值

再来个复杂的

    int (*(*func)[5])(int *p);

判断方法, func 是一个指针(前面有*),跳出最近的括号,是一个数组,这就变的和上面一样了,也是一个函数指针只不过是一个指针数组,里面存放的是整型指针的地址,,返回值是 int

0 0