`
txf2004
  • 浏览: 6830890 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

C语言 复杂指针的申明问题 数组指针 指针数组 函数指针 指针函数一览无遗! C/C++求职面试必备考点(四)

 
阅读更多

首先,看如下8个题,如果您能不看任何资料的情况下做对。那么恭喜您,这块应该基本没问题了。因为再复杂的组合都是从这上面8种里变出来的。

1,定义一个整形数

2,定义一个指向整形数的指针

3,定义一个指向指针的指针,它指向的指针,是一个指向整形数的指针

4,定义一个具有10个整形数的数组

5,定义一个具有10个指针的数组,这些指针都是指向整形数的

6,定义一个指向有10个整形数 数组的指针

7,定义一个指向函数的指针,该函数有一个整形参数 并返回一个整形数据

8,定义一个有10个指针的数组,每个指针指向一个函数,该函数有一个整形参数,返回一个整形数

答案如下:

1,int a

这没啥好说的。

2,int *a,

*a表示a是一个指针,左边的int表示指针指向数据的类型。也许这会觉得是废话,但后面一复杂,往往不知所指了。

3,int **a

4,int a[10]

5, int *a[10]

注意从这里往下开始绕了,当* 和[]同时出现时,[]的运算级别高于*,因此首先是a[10]表示数组a有个10个元素,*a[10]表示每个元素都是一个指针,*修饰的是a[10],而不是a。加上int表示指向数据类型

6,int (*a)[10]

首先是要求一个数组,数组里有10个整数,也就是int a[10],然后要求有一个指针来指向这个数组,注意是指向这个数组,而不是上面5题里的指向数组里的每一个元素a[0] a[1]。。。因此指针修饰的是数组名字a,所以写成int (*a)[10].由于加了括号,*优先作用于a

7, int (*f)(int),

这里假设函数名字为f,指向函数的指针写成(*f),外面带括号,这个要切记!原因下面总结里会有。函数里面有参数,且参数为Int型,写成(*f)(int).最后,返回类型为int ,在前面加上int就行了。表示返回类型.

8,int (*a[10])(int)

要求要定义一个有10个指针的数组,也就是5题类型,*a[10],这里面的a[0] a[1]............都是指针。下面要求指针指向一个函数,写成(*a[10])()。这里注意衡量是否是函数的标志就是后面要有个括号。 下面要求函数的参数是int,且返回int。故答案是int (*a[10])(int). 最终的意思是a[0] a[1] a[2]..........都是指针,每个指针都指向函数,函数里的参数是int返回int.

有了上面8个题的基础,理解下面的就容易了。如果上面8个题,您不仅能答对题目,还能把题目本身用语言文字描述清楚,下面就是小case。

题目1,定义一个指向函数的指针func,这个函数里有一个参数是指向int数据的指针,返回一个int数据

答案:首先写出(*func)(),注意这里要带括号,函数指针申明时左右一定有两个括号。第一个括号表示本身的函数指针的名字,除非是int sum(int , int),sum不用括号括起来。如果是函数指针则要括起来。第二个括号表示里面的参数。加上参数int*,和返回类型。答案是 int (*func)(int *)

题目2,定义一个指向函数的指针 func,该函数有两个参数一个是int *p, 一个是int(*f)(int*),返回一个int。合起来就是int (*func)(int *p , int(*f)(int*)) 注意这里的*f尽管f就一个字母但还是要括起来。其他不多解释了。

题目3,int(*func[5])(int *p)

释义:再复杂的组合都逃不掉上面8种类型。由两个括号,则肯定是函数。函数的参数是一个指向int的指针。函数的返回值是一个int。接下来就是(*func[5])这块了,它表示func是一个指针数组,他里面的每一个元素都是一个指针,这些指针指向一个函数。

也就是说,func是一个数组,数组里的每个元素都是指针。准确说,(由(int*p)可以看出)数组里的每一个元素都是函数指针,它指向的函数参数为int*P,返回类型为int。

题目4,int(*(*func)[5])(int *p)

释义:首先来看模块(*func)[5],上面已经说过,他表示func是一个指向有5个数据元素的数组的指针。数组我们都知道int a[50],还记得我们上面说的,50表示数组里面元素的个数,左边的int表示数组元素的数据类型。只要是数组,一定要告诉他里面所放元素的类型!我们看(*func)[5]左边还有一个*号,然后外面才是括号。所以我们要先解析这个*号。这里*就是告诉数组指针func所指向的具有5个元素的数组,里面所放元素的类型是指针。好了,跳出括号。右边又是一个括号。表示是函数。函数输入参数为int*p,返回类型为int。

即:func是一个指向数组的指针,这个数组有5个元素,每个元素的数据类型是函数指针,这些函数指针指向具有int*形参,返回int的函数。

题目5,int(*(*func)(int *p))[5]

释义:首先看模块(*func)(int *p)表示func是一个函数指针,多余的不罗嗦了,将此模块用a表示。也即int(*a )[5],这块意思是a是一个指向数组的指针。等会,上面我们提到数组必须有数组个数,以及数组元素的类型。而函数必须有参数和返回类型。对于本题,将上面合在一起,也就是func是一个函数指针,它指向的函数输入参数为int *类型,返回类型是一个指向数组的指针,它指向的数组里面元素个数是5,数据类型为int。

至此,我们总结下:

一、指针数组和数组指针的概念

指针数组是说数组里的元素都是指针,如int *a[5],数组a里面有5个元素,每个元素都是指向int的指针。

数组指针是说,有一个数组int a[5],数组里元素个数为5,类型为int,现在要有个指针来指向这个数组,申明为int (*a)[5]

二、指针函数和函数指针的概念

指针函数的意思是,函数的返回类型是一个指针。如int *f(int x), 这里f是一个函数,他的返回类型是一个指向int数据的指针。

什么是函数指针呢?我们趁热打铁,int(*f)(int x),则f就是函数指针,即指向一个函数的指针叫函数指针。这就是上面为啥(*f)加()的原因。

为啥需要函数指针呢?因为函数代码是程序中的算法指令部分,他和整形数据、各种数据一样也是占内存的。我们可以通过char *p = "hello!", printf("%s",p),通过字符串的首地址来打印字符串。因此也可以通过函数的首地址来调用这个函数,这就是函数指针的由来。他的使用如下:

假设现在有个函数int sum(int a, int b),我们再申明个函数指针,int (*pSum)(int a, int b)然后pSum = sum,注意sum后面不要带括号。sum表示这个函数的首地址,这和字符串数组一样。如此初始化函数指针后,sum(3,4)的效果和(*pSum)(3, 4)是一样的!函数指针的用法有争议,(*pSum)(3,4)和pSum(3,4)都可以,参见http://blog.csdn.net/megaboy/article/details/482767。但函数指针,也就是指向函数的指针申明时,*和指针名字号一定用括号括起来!函数返回的数据类型为指针,叫指针函数,这时*和函数名是不括在一起的!

将数组指针、函数指针总结在一块:

数组指针、函数指针,*和指针名字一定要括号括起来!

三、在解析复杂指针申明时,一定要记着大原则:数组一定要告诉它元素个数和数据类型,函数一定要有形参类型和返回数据类型。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics