C语言声明的优先级规则--如何看懂复杂的声明语句 - graybull's Blog

C语言声明的优先级规则--如何看懂复杂的声明语句

graybull posted @ 2013年3月04日 20:16 in C/C++ with tags c typedef declaration priority , 3441 阅读
  • C语言声明的优先级规则
  • 解读一个复杂例子char* const *(*next)();
  • 使用typedef

C语言复杂的声明语句,总是让人很头痛。这里,我摘录了《C专家编程》的一段内容,来简要地阐述以下如何看懂这些复杂的东东。

举例:char * const * (*next) ();  //请问这是神马意思?

如果你对此还有疑问,请看下文。

C语言声明的优先级规则

A 声明从它的名字开始读取,然后按照优先级顺序依次读取;

B 优先级从高到低依次是:

    B.1 声明中被括号括起来的那部分;

    B.2 后缀操作符:

          括号()表示这是一个函数,而

          放括号[]表示这是一个数组;

    B.3 前缀操作符:星号*表示这是一个“指向...的指针”;

C 如果const和(或)volatile关键字的后面紧跟类型说明符(如int,long等),那么它作用于类型说明符。在其他情况下,它作用于关键字左边紧邻的指针星号。

按照规则解读 char * const * (*next) ();

首先,(*next) 表示next是一个指针,它指向某个东西;

根据B.2和最右边的括号,next指向一个函数,即它是一个函数指针;

根据B.3,第二个星号表示,该函数返回一个指针;

char * const是函数返回的指针所指向的类型;

char* 是字符指针;

const修饰第左边的星号,即字符指针是常量的,该指针不可修改(该指针指向的字符内容是可修改的);

综合地表述为,next是一个指针,它指向一个函数,该函数返回一个指针,该指针指向一个类型为char的常量指针。

使用typedef

typedef可以为一个类型起一个别名。使用typedef可以简化以上声明哦,让我们来看看。

typedef char* ptrchar;

typedef const ptrchar * ptrReturn;

typedef ptrReturn (* ptrfunc) ();

那么next可被声明为:ptrfunc next; 

等价于char * const * (*next) ();

 

 

Avatar_small
依云 说:
2013年3月04日 23:57

cdecl> explain char * const * (*next) ();
declare next as pointer to function returning pointer to const pointer to char

Avatar_small
seo service london 说:
2024年2月22日 00:44

Thanks for posting this info. I just want to let you know that I just check out your site and I find it very interesting and informative. I can't wait to read lots of your post


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter
Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee