第十二课
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;
}