void 类型指针
void 数据类型是空的数据类型,表示没有数据类型
void =>空类型
void* =>空类型指针
void* 空类型指针只存储地址的值,丢失类型,只知道是地址,但是不知道地址是什么类型地址,这样也就无法访问。要访问其值,我们必须对这个指针做出正确的类型转换,然后再可以间接引用指针。可以赋值,在没转换之前不能进行算数运算
其它类型指针转换为void *指针
隐式自动转换,不需要强制转换
也就是赋值:
string name=“Maike”;
void * str = &name;
void *类型指针转换为其它类型指针
需要强制类型转换
string name = “name”;
//void* 转换为其它指针类型
void *str1= &name;
string *str2 = (string *)str1;
cout << *str2 << endl;
*str2输出的结果:name
函数指针
函数是一个变量,也有地址,函数保存在内存中的栈区,既然函数有地址,如果知道了函数的地址,那么就可以通过指针进行访问
函数指针的用法
1、函数指针的定义
将函数声明取过来,然后用括号括起函数名,将函数名改为指针,后面的函数参数可以只写数据类型,参数可以省略,但是建议写,
例如:
函数:int swap(void* a, void* b) ;
此函数返回值是int类型,所以定义一个int类型的函数指针,星号要和变量名一起用括号括起来
如此定义:int (p_name)(void a, void b) ;
(p_name):可以理解为把swap函数名改为指针名(p_name),p_name就是一个指向函数的函数指针变量。
(void a, void b):是函数的参数
然后这个函数指针变量就可以指向int类型,参数为(void* a, void* b)的函数。
2、函数指针的赋值
和指针操作一致,
1、取函数的地址
如:int (p_name)(void a, void* b)
p_name = &swap;
2、直接赋值
p_name = swap;
两种方式一样,在下文会有例子
3、函数指针的调用
函数指针调用方式有两种
第一种:括号括住函数指针变量,再使用解引,解引就是拿到函数体,像函数调用一样,括号传参
(p_name)((void)&a, (void*)&b);就等同于swap( (void*&a, (viod*)&b);
第二种:不使用解引,也不用括号括住指针变量名
p_name( (void*)&a, (void*)&b);
如下的示例:
int swap(void* a, void* b) {
int* a1 = (int*)a;
int* b1 = (int*)b;
int tmp = *a1;
*a1 = *b1;
*b1 = tmp;
cout << "调用函数int swap(void* a, void* b)" << endl;
return 0;
}
int main() {
int a = 9;
int b = 22;
//1、定义函数指针
int (*p)(void* a, void* b);
//指针变量定义以后,用法和普通指针一样
//2、给函数指针赋值
p = &swap;
//3、函数指针的调用
(*p)((void*)&a, (void*)&b);
//或者(*p)(&a, &b);其他类型指针可自动转换为void*
cout << "a的值:" << a << endl;
cout << "b的值:" << b << endl;
system("pause");
return 0;
}
typedef自定义函数指针类型
函数体:int ddoftream(char frame ,int len);
函数参数是char 和int 类型,返回值是int类型
定义了一个函数指针变量pFunc,它可以指向这样的函数:返回值为int,形参为char*、int
int (*pFunc)(char *frame, int len);
定义函数指针类型:定义函数指针类型,必须使用typedef,方法就是,在“定义函数指针变量”加上typedef,将原来的函数体名改为自定义的类型名
typedef int (*pFunc_t)(char *frame, int len);
这个用法很简单,就在函数指针变量前加上typedef就可以了,这样pFunc_t就是自定义的类型,是一个函数指针类型
比如:
int ddoftream(char *frame ,int len);
typedef int (*pFunc_t)(char *frame, int len);
int main(){
char name[] = "krick";
int afd = 100;
pFunc_t func_p; //定义了一个函数指针变量,这个变量类型是参数是char * 和int
//通过func_p调用ddoftream()函数
func_p = ddoftream;
(*func_p)(name, afd);
return 0;
}
func_p = ddoftream;等同于func_p = &ddoftream;这里要注意,pFunc_t是我们自定义的函数指针类型,然后定义了一个变量pFunc_t func_p,即func_p,这里我们直接等于func_p = ddoftream,不是函数调用ddoftream(),这个是有区别的,直接等于函数名的作用是取函数名的地址,也可以使用取地址符&,如func_p = &ddoftream;