C语言指针要详细了解有啥好的资料提供吗( 二 )
Proc1: 寻找expr中的变量,如果存在变量则将他命名为p,如果表达式中的*号和p在同一个括号下,就把表达式中p和他离得最近的*号包起来,看成是一个变量X,即让X代表(*p), 以X为主变量中心书写expr,expr变成exprX的形式;否则令X=p,exprX = expr 。然后进入Proc2;Proc2:如果exprX的形式中和X同括号层下前面还是有*号存在,则令temp = RecognizeExpr(exprX)将exprX表达式替换为{(=\u0026gt;type(temp)) X},否则exprX保持不变。进去Proc3;Proc3:令result_expr=exprX,返回,算法结束#。算法存在的一个小bug
进行指针表达式的类型推导过程中,可能会遇到以下两种形式的表达方式:
case1 变量名和*号在同一个括号嵌套层中,例如void(*p)(int, int) ;case2 变量名和*号不在同一个括号嵌套层中,例如void(*)(int, int) p;本质上case1 和 case2说的是一件事,但是按照上面的算法case2的类型推导结果将变成是void(*)(int, int),我们还是无法得知他到底是什么的指针。。。。由于我水平有限,只有case1的表达方式我才能给出一个自洽的类型推导流程算法,为了补救这一种情况,于是这里给出第五个约定约定
约定5 如果在推导的过程中遇到case2的情形的表达式,即expr = {T(*) p},这里T(*)代表的是带有*号但是在相同的括号层不存在变量名的表达式,那么p的类型就是T(*),至于T(*)的具体类型是什么,这时需要再进行一次类型推导,定义_expr={T(*_p)},将_expr带入RecognizeExpr演算,然后p的类型就等价于是_p的类型了,即(=\u0026gt;type(RecognizeExpr(_expr)))这种类型。这个算法说起来很啰嗦,但是其实执行起来很简单,以下给出几个例子,在例子的解释中,可能会不完全严格按照上面的算法流程的每一个细节描述,否则真的太啰嗦了。。。
案例1 int* p;
step1 令expr = {int* p} 执行RecognizeExpr(expr);
step2 按照Proc1中的要求,把*p包起来变成X,获得新表达式exprX={int X} ,进入Proc2;
step3 按照Proc2中的要求,由于exprX中没有*号,所以进入Proc3;
step4 按照Proc3中的要求,result_expr = exprX 返回,RecognizeExpr(expr)子算法结束;
step5 对result_exprX使用type函数获得类型int;
step6 变量p的类型即为(=\u0026gt;int),即指向int类型的指针,指针类型识别结束。#
案例2 int** p;
step1 令expr = {int** p} 执行RecognizeExpr(expr)
step2 按照Proc1中的要求,把*p包起来变成X,获得新表达式exprX = {int* X},进入Proc2
step3 按照Proc2中的要求,由于exprX中有*号,于是先RecognizeExpr(exprX)
step4 求result_exprX=RecognizeExpr(exprX)的子过程
Step4_1 按照Proc1中的要求,先找到变量名字是X然后用pp作为记号表示,于是表达式变成了{int* pp},把*pp包起来变成XX,获得新表达式exprXX={int XX},进入Proc2Step4_2 由于exprXX中没有*号,所以进入Proc3Step4_3 result_exprX = exprXX 返回,RecognizeExpr(exprX)子算法结束。step5 按照Proc2中的要求,对result_exprX使用type函数获得类型(=\u0026gt;int)
step6 按照Proc2中的要求,将exprX重新定义成{(=\u0026gt;int) X},进入Proc3
step7 按照Proc3中的要求,result_expr = exprX 返回,RecognizeExpr(expr)子算法结束;
step8 对result_exprX使用type函数获得类型(=\u0026gt;int);
step9 变量p的类型即为(=\u0026gt;(=\u0026gt;int)),即指向一个指向int类型指针的指针,指针类型识别结束。#
这里再给出一个函数指针识别的简单例子
案例3 void (*p)(int, int)
step1 令expr = {void (*p)(int, int)} 执行RecognizeExpr(expr);
step2 按照Proc1中的要求,把*p包起来变成X,获得新表达式exprX={void(X)(int, int)} ,进入Proc2;
推荐阅读
- OC为何跌出语言榜前十
- dart这编程语言现在发展怎么样了,语法与Java,c#很相似,甚至更简洁
- 人民车市|新语言、新起点,捷达VS7 强势入局
- C语言 指针引用数组的地址问题
- 零基础入门学习啥语言好
- 营销型外贸网站用哪种建站程序和语言比较好呢主要是适合优化,可扩展兼容性,安全性,后期网站扩展升级
- 花生|血压高的人,吃花生是降血压还是升血压?医生详细做出解答
- 有哪些轻易就被识别的淘宝刷单评论语言
- 国内自主品牌|红旗H9用谁的发动机?详细拆解之后,请正视国产的实力
- C语言指数函数代码
