1.说实话:C语言的字符指针、数组指针、指针数组、数组传参和指针传参,多注意就可以搞定,实在不行C++也可以逃过去;但是函数指针,函数回调不行;尽管C++有仿函数可以逃过去,但是绝对跑不了,Linux也是如此;我从头开始学,学到C++最后,以及LInux也没跑了;还是得重新洗牌,重新来;望大家注意;
2.函数指针
#include <stdio.h>
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<iostream>
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那么函数回调,就是在此基础上,把函数当成变量参数,输入到另一个函数中调用,叫做函数回调;