看懂c/c++ 函数、指针、数组定义
读懂 函数 + 指针 + 数组
当指针遇到函数、数组,怎么读懂表达式的含义?本文就带你读懂c/c++ 函数、指针、数组表达式。本文原创,转载请注明出处。
优先级简单看
- 表达式提升
()
:一级优先 - 函数
()
:二级优先 - 数组
[]
:二级优先 - 指针定义
*
:三级优先
优先级数越小,优先级越高
c语言运算符机器优先级,看这里
小试牛刀:指针函数 & 函数指针
在看了优先级之后,指针函数和函数指针看起来就很简单了
指针函数:返回值是指针的函数
int *f(int a, int b);
f 先结合 (),说明是个函数,形参是a和b,返回值是指向int的指针。所以 f 是返回指针的函数 —— 指针函数。
注意:返回值是指向数组的指针时,指针函数的写法:
int *f(int a, int b)[];
tips:
可以把指针运算符
*
、标识符和形参列表放在一起,看作是一个新的标识符——代表了指针函数的返回值所指向的变量,那么就变成了int new_f[];
,所以这个函数返回一个指向数组的指针。
函数指针:指向函数的指针
函数(可执行代码)被存储在内存的代码段
text
,了解程序的内存分配 ——> 五个数据段之代码段、数据段、BSS、栈、堆
int (*f)(int a, int b);
因为 *f 被()括住, 优先级最高,f 先结合 *,说明 f 是一个指针。在看 指针指向哪,把 *f 替换成 f1 代表 f 指向的东西,很简单的看出是一个函数。所以 f 是指向指针的函数 —— 函数指针。
看懂这个例子
我们现在试着写一个 指向一个数组的指针p,数组中的每一个元素都是一个函数指针,每个函数都是指针函数,参数为一个int,返回的指针指向一个数组,这个数组的每一个元素都是int
先写一个指向数组的指针 p
(*p)[]
因为
*
优先级低于[]
,所以需要用括号提高优先级。再规定这个数组中的元素
- 是一个指针
type *(*p)[] //这里的type是指针指向的类型
在前面直接加上一个
*
,因为*
优先级低于[]
,(*p)
先和[]
结合,再和新增的*
结合* 指向一个函数,参数为一个int ```
type (*(*p)[])(int) //这里的type是函数的返回值类型
```
这时需要给上一个步骤的结果套上括号,因为函数定义的优先级高于`*`。如果不加括号,`(*p)[]`将先和`(int)`结合,成为一个函数,非我们所愿
再规定返回值
- 是一个指针
type *(*(*p)[])(int)
- 指针指向一个一维数组,数组中的元素是int
int {last_answer}[]
||
int (*(*(*p)[])(int))[]
这时需要给上一个步骤的结果套上括号,因为
[]
优先级高于*
于是我们得到了最终的答案
int (*(*(*p)[])(int))[]
,试试读这个答案的含义,验证并加深理解吧
update at 2017/9/17
by 一颗球
看懂c/c++ 函数、指针、数组定义的更多相关文章
- C语言的函数指针数组(好绕啊~看完这篇估计就通关了)
转自https://www.cnblogs.com/chr-wonder/p/5168858.html int *(*p(int))[3] 今天有人问这个是啥?我一看直接就懵逼了…… 下面做一些简单的 ...
- C函数指针数组的定义和使用
1.使用函数指针数组来实现计算器 2.通过函数指针变量来调用对应的函数 #include <stdio.h> int add(int a,int b){ return a+b; } int ...
- C++基础——函数指针 函数指针数组
==================================声明================================== 本文版权归作者所有. 本文原创,转载必须在正文中显要地注明 ...
- 转:函数指针数组的妙用(I)
转自:http://blog.sina.com.cn/s/blog_4c78b35f010008hi.html 笔者在开发某软件过程中遇到这样一个问题,前级模块传给我二进制数据,输入参数为 char* ...
- C/C++ 一段代码区分数组指针|指针数组|函数指针|函数指针数组
#include<stdio.h> #include<stdlib.h> #include<windows.h> /* 举列子说明什么是函数指针 */ //以一个加 ...
- typedef 函数指针 数组 std::function
1.整型指针 typedef int* PINT;或typedef int *PINT; 2.结构体 typedef struct { double data;}DATA, *PDATA; //D ...
- C 函数指针数组
名字有点绕口,其实更应该翻译为指针函数数组. 记录下对Head-First C这一节的理解,几乎每天班车上都会咪两眼,几乎每次都是看不懂,敲一敲的时候才有些明白. 通俗点讲,这功能解决的是,具有同种签 ...
- C++ code:函数指针数组
函数指针作为一种数据类型,当然可以作为数组的元素类型.例如,要实现用菜单来驱动函数调用的程序框架,则用函数指针数组来实现就比较容易维护. #include<iostream> using ...
- c语言.函数指针数组
函数指针: 一个指向函数的指针.一般用函数名表示. 函数指针数组:元素为函数指针的数组.转移表.c语言中函数不可以定义为数组,只能通过定义函数指针来操作. #include<stdio.h> ...
随机推荐
- Canvas: 优雅的代码作图系列:中国国旗
Canvas: 优雅的代码作图系列:中国国旗 有很多个这练手的,好的差的都有.这次,我演示下用极客的代码,画出最标准的中国国旗,并详细说明代码是怎么写出来的. 绘制规范: 一.严格按照绘制说明: 二. ...
- 9. Palindrome Number 回文 my second leetcode 20170807
Determine whether an integer is a palindrome. Do this without extra space. click to show spoilers. S ...
- python基础===Python性能优化的20条建议
优化算法时间复杂度 算法的时间复杂度对程序的执行效率影响最大,在Python中可以通过选择合适的数据结构来优化时间复杂度,如list和set查找某一个元素的时间复杂度分别是O(n)和O(1).不同的场 ...
- IOS开发之UITabBarController与UINavigationController混合使用
ios开发中UITabBarController与UINavigationController混合使用是很多app的基础页面结构,下面是简单的的页面初始化的方法,在AppDelegate.m的 - ( ...
- mysql flush操作
FLUSH语法 FLUSH [LOCAL | NO_WRITE_TO_BINLOG] flush_option [, flush_option] ... 如果您想要清除MySQL使用的部分内部缓存,您 ...
- DOS批处理中%cd%和%~dp0的区别[forward]
DOS批处理中%cd%和%~dp0的区别 在DOS的批处理中,有时候需要知道当前的路径. 在DOS中,有两个环境变量可以跟当前路径有关,一个是%cd%, 一个是%~dp0. 这两个变量的 ...
- Apache Kafka系列(四) 多线程Consumer方案
Apache Kafka系列(一) 起步 Apache Kafka系列(二) 命令行工具(CLI) Apache Kafka系列(三) Java API使用 Apache Kafka系列(四) 多线程 ...
- 接口的作用(C#)
C#中的接口(Interface)对于很多初学者来说是个很容易迷糊的东西,使用起来很简单,无非就是定义接口,接口里面包含一些属性.索引器.事件和一些没有修饰符的方法,也没有方法的具体实现代码:然后在类 ...
- 遇到local variable 'e' referenced before assignment这样的问题应该如何解决
问题:程序报错:local variable 'e' referenced before assignment 解决:遇到这样的问题,说明你在声明变量e之前就已经对其进行了调用,定位到错误的地方,对变 ...
- position属性absolute和relative理解
relative:相对于自身静态位置进行定位,不脱离流. absolute:绝对定位,脱离流,如果父元素定义了position属性,无论是absolute.relative还是fixed,都是相对于父 ...