指针指向数组问题
int arr1[10];char arr2[10];char *parr[10];//指针数组int(*parr1)[10]=&arr1;int *p=arr1;char *(*pparr[3])[10];//指向数组的指针数组
指向函数的指针
void fun1(char *str){printf("%s\n",str);}void fun2(char *str){printf("%s\n",str);}void fun3(char *str){printf("%s\n",str);}//函数类型均相同(返回值相同,参数类型相同),这些函数可以放到指针数组里int main(){void(*pfun1)(char *p)=fun1;//fun1赋给*pfun1这个指针void(*pfun2)(char *p)=fun2;//fun2赋给*pfun2这个指针void(*pfun3)(char *p)=fun3;//fun3赋给*pfun3这个指针pfun1("fun1");//调用fun1函数pfun1("fun2");//调用fun2函数pfun1("fun3");//调用fun3函数return 0;}
由于这些函数类型都相同,main函数也可这样写
int main(){void(*pfun)(char *p)=fun1;//pfun不断变化调用其他函数pfun=fun1;pfun("fun1");pfun=fin2;pfun("fun2");pfun=fun3;pfun("fun3");return 0;}
由于这些fun函数类型均相同(返回值类型和函数类型),也可用指针数组改写
int main(){void(*pfun[4](char *p)=fun1);//存放4个元素的指针数组void(*pfunarr[4])(char*p);//pfunarr首先是一个数组,函数指针的数组}
指向数组的指针
int fun(char*a,int*b){return 0;}#include{int (*p)(char*,int*);//函数指针 int (*pfun[10])(char*,int*);存放函数指针的数组 int(*(*q)[10])(char*,int*);//能够指向函数指针的数组的指针 //int (*(*pfun)[10])(char*,int*);//pfun指向数组,(*pfun)[10]指向函数,函数类型是 //char*,int* 指向函数指针数组的指针 q=&pfun;//指向函数指针的数组的指针,数组的每个元素也是一个指针 //int(*w)[10];//指向×××数组的指针 return 0;}
相对较复杂的指针
(*(void(*)())0)();
为函数调用,调用0作为函数地址,强制转化为指针
void(*signal(int,void(*)(int)))(int);
函数声明,函数返回值为void,参数类型为int,里面的signal指针,第一个参数为int,第二个为一个函数,返回值void,参数类型int
但是,这样写函数过于麻烦,一般用typedef来改写
int arr[10];typedef int(*parrPtr)[10];
当不加typedef时parrPtr为数组指针变量名,重命名后为这个类型的名
parrPtr p1 = &arr;
例
void fun(char*c, int *i){}//类型重命名typedef void(*pfunPtr)(char*, int*);//调用时pfunPtr p4 = fun;typedef void(*pfunptr2)(int);void(*signal(int, void(*)(int)))(int);
故void(*signal(int,void(*)(int)))(int);可相应改写为
pfunptr2 signal(int,pfunptr2);//指向这个函数的指针pfunptr2(*pfun)(int, pfunptr2) = signal;