Loading... <div class="tip inlineBlock info"> 直接把我的一篇知乎回答搬过来了,原问题问的是`const int **pp2`的含义是什么 </div> 这类问题有一个确定的解决方法,不过我发觉在中文语境下几乎没有人知道。 可以使用["Clockwise/Spiral Rule"](http://c-faq.com/decl/spiral.anderson.html)解决,暂且翻译为“**螺旋修饰**规则”吧。 原文: There are three simple steps to follow: 1. Starting with the unknown element, move in a spiral/clockwise direction; when encountering the following elements replace them with the corresponding English statements: [X] or []=> Array X size of... or Array undefined size of...(type1, type2)=> function passing type1 and type2 returning...*=> pointer(s) to... 2. Keep doing this in a spiral/clockwise direction until all tokens have been covered. 3. Always resolve anything in parenthesis first! ## 例1 简而言之,我们从变量名开始顺时针螺旋吸收符号,每个新的符号总是对当前已有的类型进行修饰。例如: ![](https://zclll.com/usr/uploads/2022/06/1786302129.jpg) 那么str就会逐步被解读: 1. 这是一个“有十个元素的数组” 2. 数组元素为指针 3. 指针指向的类型为char类型 然后我们就知道str是一个“包含十个char*元素的数组”。 ## 例2 涉及到函数会稍微复杂一点,例如: ![](https://zclll.com/usr/uploads/2022/06/3689518024.jpg) 此时的情形复杂一些,但是我们依然按照螺旋规则解读即可: 1. fp是一个指针(当我们第一个螺旋向右时,遇到括号就会回头,因此遇到fp左侧的*) 2. 它指向参数为int, float*的函数 3. 返回一个指针 4. 返回的指针指向char类型参数 此时我们也可以组成一个结果“fp是一个指向返回char *且接受参数int, float的函数的指针* ”。但我们注意到,这种说法非常拗口,而上述的解读过程已经足够我们使用了。**有时我们没必要用一句话去描述一个复杂的指针变量,而是拆分成递归的理解形式也没什么不好。** 所以,分析题主的问题: ```cpp const int **pp2 ``` 注意到pp2右侧没有符号,因此螺旋规则实际上 **此时等价于从pp2向左拓展** ,得到的结果是: 1. pp2是个指针 2. 它指向一个指针 3. 这个指针指向的是int类型 4. 这个int类型是const修饰的 也就是说,const在此处修饰的是int。 更复杂的例子和情形,我们可以在《K&R》第二版当中找到。 练习题: ```cpp int const* const t[10] ``` 中,两个const修饰的含义是? © 允许规范转载 打赏 赞赏作者 赞 5 如果觉得我的文章对你有用,请随意赞赏
3 条评论
我爱你⌇●﹏●⌇
推荐一个在线 infer C++ 变量类型的网站:https://cdecl.org
答案:最右侧的const指明数组中的指针是const的,左侧的const指明指针指向的对象是const的(此时const int和int const含义相同)。