Chinaunix首页 | 论坛 | 博客
  • 博客访问: 40840
  • 博文数量: 13
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 165
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-12 14:18
文章分类

全部博文(13)

文章存档

2011年(1)

2010年(3)

2009年(4)

2008年(5)

我的朋友

分类: C/C++

2008-11-12 15:11:52

用运算优先级分析指针变量定义

       C语言与其他程序设计语言的一个主要区别是指针的广泛应用,指针的灵活运用给编程带来了很大的便利,但是有些指针变量定义复杂,分析起来较困难。对于较复杂的指针变量定义,可以用运算符优先级来分析。对于运算符优先级在此不赘述,直接举例说明。

char (*ptr)[5];

在此,小括号的优先级最高,ptr先与”*”结合——表示ptr是指针变量;然后再与”[5]”结合——说明ptr指向数组,该数组是由5个元素构成的char类型的数组;因而ptr是指向由5个字符组成的数组的指针变量。

int *pa[10];

在此,由于方括号”[]”的优先级高于”*”pa先与”[10]”结合——表示pa是由10个元素构成的数组;然后再与”*”结合——说明数组的元素是指针,所指向的类型是int型;因而pa是由10个指向int的指针构成的数组。

char (*func3)(char *p[]);

在此,func3先与”*”结合——说明func3是指针变量;然后在与”(char *p[])”结合——表示指针指向函数;该函数返回值为char类型,参数为char *p[];因而func3是指向返回char类型的函数的指针变量,该函数的参数是指向char类型的指针数组。

int *func1(int x);

在此,”()”的优先级高于”*”func1就先与(int x)结合在一起,从而说明func1是一个函数,它返回指向int量的指针。

同理,可以分析下面的定义:

int (&k)[10];

按照运算符的优先级,k先和”&”结合——说明k是一个引用;再和”[]”结合——k是数组的引用;该数组是长为10int型数组;所以k是长为10int型数组的引用。

以下摘自“typedef和#define的用法与区别”(http://blog.csdn.net/j260749883/archive/2009/07/05/4322616.aspx)

理解复杂声明可用的“右左法则”:从变量名看起,先往右,再往左,碰到一个圆括号就调转阅读的方向;括号内分析完就跳出括号,还是按先右后左的顺序,如此循环,直到整个声明分析完。举例:
int   (*func)(int   *p);
首先找到变量名func,外面有一对圆括号,而且左边是一个*号,这说明func是一个指针;然后跳出这个圆括号,先看右边,又遇到圆括号,这说明(*func)是一个函数,所以func是一个指向这类函数的指针,即函数指针,这类函数具有int*类型的形参,返回值类型是int。
int   (*func[5])(int   *);
func右边是一个[]运算符,说明func是具有5个元素的数组;func的左边有一个*,说明func的元素是指针(注意这里的*不是修饰func,而是修饰func[5]的,原因是[]运算符优先级比*高,func先跟[]结合)。跳出这个括号,看右边,又遇到圆括号,说明func数组的元素是函数类型的指针,它指向的函数具有int*类型的形参,返回值类型为int。

阅读(1143) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:strtok段错误

给主人留下些什么吧!~~