指针函数与函数指针的区别
(2013-04-10 09:07:15)
标签:
杂谈 |
分类: c++ |
一、
在学习arm过程中发现这“指针函数”与“函数指针”容易搞错,所以今天,我自己想一次把它搞清楚,找了一些资料,首先它们之间的定义:
1、指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针
首先它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。
表示:
float *fun();
float *p;
p = fun(a);
注意指针函数与函数指针表示方法的不同,千万不要混淆。最简单的辨别方式就是看函数名前面的指针*号有没有被括号()包含,如果被包含就是函数指针,反之则是指针函数。
来讲详细一些吧!请看下面
2、函数指针是指向函数的指针变量,即本质是一个指针变量。
int (*f) (int x);
f=func;
指向函数的指针包含了函数的地址,可以通过它来调用函数。声明格式如下:
主要的区别是一个是指针变量,一个是函数。在使用是必要要搞清楚才能正确使用
二、指针的指针
三、指向指针数组的指针
摘自:http://www.cnblogs.com/gmh915/archive/2010/06/11/1756067.html
/////////////////////////另一篇文章/////////////
这两个名字不同当然所代表的意思也就不同。我刚开始看到这就吓到了,主要是中文太博大精深了,整这样的简称太专业了,把人都绕晕了。从英文解释或中文全称看就比较容易理解。
指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针
数组指针:a pointer to an array,即指向数组的指针
还要注意的是他们用法的区别,下面举例说明。
int*
a[4]
int
(*a)[4]
注意:在实际应用中,对于指针数组,我们经常这样使用:
typedef int *
pInt; pInt a[4]; |
这跟上面指针数组定义所表达的意思是一样的,只不过采取了类型变换。
代码演示如下:
#include using
namespace
std; int
main() { int
c[4]={1,2,3,4}; int
*a[4]; //指针数组 int
(*b)[4]; //数组指针 b=&c; //将数组c中元素赋给数组a for ( int
i=0;i<4;i++) { a[i]=&c[i]; } //输出看下结果 cout<<*a[1]<<endl; //输出2就对 cout<<(*b)[2]<<endl;
//输出3就对 return
0; }
类似的还有指针函数和函数指针,遇到了再说吧。 ///////////////////////////////////进阶篇///////////// 最近在看函数指针和函数指针,觉得很容将这两者混淆,而且对一些复杂的函数指针分析起来很困难。这里我对一些例子进行了分析,希望有助于理解函数指针和指针函数,并且掌握分析函数指针和指针函数的方法。 在看例子之前,需要强调,函数指针本质上是一个指针(从指针二字在后也可以看出),它指向的是一个函数。而指针函数是一个函数(从函数二字在后也可以看出),函数的返回值是一个指针。 1. int 2. int 3. int 4. int 5. int 6. int 7. int 8. int 9. int 10. int 11. int 12. int 13. int 14. int 解答 1. 返回值为int的函数。 2. int 型数组 3. 返回值为“int 型指针的指针”的函数。()的优先级高于*(这里指右边的*),所以abc先和()结合,即abc(int
a),说明abc是一个函数(这是abc的真面目)。那么函数的返回值是什么类型的呢?abc(int
a)接着和*(右边的*)结合,即*abc(int a),说明函数abc的返回值是指针类型的?那是什么类型的指针呢?从int
4. 指向函数返回值为int的函数指针。由(*abc)可以看出,*先与abc结合,所以abc是一个指针(而不是函数),该指针指向形参为int a,返回值为int的函数。 5. 指向“int 型数组”的指针。从(*abc)可以看出,abc是一个指针,那是什么类型的指针呢?(*abc)和后面的[]结合,即(*abc)[6],所以abc指向一个数组,那么数组元素的类型呢?从int (*abc)[6]可以看出,数组元素的类型为int型。再分析一遍,指针abc指向一个数组,数组的元素类型为int型,即abc是一个指向int型数组的指针。 6. 返回值为“int型指针”的函数。由于()的优先级高于*,所以abc首先和()结合,即abc(int a),由此看出abc是一个函数(而不是指针),那么该函数的返回值是什么类型的呢?abc(int a)和前面的*结合,即*abc(int a),可以看出,函数abc的返回值是指针类型的。接着,*abc(int a)和int结合,即int *abc(int a)。再分析一遍,abc是一个函数,返回值为int型指针。 7. 元素为指向“返回值为int型指针的指针的函数”的指针数组。由于[]的优先级高于*,所以abc先和[]结合,即abc[6],所以abc是一个数组。然后abc[6]和*结合,即*abc[6],说明数组abc的每个元素是指针,且该指针指向形参为int a,返回值为int指针的指针的函数。 8. int型指针的指针数组。[]的优先级高于*,所以abc首先和[]结合,即abc[],所以abc是一个数组,然后abc[6]和*(右边的*)结合,即*abc[6],可以看出数组abc的每个元素为指针。那么该指针指向什么呢?接着,*abc[6]和左边的*结合(*的结合顺序为从右到左),即*(*abc[6]),所以数组abc的每个元素为指针,且该指针指向int型的指针,也就是说,数组abc的每个元素为int型的指针的指针。 9. 指向“int型指针数组”的指针。由于()的优先级高于[],所以abc和*先结合,即*abc,所以abc是一个指针(这是本质)。而下标[]的优先级高于*,所以*abc然后和[]结合,即(*abc)[6],可以看出,abc指向的是一个数组,数组的元素类型为int *,即int型指针。 10. 返回值为“指向返回值为int型指针的函数指针”的函数。是不是有些头晕呢?没关系,不管你头晕不晕,我都会让你清醒的。由于()的优先级高于*,所以abc先和()结合,即abc(int a),说明abc是个函数,这是本质。然后abc(int a)和前面的*结合,即*abc(int a),说明函数的返回值为指针,那么该指针(ptr1)指向什么呢?int *(*abc(int a))(int a),看到红色的部分了吗?可以看出,ptr1指向一个函数,该函数形参为int a,返回值为int型指针。最后我们再分析一遍,abc(int a)函数的返回值是一个指针,该指针指向形参为int a,返回值为int型指针的函数。 11. 指向返回值为“指向返回值为int的函数指针”的函数指针。从(*abc)(int
a)可以看出,abc是一个函数指针,那么该函数指针所指的函数(f)返回值是什么类型的呢?从*(*abc)(int
a)可以看出,函数f的返回值为指针类型(ptr_type),那ptr_type到底是什么类型的呢(指向int,char,还是函数)?从int
12. 指向函数返回值为“返回值为int的函数指针的指针”的函数指针。分析参考11。 13. 指向函数返回值为“指向int型数组的指针”的函数指针。abc先和*结合,即*abc,abc是一个指针。接着,*abc和()结合,即(*abc)(int a),abc指向的是一个函数,即abc是一个函数指针。那么abc指向的函数返回值是什么类型呢?(*abc)(int a)接着和前面的*结合,即*(*abc)(int a),说明abc所指向的函数的返回值是一个指针,那么这个指针(ptr)指向哪儿呢?接着往下看,(*(*abc)(int a))[6],ptr指向一个数组,数组的元素类型为int型。再分析一遍,函数指针abc所指的函数返回值是一个指针,该指针指向int型的数组。 14. 指向函数返回值为“指向‘返回值为int型指针的函数指针’的数组的指针”的函数指针。看到这个表达式,你是不是头有点大了?如果你的answer是yes,那么恭喜你,说明你还是个正常的地球人。哈哈!开个玩笑。从(*abc)(int a)可以看出,abc是一个函数指针,即指针abc指向的是一个函数(f)。那么函数f的返回值是什么类型的呢?从*(*abc)(int a)可以看出,函数f的返回值类型是指针型(ptr)的,那么这个指针指向哪里呢?从(*(*abc)(int a))[6]可以看出,ptr指向一个数组,那么该数组(arr)的元素是什么类型的呢?从*(*(*abc)(int a))[6],arr的数组的元素类型为指针类型(ptr_type),那是什么类型的是指针呢(指向int,char,还是函数)?从int *(*(*(*abc)(int a))[6])(int a)可以看出,ptr_type是指向函数的指针,该函数的形参为int a,返回值为int型指针。
///////////////////////////////////一个很好的指针数组与数组指针的例子////////////
//注意指针数组和数组指针分别是如何指向二维数组的 #include main() { |