C: 读懂Pointer声明格式

来源:互联网 发布:无限接收器软件下载 编辑:程序博客网 时间:2024/05/21 18:40

以下大部份内容都是转载,间中加插个人理解。

如有兴趣者,请叁考以下原址:
http://www.cquestions.com/2009/11/how-to-read-complex-pointers-in-c.html

要看懂的Pointer声明格式Golden Rule:优先权和连结方向

Golden Rule:优先权和连结方向

切记(), []是有第一优先权,其次才是*号。
它,在看明pointer声明时,拥有决定性的作用。

(),代表一个function。
[],代表一个Array。
*,代表pointer。
Identifier,代表变量名子。
Data type,代表什麽类型

以上都是一个声明所会拥有的element。

Associative,即是声明的连结方向。
它,在看明pointer声明时,拥有决定性的作用。

当看到()或[]或*时,脑海里就要补上一个方向,如:
“–>()”,”<–*”

但其实,只要记得“<–*”就可以了,* 就是右到左。

当知道Golden Rule,就能应用了。

例子1:

char (* ptr)[3]

分析:
第一就是要看清楚优先权,当自己是电脑,哪个先处理。
以上例子有三部份,
1. char
2. (* ptr)
3. [3]
2,3有相同优先权,哪先处理哪个?
就是看连结方向!!
(),[]是左到右,所以,先处理2,然後3。

之後,no.2 中,要再深入分析。*和 ptr,先处理哪个?

*拥有优先权,所以先处理*。

总结就是以下的次序:

这里写图片描述

ptr 是一个 pointer,这个pointer指向一个3个element的数组。
而这个数组是char type的。

其实就是解答了三个问题:
1. ptr是什麽?
2. pointer指向什麽?
3. 数组又是什麽的data type

例子2:

char * ptr[3]

分析:
如果是没加上括号,那这个声明又是另一回事了。

例子有三部份,
1. char
2. *
3. ptr[3]

[]有优先权,所以会先处理3,然後2,最後1。

ptr是一个3个element数组,数组的datatype是一个pointer,而这个pointer是指向一个char类型的。

简单来讲,就是声明一个装上了pointer的数组。

例子3:

int ( * ( * ptr ) [ 5 ] ) ( )

分析:
虽有点复杂,但也不难。处理方式一样。
有三部份。
1.int
2.(* ( * ptr ) [ 5 ] )
3.()

()同等优先,但()左到右原则,会先处理2。
处理NO. 2.
* ( * ptr ) [ 5 ]
这个简单,跟例子1很相似。

ptr是一个pointer,它指向一个5个element的数组。
而数组装了pointer。

而这个pointer又指向什麽?
No.3 告诉你了, 指向一个function。

最後就是这个function 有一个 int的 return type。

简单来讲,就是ptr指向一个数组,数组装有指向function的pointer。

转载的网上还有更多例子。有兴趣者可看一看。

总结

要看明白,就是问自己问题,然後根据Golden Rule次序来解答。见到*,就要问自己它指向什麽,见到[],就要问自己数组的类型是什麽,见到(),就要问自己function的return type是什麽,存入的parameter是什麽。

猩猩喜欢由右走到左。

0 0
原创粉丝点击