笔记:C复杂函数指针/指针函数写法 - 草稿

开始

注意()和[]的优先级比*高。所以先会跟前者结合。

//指针函数:返回值是指针类型的函数。
int *func();
//他的返回值类型是int *
//----
//`函数指针`:指向函数的指针
int *(*pFunc)();
//指向原型为:int func()函数的指针

//`指针数组`:数组的每个元素都是指针类型
int *a[10];

//数组指针。元素10个
int (*a)[10];

函数指针和指针函数看起来都长的很像。到底怎么判断它是一个指针还是一个函数原型?


判别它到底是指针还是数组还是函数

前面说过。注意*()的优先级不一样。从名称开始看。根据它的结合。判断它属于哪种情况(函数指针数组)。再细分

例如

int  *a[3];

[]优先级高。先结合。判定a是一个数组。那么接下来就判断它元素类型了。也就是剩下的int *,该数组的元素是指针类型,也就是int *;

int (*a)[3];

a被括号()包裹了。那么先和a结合。判定a是个指针。再继续的话。就到了优先级高的[3]。说明指针a指向的是一个数组。剩下就是数组元素的类型。int,也就是a指向的数组的是 int xx[][3];

那么对于一个函数指针呢
首先找到它的名称p。看到(*p)可以确定p是一个指针。然后跟这一块结合的是()。说明指向函数,p是一个函数指针。最后一步看这个函数的返回值类型。也就是int

int (*p)();

写复杂的类型变量的步骤

1.确定变量名p(此处有口误,函数不是变量,应该说确定名称p,以下就不改过来了)

2.确定变量(名称)是函数、数组、还是指针

()[]的优先级比高。如果是指针且存在与前面的符号组合。必然有(p)。用括号括起来。让它先和*组合。则判断类型是指针类型。如果是数组或者函数则直接p[10]或者p()

3.如果是数组。判别顺序是

元素个数(多少维数组)->元素类型
比如说int *a[3]。已经判断a[3]是个数组了。用大A代替它。则int *A。用A代表数组整体。*和它结合。它是指针类型。剩下的int。说明它是int指针。那么整个结合起来就是a是一个具有3个元素元素类型为int *的 一维数组

4.如果判别为函数。那么顺序是

函数分为三部分组成
1.函数名
2.返回值
3.参数表
4.函数体(如果是声明的时候,并没有函数体,只是写出一个函数的原形,就好像下面这样的)

int *fun(int,int);
//这是一个函数
//fun先和()结合,参数有两个,类型均为int,把fun(int,int)替换成一个整体FUN
int *FUN;
//把FUN看做是函数的返回值,那么确定下FUN的类型,*FUN,它是个指针类型,
//int *FUN,说明他是int的指针类型,一级指针,也就是int *


可以用替代的方法去简化当前的复杂指针定义或者是函数声明等等,举个例子

int  (*fun(int a,int (*b)(int) ))();

先看int a很明显是个形参了,所以,我们先去看fun
fun先和()结合,它应该是一个函数声明,参数表我们先不管他,把参数表的东西看成是ARG,一个整体,也就是int a,int (*b)(int),然后就成了

int  (*fun(ARG))();

再细化,把函数和参数表看成一个整体FUN,也就是fun(ARG)这部分,FUN可以看做是函数返回值的替代了,下一步就该判断返回值的类型

int (*FUN)();

这样看,FUN先跟*结合,说明FUN是一个指针,然后接着它跟()结合,说明这是一个函数指针,把(*FUN)这部分用FUNB来替代,这样更容易看出,FUN指向函数的原形

int FUNB();

这样我们就找到了函数原形为int xx();

总结一下

int  (*fun(int a,int (*b)(int) ))();

这是一个函数声明,它有两个参数,ab,它其实可以写成(不要参数名称只写类型)

int  ( *fun(int ,int (*)(int)) )();

这个函数的返回值是一个函数指针,这个指针指向的函数原形是int xx();

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容