第十二课
1,右左法则
右左法则用于解决如何辨识一个声明;
方法:1 ,首先从最里面的圆括号( 应该是未定义的标识符) 看起;
2 ,然后往右看,再往左看。
3 ,每当遇到右圆括号时,就应该调转阅读方向。
4 ,一旦解析完圆括号里面所有的东西,就跳出圆括号。
5 ,重复这一过程,直到整个声明解析完毕。
2,int(*p[5])(int *);
分析:
1 ,在中间看到* p, 明白是一个指针;
2 ,向右,看见一个数组
3 ,明白数组里存的是指针
4 ,跳出中间的圆括号,
5 ,向右,有参数列表,说明数组里面存的是函数指针
6 ,向左,明白这是一个参数为int * , 返回值为int 的函数指针
清晰写法:
typedef int ( * pFun) ( int * ) ;
pFun p[ 5 ] ;
3,int (*fun)(int * p,int (*pf)(int *));
清晰写法:
typedef int ( * PF) ( int * ) ;
typedef int ( * PFUN) ( int * , PF pf) ;
4,int (*( * fun)[5])(int *p);
分析:
1 ,fun是一个指针,二维数组指针
2 ,指向的是一个存储函数指针的数组
清晰写法:( 事例)
#include <stdio.h>
int a ( int * p)
{
printf ( "%d" , * p) ;
}
typedef int ( * PFUN) ( int * ) ;
int main ( )
{
int n = 999 ;
int * x = & n;
PFUN p[ ] [ 5 ] = { a } ;
PFUN ( * pa) [ 5 ] = p;
pa[ 0 ] [ 0 ] ( x) ;
return 0 ;
}
5,int (*( *fun)(int *p))[5];
分析:
1 ,fun是一个指针,函数指针
2 ,函数的返回值是一个指向数组的指针
3 ,数组的每个元素都是int
清晰写法:
typedef int ( * PARR) [ 5 ] ;
typedef PARR ( * PFUN) ( int * ) ;
事例:
#include <stdio.h>
int arr[ ] [ 5 ] = { 999 } ;
PARR reArr ( int * p)
{
return arr;
}
int main ( )
{
PARR parr= reArr ( NULL ) ;
printf ( "%d" , parr[ 0 ] [ 0 ] ) ;
return 0 ;
}
6,int( * ( *pfun() ) ( ) ) ( );
分析:
1 ,pfun是一个函数,不是指针,外面都是它的返回值
2 ,返回的是指针,返回的是函数指针
3 ,返回的函数指针的返回值,又是一个函数指针
清晰写法:
typedef int ( * PFUNt) ( ) ;
typedef PFUNt ( * PFUNm) ( ) ;
事例:
#include <stdio.h>
int a1 ( )
{
printf ( "1" ) ;
}
PFUNt a2 ( )
{
printf ( "2" ) ;
return a1;
}
PFUNm a3 ( )
{
printf ( "3" ) ;
return a2;
}
int main ( )
{
a3 ( ) ;
printf ( " " ) ;
a3 ( ) ( ) ;
printf ( " " ) ;
a3 ( ) ( ) ( ) ; 输出3 32 321
return 0 ;
}