(C\C++)void 类型指针和函数指针(使用详解)

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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值