首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 数据库 第二书店 程序员

深入理解C语言指针的奥秘


摘录的别人的:

C语言所有复杂的指针声明,都是由各种声明嵌套构成的。如何解读复杂指针声明呢?右左法则是一个既著名又常用的方法。不过,右左法则其实并不是C标准里面的内容,它是从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.


这段英文的翻译如下:

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

笔者要对这个法则进行一个小小的修正,应该是从未定义的标识符开始阅读,而不是从括号读起,之所以是未定义的标识符,是因为一个声明里面可能有多个标识符,但未定义的标识符只会有一个。

现在通过一些例子来讨论右左法则的应用,先从最简单的开始,逐步加深:

int (*func)(int *p);

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

int (*func)(int *p, int (*f)(int*));

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

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

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


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

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

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

func是一个函数指针,这类函数具有int*类型的形参,返回值是指向数组的指针,所指向的数组的元素是具有5个int元素的数组。

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

int func(void) [5];

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

int func[5](void);

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

作为练习,下面列几个复杂指针声明给读者自己来解析,答案放在第十章里。

int (*(*func)[5][6])[7][8];

int (*(*(*func)(int *))[5])(int *);

int (*(*func[7][8][9])(int*))[5];

实际当中,需要声明一个复杂指针时,如果把整个声明写成上面所示的形式,对程序可读性是一大损害。应该用typedef来对声明逐层分解,增强可读性,例如对于声明:

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

可以这样分解:

typedef int (*PARA)[5];
typedef PARA (*func)(int *);

这样就容易看得多了。



他们设置了哪些标签:


0000057 1 9 a C C&C++ C/C++ C/C++语言 C/C++指针 C++ C++-深入理解C语言指针的奥秘 CC Cprogramming c详解 c语言 c语言学习 C语言指针 c语言指针的用法! C指针 C指针详解 c指针学习 c指针与经典傻根 pointer Programming VC zy 编程 不错 计算机 技术 技術知識類 深入理解C语言 深入理解C语言指针的奥秘 语言 找工作前看 指针

谁收藏了这个网址:


wangling21908收录

时间:2007-10-14 18:04:50 | 相关网摘

liuwei830420收录

时间:2007-11-25 20:56:30 | 相关网摘

linwubin1982收录

时间:2007-12-4 8:23:45 | 相关网摘

wlcbh收录

时间:2007-12-26 9:27:53 | 相关网摘

shadowjl收录

时间:2008-1-5 12:01:12 | 相关网摘

nudter401收录

使用标签:C/C++,时间:2008-1-8 13:00:30 | 相关网摘

gazi945收录

时间:2008-1-8 15:41:54 | 相关网摘

bluecll收录

使用标签:C++,时间:2008-1-8 16:03:09 | 相关网摘

lynn45收录

时间:2008-1-8 18:59:32 | 相关网摘

IBMloats1911收录

使用标签:指针,时间:2008-1-8 20:56:40 | 相关网摘

gaoluwei1984收录

时间:2008-1-8 22:11:06 | 相关网摘

freelaotu收录

时间:2008-1-8 23:59:46 | 相关网摘

sp1006收录

时间:2008-1-9 8:29:47 | 相关网摘

bingyuanaike收录

时间:2008-1-9 11:42:23 | 相关网摘

susoft2007收录

时间:2008-1-9 12:00:09 | 相关网摘

spirit_only收录

使用标签:C,时间:2008-1-9 13:34:58 | 相关网摘

vision_n收录

时间:2008-1-9 13:35:01 | 相关网摘

Intad收录

时间:2008-1-9 14:15:36 | 相关网摘

rosegrim收录

使用标签:C++,时间:2008-1-9 15:41:16 | 相关网摘

C语言指针,深入理解C语言指针的奥秘

excignjord收录

时间:2008-1-9 16:24:20 | 相关网摘

garasmc收录

时间:2008-1-9 17:14:48 | 相关网摘

baogangwang收录

时间:2008-1-9 17:23:27 | 相关网摘

xy3311303收录

时间:2008-1-9 19:16:22 | 相关网摘

qingnavy收录

时间:2008-1-9 20:23:03 | 相关网摘

eggqq007收录

时间:2008-1-9 21:01:05 | 相关网摘

mangwenzhu1982收录

时间:2008-1-9 21:18:50 | 相关网摘

rucandu收录

时间:2008-1-9 21:22:36 | 相关网摘

llbird_xjtu收录

时间:2008-1-9 22:20:21 | 相关网摘

mingyuezhaotianshan收录

时间:2008-1-9 23:35:13 | 相关网摘

zhyh1985623收录

使用标签:c详解,时间:2008-1-10 8:10:16 | 相关网摘

成为内存里的一个地址。 要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的 类型,指针的值或者叫指针所指向的内存区,还有指针本身

zbing0203收录

使用标签:C语言指针,时间:2008-1-10 9:10:15 | 相关网摘

C语言指针C语言指针

huntsmanydw收录

时间:2008-1-10 12:25:04 | 相关网摘

指针,

williams_feng收录

时间:2008-1-10 14:24:38 | 相关网摘

zhangzhh05收录

使用标签:深入理解C语言指针的奥秘,时间:2008-1-10 15:05:27 | 相关网摘

指针的奥秘

lan_vivian收录

时间:2008-1-10 16:47:26 | 相关网摘

wwt87收录

时间:2008-1-10 21:59:47 | 相关网摘

fantasky收录

时间:2008-1-10 22:29:14 | 相关网摘

it_rocket收录

时间:2008-1-10 22:33:55 | 相关网摘

fsy412收录

使用标签:深入理解C语言指针的奥秘,时间:2008-1-10 22:51:01 | 相关网摘

指针的奥秘

lgl99收录

使用标签:c, 指针,时间:2008-1-11 9:13:50 | 相关网摘

tangliang0611收录

时间:2008-1-11 14:40:51 | 相关网摘

Jackie2收录

使用标签:深入理解C语言指针的奥秘,时间:2008-1-11 23:20:01 | 相关网摘

指针的奥秘

high_2收录

使用标签:cc,时间:2008-1-12 18:48:16 | 相关网摘

抢!!!!!

NKLoveRene收录

时间:2008-1-13 9:49:35 | 相关网摘

jiangjinsong收录

时间:2008-1-13 13:44:35 | 相关网摘

michney收录

时间:2008-1-13 13:44:44 | 相关网摘

sepugif收录

使用标签:不错,时间:2008-1-13 18:11:23 | 相关网摘

lyyogg收录

时间:2008-1-13 18:14:09 | 相关网摘

azaze1收录

时间:2008-1-13 18:46:24 | 相关网摘

该新指针的类型是TYPE*,它指向的类型是TYPE,它指向的地址就是原指针指向的地址。而

basai2008收录

时间:2008-1-13 19:38:59 | 相关网摘

njdragonfly收录

时间:2008-1-14 9:05:07 | 相关网摘

vincent_1011收录

时间:2008-1-14 15:57:32 | 相关网摘

hmzgz81收录

使用标签:深入理解C语言指针的奥秘,时间:2008-1-14 16:10:56 | 相关网摘

指针的奥秘

itegel84收录

使用标签:指针,时间:2008-1-14 18:20:09 | 相关网摘

深入理解C语言指针的奥秘

DesignParten收录

时间:2008-1-14 21:38:40 | 相关网摘

ustc_ice收录

使用标签:C&C++,时间:2008-1-15 9:41:00 | 相关网摘

wjwwgh收录

使用标签:c/c++,时间:2008-1-15 10:22:25 | 相关网摘

深入理解C语言指针的奥秘

lesgle收录

时间:2008-1-15 10:45:50 | 相关网摘

anshancy收录

时间:2008-1-15 14:20:31 | 相关网摘

jtowerjava收录

使用标签:技术, C/C++, 指针,时间:2008-1-15 21:22:13 | 相关网摘

xk000收录

使用标签:C,时间:2008-1-15 21:43:53 | 相关网摘

lyg_wangyushi收录

时间:2008-1-16 8:08:00 | 相关网摘

lizhenyang收录

时间:2008-1-16 10:33:25 | 相关网摘

billy1985收录

时间:2008-1-16 22:30:27 | 相关网摘

ljfljf2006收录

时间:2008-1-28 18:38:25 | 相关网摘

karavsqq收录

时间:2008-1-29 19:24:05 | 相关网摘

fjkla收录

时间:2008-1-31 2:33:36 | 相关网摘

leon0755收录

时间:2008-2-1 23:44:33 | 相关网摘

xf_lord收录

使用标签:C, 指针,时间:2008-2-9 1:15:37 | 相关网摘

salasay收录

时间:2008-2-18 13:34:21 | 相关网摘

huaideyiban收录

时间:2008-2-21 20:53:42 | 相关网摘

xiangshuiwudu收录

使用标签:Cprogramming,时间:2008-3-14 22:15:02 | 相关网摘

dingxinli收录

使用标签:C, 指针,时间:2008-3-22 16:09:28 | 相关网摘

li602714收录

时间:2008-4-15 9:44:45 | 相关网摘

jizhouli2收录

使用标签:指针,时间:2008-4-20 22:32:46 | 相关网摘

Michael_Hee收录

使用标签:VC,时间:2008-5-17 0:31:23 | 相关网摘

bluen收录

时间:2008-5-18 23:47:12 | 相关网摘

hbclc收录

时间:2008-6-9 21:01:33 | 相关网摘

liuborama收录

时间:2008-7-9 16:41:52 | 相关网摘

yangkunjie收录

时间:2008-8-3 15:57:50 | 相关网摘

zouqingfang收录

时间:2008-8-31 21:20:45 | 相关网摘

llhyy17收录

时间:2008-9-1 11:16:04 | 相关网摘

Coldbloodedspecter收录

时间:2008-9-1 14:11:10 | 相关网摘

starliustar收录

时间:2008-9-1 19:48:05 | 相关网摘

深入理解C语言指针的奥秘

zyx_hawk收录

时间:2008-9-2 9:36:32 | 相关网摘

Repeaterbin收录

时间:2008-9-2 14:13:59 | 相关网摘

easyfox收录

时间:2008-9-2 14:55:26 | 相关网摘

clq271520093收录

使用标签:c语言,时间:2008-9-2 15:35:35 | 相关网摘

fgq841103收录

时间:2008-9-2 17:07:48 | 相关网摘

johnpinechenchen收录

时间:2008-9-2 18:32:13 | 相关网摘

shkaka2008收录

时间:2008-9-2 19:44:38 | 相关网摘

shuchuanyu收录

时间:2008-9-2 19:48:33 | 相关网摘

train0714收录

时间:2008-9-2 21:40:26 | 相关网摘

Huchisha1029收录

时间:2008-9-2 21:52:02 | 相关网摘

magic_feng收录

时间:2008-9-3 0:18:29 | 相关网摘

vangur收录

时间:2008-9-3 1:36:58 | 相关网摘

nalnait收录

使用标签:深入理解C语言指针的奥秘,时间:2008-9-3 8:50:48 | 相关网摘

深入理解C语言指针的奥秘

panfengsoftware收录

时间:2008-9-3 9:09:39 | 相关网摘

xu_zhixiang收录

时间:2008-9-3 9:31:56 | 相关网摘

wuhao198411收录

时间:2008-9-3 9:45:45 | 相关网摘


网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
Copyright © 2000-2008, CSDN.NET, All Rights Reserved