1   1  /  1  页   跳转

[讲义] 教你理解复杂的C指针

教你理解复杂的C指针

如何解读复杂指针声明呢?右左法则是一个既著名又常用的方法。
原文:The right-left rule: Start reading the declaration from the innermost parentheses, go right, and then go left. When you encounter parentheses, the direction should be reversed. Once everything in the parentheses has been parsed, jump out of it. Continue till the whole declaration has been parsed.

译文如下:

右左法则:首先从最里面的圆括号看起,然后往右看,再往左看。每当遇到圆括号时,就应该掉转阅读方向。一旦解析完圆括号里面所有的东西,就跳出圆括号。重复这个过程直到整个声明解析完毕。


我的博客:http://www.echodjb.com
                     

                          echodjb@gmail.com
分享到:
gototop
 

回复: 教你理解复杂的C指针

1.        int (*func)(int *p);

首先找到那个未定义的标识符,就是func,它的外面有一对圆括号,而且左边是一个*号,这说明func是一个指针,然后跳出这个圆括号,先看右 边,也是一个圆括号,这说明(*func)是一个函数,而func是一个指向这类函数的指针,就是一个函数指针,这类函数具有int*类型的形参,返回值类型是 int。
2.  int (*func)(int *p, int (*f)(int*));

func
被一对括号包含,且左边有一个 *号,说明func是一个指针,跳出括号,右边也有个括号,那么func是一个指向函数的指针,这类函数具有int *和int (*)(int*)这样的形参,返回值为int类型。再来看一看func的形参int(*f)(int*),类似前面的解释,f也是一个函数指针,指向的函数具有int*类型的形参,返回值为int。

最后编辑灵魂の低调 最后编辑于 2010-07-19 21:11:28
我的博客:http://www.echodjb.com
                     

                          echodjb@gmail.com
gototop
 

回复:教你理解复杂的C指针

3.      int (*func[5])(int *p);
func 右边是一个[]运算符,说明func是一个具有5个元素的数组,func的左边有一个*,说明func的元素是指针,要注意这里的*不是修饰func的, 而是修饰func[5]的,原因是[]运算符优先级比*高,func先跟[]结合,因此*修饰的是func[5]。跳出这个括号,看右边,也是一对圆括 号,说明func数组的元素是函数类型的指针,它所指向的函数具有int*类型的形参,返回值类型为int。
我的博客:http://www.echodjb.com
                     

                          echodjb@gmail.com
gototop
 

回复:教你理解复杂的C指针

4.  int (*(*func)[5])(int *p);

func 被一个圆括号包含,左边又有一个*,那么func是一个指针,跳出括号,右边是一个[]运算符号,说明func是一个指向数组的指针,现在往左看,左边有 一个*号,说明这个数组的元素是指针,再跳出括号,右边又有一个括号,说明这个数组的元素是指向函数的指针。总结一下,就是:func是一个指向数组的指 针,这个数组的元素是函数指针,这些指针指向具有int*形参,返回值为int类型的函数。
我的博客:http://www.echodjb.com
                     

                          echodjb@gmail.com
gototop
 

回复:教你理解复杂的C指针

5.        int (*(*func)(Int *p))[5];
func是一个函数指针,这类函数具有int*类型的形参,返回值是指向数组的指针,所指向的数组的元素是具有5个int元素的数组。
我的博客:http://www.echodjb.com
                     

                          echodjb@gmail.com
gototop
 

回复:教你理解复杂的C指针

6.        要注意有些复杂指针声明是非法的,例如:

int func(void) [5];

func是一个返回值为具有5个int元素的数组的函数。但C语言的函数返回值不能为数组,这是因为如果允许函数返回值为数组,那么接收这个数组的内容的 东西,也必须是一个数组,但C语言的数组名是一个右值,它不能作为左值来接收另一个数组,因此函数返回值不能为数组。

int func[5](void);

func是一个具有5个元素的数组,这个数组的元素都是函数。这也是非法的,因为数组的元素除了类型必须一样外,每个元素所占用的内存空间也必须相同,显 然函数是无法达到这个要求的,即使函数的类型一样,但函数所占用的空间通常是不相同的。
我的博客:http://www.echodjb.com
                     

                          echodjb@gmail.com
gototop
 
1   1  /  1  页   跳转
页面顶部
Powered by Discuz!NT