看懂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> ...
随机推荐
- WebApi Ajax 跨域请求解决方法(CORS实现)
概述 ASP.NET Web API 的好用使用过的都知道,没有复杂的配置文件,一个简单的ApiController加上需要的Action就能工作.但是在使用API的时候总会遇到跨域请求的问题, 特别 ...
- swift UITextView内容距离边框边距设置
des_textView.textContainerInset = UIEdgeInsets(top: 5, left: 10, bottom: 5, right: 10) 设置对应的四个边距的值
- gulp前端自动化工作流
gulp前端自动化工作流 为什么要有自动化的流程? 在我们的开发过程中有大量的重复操作 DRY Don't repeat yourself 开发人员的精力应放在哪? 创造,新的一切前端开发的编译操作 ...
- django开发者模式中的autoreload是怎样实现的
在开发django应用的过程中,使用开发者模式启动服务是特别方便的一件事,只需要 python manage.py runserver 就可以运行服务,并且提供了非常人性化的autoreload机制, ...
- android学习ProgressBar的简单使用
android 提供的ProgressBar控件分为两种,一种是不带进度的进度条,一种是带进度的进度条,如果可以计算任务的完成量那么就用带进度条的,如果无法计算任务量,那么就使用不带进度的进度条.Pr ...
- 深入理解Java 虚拟机阅读笔记(一)
1.程序计数器- 占用空间:较小 作用:字节码行号指示器 作用详情:指示指令执行,如(字节码的执行,分支,循环,跳转,异常处理,线程恢复) 特点:线程私有(每个计数器独立计算,上下文相互独立). 2. ...
- Linux工具参考篇(网摘)
Linux工具参考篇 原文出处:[Linux Tools Quick Tutorial] 1. gdb 调试利器 2. ldd 查看程序依赖库 3. lsof 一切皆文件 4. ps 进程查看器 5. ...
- DVWA笔记之二:Command Injection
命令注入 1.Low级别 <?php if( isset( $_POST[ 'Submit' ] ) ) { // Get input $target = $_REQUE ...
- Django更新后的配置修改
问题: Django 升级至1.7.1后,出现urls配置错误. 解决方法总结: 修改urls: 1,加入admin.autodiscover()函数. 2,除了地址admin不做修改外,其余全部删除 ...
- HoloLens开发与性能优化实践
HoloLens中国版终于于5月底在中国上市,同时国内的技术社区经过一年的成长也有了很大的扩张,越来越多的开发者开始进入了HoloLens开发领域,尝试着使用混合现实(Mixed Reality)技术 ...