1.说实话:C语言的字符指针、数组指针、指针数组、数组传参和指针传参,多注意就可以搞定,实在不行C++也可以逃过去;但是函数指针,函数回调不行;尽管C++有仿函数可以逃过去,但是绝对跑不了,Linux也是如此;我从头开始学,学到C++最后,以及LInux也没跑了;还是得重新洗牌,重新来;望大家注意;
2.函数指针
- #include
- void test(int,int)
- {
- printf("hehe\n");
- }
- int main()
- {
- printf("%p\n", test);
- printf("%p\n", &test);
-
- void (*pf) (int,int)=&test;
- //返回类型; *pf是个指针; 参数
-
-
- return 0;
- }
-
- //函数名是函数的地址;
- //&函数名也是函数的地址;
- 如果我要把函数的地址存起来,那么应该怎样写
2.1练习;
- //练习
-
- void test(char* pc,int arr[10])
- {}
-
- int main()
- {
- void (*pf)(char*, int [10]) = test;
-
- void (*pf)(char*, int []) = test;//不写10也可以
-
- void (*pf)(char*, int*) = test;//数组的本质是指针
-
- return 0;
- }
2.2调用
- #include
-
- void test(int a,int b)
- {
- printf("hello Linux\n");
- }
- int test1(int a)
- {
- return a;
- }
- int main()
- {
- void (*pf)(int,int) = test;
- int (*pf1)(int) = test1;
- pf(1, 2);
-
- int m = pf1(2);
- int n = (*pf1)(2);//这两种都可以,加*一定要带括号;
-
- printf("%d\n",pf1(2));
-
- return 0;
- }
2.3练习
- (*(void (*)())0)();
-
- //void (*)() ——指针类型
- //()0 强转
- //把0强转成该函数指针类型的指针,并调用0地址处的函数;
- //调用0地址处的函数;
- //signal是一个函数声明;
- //signal函数有2个参数,第一个参数类型是int,第二个参数类型是void(*)(int)函数指针类型
- //第二个函数指针指向的函数有一个int类型的参数,返回类型是void
- //signal 返回类型也是 void(*)(int)函数指针类型,函数指针指向的函数有一个int类型的参数,返回类型是void
- //signal返回的是一个函数指针;
- int main()
- {
- void (*signal(int, void(*)(int)))(int);
-
- //结合typedef的解释再变
- typedef void(*p)(int);
- p signal(int ,p); //但是非常不好理解;
-
- return 0;
- }
2.4 typedef
2.4.1重命名:这个很常见,将一个长的名字改成短的
typedef int datatype ;
2.4.2使用typedef 定义结构体
- tepedef struct
- {
- int id;
- }student;
2.4.3使用typedef 定义指针类型
- typedef int (*p)[10] ; //定义数组类型;p是数组类型;
-
- typedef void(*pf)(int ,int); //定义函数指针类型 pf是函数指针类型名
-
- //本来是typedef void(*)(int ,int) pf; //把函数指针类型重定义为pf
- //这样写是错的,语法不允许,所以把pf放 * 后
2.5那么函数回调,就是在此基础上,把函数当成变量参数,输入到另一个函数中调用,叫做函数回调;