看懂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> ...
随机推荐
- Can not issue data manipulation statements with executeQuery().解决的方法
query是查询用的,而update是插入和更新,删除修改用的. executeQuery()语句是用于产生单个结果集的语句,如select语句,在什么情况下用,当你的数据库已经保存了数据后,要进行查 ...
- node的包管理工具:yarn和npm
arn是Facebook发布的一款依赖管理工具,它比npm更快.更高效. NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题. 一.yarn官方网站: 英文官网:ht ...
- Vue内容分发slot
前面的话 为了让组件可以组合,需要一种方式来混合父组件的内容与子组件自己的模板.这个过程被称为 内容分发 (或 “transclusion” ).Vue实现了一个内容分发 API,参照了当前 Web ...
- lodash框架中的chunk与drop函数源码逐行分析
lodash是一个工具库,跟underscore差不多 chunk函数的作用: 把一维数组,按照固定的长度分段成二维数组 如: chunk( [ 10, 20, 30, 40 ], 2 ) 结 ...
- 数据结构中常见的树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)
树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树: 如: BST树 ...
- Ext.NET加入自定义验证JS函数
ExtJS验证很方便,在使用FormPanel的时候,我们可以很方便的进行验证.比如设置必填项.正则.字段类型等等.比如如下所示: 上面的验证是这么写的: 1 2 3 <Listeners> ...
- python 项目中的 requirements.txt
背景 java项目的话,包依赖一般都是maven管理,当然还有gradle,对于包的管理非常方便,maven的话只要在pom.xml中添加依赖包的maven坐标就可以了的,那python呢 ? 解决方 ...
- DRAM(MT48LC8M32B2)学习
Micron公司,型号为MT48LC8M32B2的DRAM,其86PIN的 TSOP封装引脚定义 Micron公司,型号为MT48LC8M32B2的DRAM,其86PIN的 TSOP封装引脚定义如上图 ...
- STL中的二分查找———lower_bound,upper_bound,binary_search
关于STL中的排序和检索,排序一般用sort函数即可,今天来整理一下检索中常用的函数——lower_bound , upper_bound 和 binary_search . STL中关于二分查找的函 ...
- python代码`if not x:` 和`if x is not None:`和`if not x is None:`
转自 http://blog.csdn.net/sasoritattoo/article/details/12451359 代码中经常会有变量是否为None的判断,有三种主要的写法: 第一种是`if ...