函数指针,函数指针数组,函数返回值为函数指针
函数的名字就是函数的首地址:定义函数指针;
int (*p)(int )
p为函数指针变量名字,int 为函数的返回值类型为int型;(int)为函数的形参类型为int型,
注:因为优先级所以要用(*p),否则就会p先和后面的()结合为int*p(int),意思就变为p(int)函数的返回值为int*
注:main2()函数中 int (*p[])(int ,int ) 为一维数组,下面写错了,
#include<stdio.h> #include<stdlib.h> int add(int a, int b) { return a + b; } int sub(int a, int b) { return a - b; } int multiplition(int a, int b) { return a*b; } int dive(int a, int b) { return a / b; } void main1() { int(*p(int, int))(int, int);//p(int,int)函数的返回值类型为int(*)(int ,int)(函数指针类型) system("pause"); } void main2() { int a = 10; int b = 20; //定义一个二维函数指针数组 int(*p[])(int, int) = { add, sub, multiplition, dive };//【】内可以写数组 的长度,也可以不写,和普通数组一样的 //用函数指针掉用函数 printf("%d", p[1](a, b)); //通过遍历函数指针调用函数和遍历数组一样的 for (int i = 0; i < 4; i++) { printf("%3d", p[i](a, b)); } //因为*(p+i)和p[i]是等价的所以: for (int(**ps)(int, int) = p; ps < p + 6; ps++) { printf("%3d", (*ps)(a, b)); } //int(*p)(int ,int ) //int (*p[])(int ,int) //int(**p)(int ,int ) system("pause"); } void main33() { //int a[3]={1,2,3} //int (*p[])(int,int)={add, sub, multiplition, dive } //a和p都是常量,所以不能a=a,p=p //int *pa=(int[]){1,2,3};这是在栈上开辟内存 //int(**pt)(int ,int)二级函数指针,存储函数指针数组名 //函数指针数组类型为int(*[])(int,int) int(**pp)(int, int) = (int(*[])(int, int)){ add, sub, multiplition, dive }; for (int i = 0; i < 4; i++) { //这两种方法是 printf("%3d", pp[i](100, 10)); //printf("%d\n", (*(pp + i))(100, 10)); } system("pause"); } void main44() { //在堆上开辟内存 int(**pp)(int, int) = malloc(4 * sizeof(int(*)(int, int))); //对每个数组元素分别赋值; *pp = add; *(pp + 1) = sub; *(pp + 2) = multiplition; *(pp + 3) = dive; //分别调用 for (int i = 0; i < 4; i++) { printf("%3d", (*(pp + i))(100,20)); } system("pause"); } //普通指针,数组 和 函数指针,函数指针数组 //int *p int (*p)(int ,int ) //int*p[4] int (*p[])(int ,int ) //int **p int (**p)(int ,int) //typedef 简化书写 //先定义变量, 类型+变量名 //typedef 类型+变量名 //变量名就是类型的别名 // int X; typedef int X; // int Y[10]; typedef int Y[10]; //int(*Z)(int, int); typedef int(*Z)(int, int); //int(*W[])(int, int); typedef int(*W[])(int, int); //int (**PP)(int ,int ) typedef int(**PP)(int, int); void main55() { X x1; Y y1; Z z1; W w1 = { add, sub, }; PP pp1 = (W){ add, sub }; printf("%3d", sizeof(w1)); system("pause"); } //int (** x( int (*z)(int ,int),int,double ) )(int); // x( int (*z)(int ,int),int,double ) //x()函数的形参为int (*z)(int ,int),int,double // int (*z)(int ,int)为函数指针 //int (** )(int) 是函数返回值类型 //x的返回值二级函数指针,参数,有一个函数指针,int,double, //x是一个函数 //z函数指针 //int (*p)[5];//指向数组的指针 //int *p[5];//数组,每一个元素是一个指针 //int( *p[5])(int, int);//函数指针数组 //int( (*(p))[5])(int, int);//指针指向函数指针数组 void main() { int(*p[5])(int, int); int(*(*p)[5])(int, int);//指向 函数指针数组的指针, //*p为一个指针,int(*[5])(int, int)为函数指针数组就好理解了, system("pause"); }