void *总结

我们更常见的是void的两种使用,如下:
1)void 函数名( 参数 );
2)返回值 函数名( void );

第一种是在函数没有返回值时用void限定,第二种是函数不接受参数时用void限定,如果说void是“拒绝”,那么void *就是“接受”

一)void *是什么?

void *是一种无类型的指针,用来存放地址,在32位系统上占4字节空间,在64位系统上占8字节空间,void *的“无类型”让程序的编写有了极大的灵活性。

二)void *有什么作用?

void *的常见使用场景与void相似,但作用几乎完全相反:
1)void *函数名( 参数 );
例如内存分配函数malloc():

void * malloc(size_t size);

2)返回值 函数名( void * );
例如内存空间释放函数free():

void free(void *ptr);

第一种函数可以返回任意类型的指针而不需要强制类型转换,而第二种函数可以接收任意类型的指针而不需要强制类型转换
例如:

int a = 10;
int *q1 = &a;//int类型的指针存放int类型数据的地址
void *q2 = &a;//void类型的指针存放int类型数据的地址
char *q3 = (int *)&a;//char类型的指针存放int类型数据的地址需要强制类型转换

三)void *操作变量

void *是一种无类型的指针,它与int *char *等指针类型操作变量的方式不同例如:

int a = 10;
int *p_int = &a;
void *p_void = &a;

p_intp_void都是指向int类型的变量a的指针,现在分别用指针p_intp_void将a的值改为7,我们首先会想到这样做:

*p_int = 7;
*p_void = 7;

此时编译器就会报错:
warning: dereferencing ‘void *’ pointer [enabled by default]
error: invalid use of void expression
正确的做法是:

*p_int = 7;
*(int *)p_void = 7;

void *是无类型的指针,在对它赋值时它可以赋值为任意类型的指针而且不用强制类型转换,但是一旦要用它操作变量,就需要告诉它现在它的身份是什么类型的指针,不然它不知道几个字节,也就无法正确取值了,这就是编译器报错的原因,也是为什么要在操作变量时强制类型转换void *为其他类型的指针。

四)void *使用总结

  1. 用于接收或返回不同类型的指针
  2. 在参数个数不确定时可以使用void *类型来接收参数,需要传入多个参数时,将参数封装成结构体,传入结构体指针即可
  3. 在某些特殊情况下,可以传值,也就是用本来放地址的空间来放数据(编译会warning,但并不影响)
  4. 在使用void *指针操作变量时,要强制类型转换void *为其他类型的指针
  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: typedef void(*vector_handle)(void *excinfo) 是在 C/C++ 中定义一种新类型,该类型是一个指向函数的指针,该函数没有返回值,接受一个 void * 类型的参数 excinfo。 例如,可以使用这种类型定义一个函数指针变量: ```vector_handle handler;``` 然后可以将函数地址赋给该变量: ```handler = &my_function;``` 最后,可以通过调用该变量来调用函数: ```handler(excinfo);``` ### 回答2: typedef void(*vector_handle)(void *excinfo,) 这是一个C语言中的typedef语句,用于定义一个函数指针类型 vector_handle。这个函数指针类型可以指向没有返回值(void)且接受一个void指针参数(void *excinfo)的函数。 一般情况下,函数指针可以用来作为函数的参数,也可以用来作为函数的返回值。在这个例子中,我们可以使用 vector_handle 类型的函数指针作为参数传递给其他函数,以便在某些情况下调用该函数指针所指向的函数。 此外,函数指针也可以用作回调函数的机制。当我们在函数中注册一个函数指针,那么在特定的事件发生时,可以调用该函数指针。对于 vector_handle 类型的函数指针,它可以在事件发生时调用该函数指针所指向的函数,并且可以将相关的参数(如异常信息)传递给该函数。 总而言之,typedef void(*vector_handle)(void *excinfo) 这个语句定义了一个函数指针类型,可以用于传递函数指针作为参数或者作为回调函数的机制。 ### 回答3: typedef void(*vector_handle)(void *excinfo,) 是一个 C 语言的 typedef 声明,它定义了一个函数指针类型 vector_handle。 函数指针类型 vector_handle 可以指向一个参数类型为 void* 的函数,该函数的返回类型为 void,该函数可能被用于处理异常信息。 这样的函数指针类型通常用于实现回调函数机制,即在某些特定情况下(例如发生异常),调用者可以通过调用 vector_handle 来处理异常信息。 函数指针类型 vector_handle 的声明为: typedef void(*vector_handle)(void *excinfo,) 这里的 void *excinfo 是一个指向 void 类型的指针,它可以作为函数的参数传递给 vector_handle 所指向的函数。excinfo 可以用来传递异常信息的地址,从而使得处理函数能够获取异常信息并进行相应的处理。 总结起来,typedef void(*vector_handle)(void *excinfo,) 是一个使用函数指针实现异常处理的声明,它定义了一个函数指针类型 vector_handle,该函数指针可以指向一个参数类型为 void* 的函数,该函数的返回类型为 void。函数指针 vector_handle 可以用于处理异常信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值