`
rys5851968
  • 浏览: 151527 次
社区版块
存档分类
最新评论

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。但函数指针,也就是指向函数的指针申明时,*和指针名字号一定用括号括起来!函数返回的数据类型为指针,叫指针函数,这时*和函数名是不括在一起的!

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

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

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

分享到:
评论

相关推荐

    c语言利用指针求数组的最大值与最小值

    c语言利用指针求数组的最大值与最小值,下载资源,数组可扩展。

    C语言中指针、数组和函数的综合应用与实例解析.pdf

    C语言中指针、数组和函数的综合应用与实例解析 本文对C语言中指针、数组和函数的概念、运算和应用进行了详细的探讨和分析。指针是C语言的重要特色,是一种特殊的数据类型,通过存储空间的地址或编号来访问数据。...

    C语言指针数组函数笔记

    "C语言指针数组函数笔记" 本笔记主要介绍了C语言中的指针和数组相关知识点,旨在帮助读者更好地理解和应用C语言中的指针和数组。 一、变量和内存 在C语言中,变量是存储数据的基本单元。变量可以是整数、浮点数、...

    基于C语言的指针构造动态数组的方法研究.pdf

    "基于C语言的指针构造动态数组的方法研究" 基于C语言的指针构造动态数组的方法研究是计算机语言中的一种重要的研究方向。C语言是一种应用广泛的计算机语言,它既具有一般高级语言的特性,又具有低级语言的特性,集...

    C语言用指针将字符串数组位置颠倒

    C语言用指针将字符串数组位置颠倒,实现ABCDEFGHIJKLMNOPQRSTUVWXYZ转换成ZYXWVUTSRQPONNOPQRSTUVWXYZ

    C语言数组指针(指向数组的指针)_C语言中文网1

    在C语言中,数组是一种非常重要的数据结构,它允许存储一系列具有相同类型的元素。...在深入学习C语言指针时,还会涉及到二级指针、指针数组、字符串指针、函数指针等各种复杂情况,这些都需要逐步学习和实践。

    C语言之指针、数组和函数解释

    1、指针的本质是一个与地址相关的复合类型,它的值是数据存放的位置(地址);数组的本质则是一系列的变量。  2、数组名对应着(而不是指向... 3、当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。

    C语言精华(指针、数组、函数)

    "C语言精华(指针、数组、函数)" 本篇文章主要讲解了C语言中的指针、数组和函数调用等深入浅出式的讲解,摘抄自blog... 一、指针 指针是C语言中最神秘而又诡谲多变的地方之一。它的本质是地址的类型。在许多语言...

    C语言之指针数组函数

    《C语言之指针、数组和函数》 在C语言中,指针、数组和函数是三个核心概念,它们在程序设计中起着至关重要的作用。指针是C语言的精髓之一,它允许我们直接访问内存地址,进行高效的数据操作。而数组则是一种存储...

    c语言中 数组名和指针的区别

    在C语言中,数组名和指针之间存在微妙且重要的区别,这往往让初学者感到困惑。虽然在某些上下文中,它们看似可以互换使用,但深入理解它们的本质差异对于编写高效、安全的代码至关重要。 ### 一、数组名与指针的...

    C语言经典指针与数组ppt

    【C语言指针与数组详解】 C语言中的指针和数组是编程中极其重要的概念,它们在内存管理和数据处理方面发挥着关键作用。本篇将深入讲解数组和指针的基本用法及其相互关系。 1. **数组** - **定义**:数组是一种...

    全国计算机二级:C语言之指针、数组和函数

    ### 全国计算机二级:C语言之指针、数组和函数——深度解析 #### 指针与数组:核心概念的解构 在探讨指针和数组的关系之前,我们先来明确它们各自的基础概念。 ##### 指针:内存位置的标识符 - **本质**:指针是...

    C语言的指针运用和数组的关系.pdf

    除了简单指针变量与数组的关系外,还包括数组指针、指针数组和指向指针的指针等复杂指针类型与二维数组的关系。例如,在对字符串数组进行排序时,可以使用数组指针和指针数组两种方法。数组指针通过定义一个指向由N...

    【C语言指针】深入浅出:指针与取值、数组、函数; 详细剖析:指针函数、函数指针、指针数组、数组指针、双重指针、指针与动态内存分配

    详细剖析:指针函数、函数指针、指针数组、数组指针、双重指针、指针与动态内存分配 个人总结要点: 本质: 地址要用指针来存储,指针是用来存储地址的!!! 重难点: 指针指向的地址,也就是指针存储的地址!!...

    C语言循环、数组、函数及指针练习题精选及答案

    循环、数组、函数和指针是C语言中的四大核心概念,它们在程序设计中扮演着重要角色。以下是对这些主题的详细说明: 1. **循环**: - **for循环**:适用于已知循环次数的情况,包含初始化、条件判断和递增/递减部分...

    C语言实例循环嵌套数组指针函数结构体

    在C语言编程中,循环、嵌套、数组、指针、函数和结构体是核心概念,它们构成了C语言的强大功能和灵活性。以下是对这些概念的详细解释和实践应用。 一、循环 C语言中的循环主要有三种类型:for循环、while循环和do-...

    C语言中指针引用多维数组的教学实践.pdf

    ### C语言中指针引用多维数组的教学实践 #### 一、指针在C语言中的重要性 C语言是一种基础且重要的编程语言,被众多院校作为程序设计的入门语言。然而,C语言也因其语法的灵活性和变化多端的特点而被认为难以掌握...

    c语言指针数组-·详解数组指针与指针数组

    在C语言中,指针和数组是两种非常重要的数据结构,它们可以组合成“指针数组”或“数组指针”,这为处理复杂的数据结构提供了灵活性。本文将深入讲解这两种概念。 一、数组指针与指针数组的区别 1. 数组指针:数组...

    C语言——借助指针实现数组元素的逆序.zip

    在C语言中,指针是编程中的一个关键概念,它允许我们间接访问和修改内存中的数据。本主题探讨的是如何利用指针来实现数组元素的逆序操作,这是...指针与数组的结合使用是C语言的一大特色,也是解决许多复杂问题的基础。

    C语言中二维数组作为函数参数来传递的三种方法

    C语言中二维数组作为函数参数来传递的三种方法 在C语言中,二维数组作为函数参数来传递是非常常见的操作。但是,如何正确地传递二维数组作为函数参数却是许多初学者和开发者经常混淆的地方。今天,我们将详细介绍...

Global site tag (gtag.js) - Google Analytics