先说优先级:
() 、 [] 优先于 *
c语言声明优先级规则。(摘自于《C专家编程》第三章)
A、声明先从它的名字开始读取,然后按照优先级依次读取。
B、优先级从高到低:
B.1:声明被括号括起来的部分
B.2:后缀操作符:
括号()表示是一个函数,方括号[ ]表示是一个数组
B.3:前缀操作符:星号* 表示“指向.....的指针”
C、如果有const和volatile 关键字的后面紧跟类型说明符(例如:int 、char),那么它作用于类型说明符
在其他情况下,const和volatile关键字作用于它左边紧邻的指针星号。
举例:
⒈ int( * fun() )( )
适用规则 解释
A 变量名为 fun
B2 后缀操作符(优先级 括号大于星号) 所以fun和()先结合,fun()表示一个函数
B3 前缀操作符 fun()在和*结合,fun()表示一个函数,*fun()表示该函数返回一个指针
B1 *fun()被括号括起来了。( *fun() )
B2 后缀操作符 ( *fun() )后面接了一个() 表示是一个函数,而*fun()返回一个指针,所以 该指针指向一个函数
这个函数返回值类型为int 类型。
最后 连起来说: fun是一个函数,该函数返回一个指针,这个指针指向另外一个函数,这个另外的函数返回值为int 类型。
意思就是: 函数可以返回一个指向函数的指针。
⒉int (*foo() )[ ]
适用规则 解释
A 变量名为 foo
B2 后缀操作符 foo()表示一个函数
B3 前缀操作符 *foo()表示该函数返回一个指针
B1 ( *foo() )
B2 括号后面为[ ]表示是一个数组,foo()函数返回一个指针,该指针指向一个一维数组 这个一维数组元素类型为int类型
意思就是 函数可以返回一个指向数组的指针。
⒊int (*foo[ ])( )
foo是一个数组,数组里面的元素都为 指针类型,这个每个指针都指向一个函数。 数组里面可以有函数指针。
⒋ int foo[ ][ ]
foo是一个数组,数组里面的元素都为一维数组。很多教科书,把二维数组都化成方格来表示,这样只是为了好看,其实在内存中都是顺序排列
看一个复杂的:
char * const * (* next) ( )
next 是一个指针,该指针指向一个函数,该函数返回一个另外一个指针,另外的这个指针指向只读的指向char类型的指针。另外的这个指针是二级指针。
char *(* c[10] )(int **p)
c是一个数组,数组元素都是指针,这10个指针指向函数(函数指针),函数返回的是指向char类型的指针。注意int **p 是函数的参数。