1. 指针阅读技巧:右左法则

(1)从最里层的圆括号中未定义的标示符看起

(2)首先往右看,再往左看

(3)遇到圆括号或方括号时可以确定部分类型,并调转方向

(4)重复 2、3 步骤,直到阅读结束

注意:

当读出是数组时,须读出元素个数、元素类型

当读出是函数是,须读出参数及类型,返回值类型

当读出是指针是,须读出指针所指向的类型,有时也须读出指针的类型。

① int (*p)(int*, int (*f)(int*));

A、读未标示符 f,向右遇”)”括号,调转向左遇*,所以 f 是个指针,返回第 2 步,向右读右边的(int *),遇到“(”表示一个函数,说明 f 是个函数指针,指向一个函数,该函数参数为int*,返回值为 int 型。

即 f 是个函数指针,至此,f 指针读完

B、读 p 未标示符,向右遇”)”括号,调转向左遇*,所以 p 是个指针,返回第 2 步,向右读遇 p 指针右边的“(”括号,说明是个函数,该函数有 2 个参数,一个为 int*,一个为 f 函数指针,返回值为 int 型,

即 p 是个函数指针,指向两个参数,分别为 int*和函数指针型,返回值为 int 型的函数指针。

②int (*p[5])(int*)

A、读指针 p,向右,说明 p 是数组,该数组有 5 个元素,每个元素的类型为指针类型,它们指向一个函数,该函数参数为 int*,返回值为 int 型。

B、综上:p 为一个数组,有 5 个元素,每个元素是一个函数指针,它们指向一个参数为int*,返回值为 int 的函数。

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

A、读指针 p,向右遇)括号,向左*,说明 p 是指针,部分确定类型回第 2 步,向右,说明 p 指针指向一个数组,该数组有 5 个元素,每个元素为指针,这个是个函数指针,

指向参数为 int*,返回值为 int 型的函数。

B、综上:p 为一个数组的指针,该数组有 5 个元素,每个元素为都是一个函数指针,函数参数为 int*,返回值为 int 型。

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

A、首先 p 是个指针,指向函数,该函数参数为 int*,返回值为指针。这个返回值指向一个数组,该数组有 5 个元素,每个元素为 int 型。

B、综上:p 是个函数指针。该函数:参数:int*,返回值是个数组指针,指向 5 个 int 型元素的数组。

⑤void (*func(void (*p)(void *)))(void *)

A、func 首先是个函数 :参数为 p,p 是个函数指针,指向是参数为 void*,返回值为 void 的函数。返回值是一个指针,指向一个参数为 void*,返回值为 void 的函数。即返回值是一个函数指针。

B、综上,func 是个函数,参数是函数指针 p,返回值也是函数指针。

参考资料:
www.dt4sw.com
http://www.cnblogs.com/5iedu/category/804081.html

C语言学习笔记--指针阅读技巧的更多相关文章

  1. c语言学习笔记 - 指针和字符串

    前面学习了字符串是一种字符数组,又知道了指针变量和数组的关系,这里来看一下指针和字符串的关系. #include <stdio.h> int main(void){ char str = ...

  2. c语言学习笔记 - 指针和数组

    结合内存存储数据的机制,c语言里指针的出现和使用也就不奇怪了,如果先学了内存的一些知识,以及程序运行机制,到了c指针这块就会清晰很多. #include <stdio.h> int mai ...

  3. c语言学习笔记.指针.

    指针: 一个变量,其值为另一个变量的地址,即,内存位置的直接地址. 声明: int *ptr; /* 一个整型的指针,指针指向的类型是整型 */ double *ptr; /* 一个 double 型 ...

  4. C语言学习笔记--指针和数组的关系

    1.数组的本质 (1)数组是一段连续的内存空间 (2)数组的空间大小:sizeof(array_type)*array_size; (3)数组名可看做指向数组第一个元素的常量指针 (4)数组声明时编译 ...

  5. C语言学习笔记--指针概念

    指针也是一种变量,占有内存空间,用来保存内存地址,在32位系统中指针的占用的内存大小为4个字节 1.*号的意义 (1)在指针声明时,*号表示所声明的变量为指针 (2)在指针使用时,*号表示取指针所指向 ...

  6. C语言学习笔记--指针与字符串

    字符类型 char(character)是一种整数,也是一种特殊的类型:字符.这是因为 ① 用单引号表示的字符字符字面量:‘a’,'1' ②‘’也是一个字符 ③printf和scanf里用%c来输入. ...

  7. Go语言学习笔记九: 指针

    Go语言学习笔记九: 指针 指针的概念是当时学C语言时了解的.Go语言的指针感觉与C语言的没啥不同. 指针定义与使用 指针变量是保存内存地址的变量.其他变量保存的是数值,而指针变量保存的是内存地址.这 ...

  8. 《软件调试的艺术》学习笔记——GDB使用技巧摘要

    <软件调试的艺术>学习笔记——GDB使用技巧摘要 <软件调试的艺术>,因为名是The Art of Debugging with GDB, DDD, and Eclipse. ...

  9. HTML语言学习笔记(会更新)

    # HTML语言学习笔记(会更新) 一个html文件是由一系列的元素和标签组成的. 标签: 1.<html></html> 表示该文件为超文本标记语言(HTML)编写的.成对出 ...

随机推荐

  1. 使用Jenkins进行持续集成

    首先,我们从Jenkins官方网站https://jenkins.io/下载最新的war包.虽然Jenkins提供了Windows.Linux.OS X等各种安装程序,但是,这些安装程序都没有war包 ...

  2. python 矩阵分成上三角下三角和对角三个矩阵

    diagonal Return specified diagonals. diagflat Create a 2-D array with the flattened input as a diago ...

  3. 0.00-050613_boot.s

    ! boot.s ! ! It then loads the system at 0x10000, using BIOS interrupts. Thereafter ! it disables al ...

  4. js组合模式

    组合模式(Composite),将对象组合成树形结构以表示‘部分-整体’的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. 透明方式,也就是说在Commponent中声明所有用来管理子 ...

  5. 太深了,梯度传不下去,于是有了highway。 干脆连highway的参数都不要,直接变残差,于是有了ResNet。 强行稳定参数的均值和方差,于是有了BatchNorm。RNN梯度不稳定,于是加几个通路和门控,于是有了LSTM。 LSTM简化一下,有了GRU。

    请简述神经网络的发展史sigmoid会饱和,造成梯度消失.于是有了ReLU.ReLU负半轴是死区,造成梯度变0.于是有了LeakyReLU,PReLU.强调梯度和权值分布的稳定性,由此有了ELU,以及 ...

  6. 延时并自动关闭MessageBox

    信息提示框(MessageBox)是微软NET自带的一个用于弹出警告.错误或者讯息一类的“模式”对话框.此类对话框一旦开启,则后台窗体无法再被激活(除非当前的MessageBox被点击或者关闭取消). ...

  7. cocos2d-html5 中的性能优化

    游戏开发中,难免会遇到性能瓶颈.图片一多,渲染批次就会直线上升,任何动画都会变得闪动. OpenGL ES优化的问题,主要考虑两个方面:内存存储和运行速度. 2D游戏中的最占内存的就是图片资源,一张图 ...

  8. windows文件名非法字符过滤检测-正则表达式

    过滤文件名非法字符 windows现在已知的文件名非法字符有 \ / : * ? " < > | var reg = new RegExp('[\\\\/:*?\"&l ...

  9. Redis底层探秘(三):字典

    字典,又称为符号表(symbol table).关联数组(associative array)或映射(map),是一种用于保存键值对的抽象数据结构. 字典经常作为一种数据结构内置在很多高级编程语言里面 ...

  10. nodejs 设置跨域访问

    app.use(logger('dev')); app.use(express.json()); app.use(express.urlencoded({ extended: false })); a ...