首先void中的void代表一个任意的数据类型,"星号"代表一个指针,所以其就是一个任意数据类型的指针。 对于指定数据类型的指针如int ,double等,他们的sizeof都是4个字节,因为都是一个指针,只是指针指向的数据类型不一致。 C语言是一个强类型的语言, 那么他们之间有什么区别呢 ?前面一篇文章我们说过, 指针+1和-1是和指向数据类型有关的 。 假设指针值为0x00000001,指针类型为int类型,整数为n,则计算出来的结果为0x00000001+ n乘以4,这里的4是因为指针类型为int,如果是double,则为0x00000001+ n乘以8. 所以我们使用double类型指针+1,地址移动了8位,而用int指针+1,地址移动了4位,就是这个道理。 这说起来其实和数据内存对齐有关。你可以把这里的4和8理解为跳跃力。 那对于void呢? 其实就是一个未指定跳跃力的指针 。 那void的跳跃力又什么时候指定?在需要使用的时候指定就可以了,好处: 可以实现泛型编程,节省代码 。 代码如下: 该函数使用一个type来表示当前参数void的类型,内部通过type判断转换的类型。 如malloc函数: 原型: 代码使用: 可以看到malloc返回值类型为void,其只返回分配内存的大小,不关心分配后的内存你是使用int还是double类型进行划分. 注意:函数外部在接收到void格式的返回值时,需要强转为自己的数据类型才能使用。 代码如下: 这其实是可以理解的: void 在未指定类型的情况下,是不能直接使用的, 只有在转换为显示类型后才能使用 。 * 代码如下: 代码中可以看出在未强转为显示类型前,使用void会报表达式必须是指向完整对象类型的指针. 说明void一定要强转后才能使用. 没有强转的void是没有意义的。 那可能有同学要问了,假设我们并不知道当前void数据类型,强转错误了会发生什么事。 此时可以看到虽然pv强转为double后,指针指向的地址和强转为int类型指针指向地址是一样的都是0x0043F724。但是取值后就发生了异常,因为double占用的是8个字节,所以取值的是后8位字节,所以取到的是一个错误的值,实际只有4个字节是有效的。 我们在使用void强转的时候一定要注意这点 、 在C语言中空指针定义方式: 在C++语言中: 代码如下: 代码中可以看出参数void pArgs可以使用任意类型的实参,返回值也可以返回任意类型的指针,但是最终需要转换为具体类型才能使用。 void在C++中的作用其实就是为了实现泛型编程,和Java中使用Object来表示是一样的,所以又称为通用指针和泛指针,不过 C++中大部分情况下会使用模板编程来实现泛型 。 上面_say函数代码可以使用下面模板函数代替: 区别在于: 模板编程不需要将强制转换为具体类型 ,其使用方式如下: 未强转也可以直接得出结果,这是因为模板编程会在编译器帮我们生成具体的函数。 调用了两次_say会分别实现: 所以运行的时候是调用了不同的函数,而使用void的泛型只调用一个函数。 1.void*是一个过渡型的指针状态,可以代表任意类型的指针,取值的时候需要转换为具体类型才能取值。其是处于数据类型顶端的状态:
2.void 使用赋值运算符“=”赋值时,只能将具体类型赋值给void星,不能将void赋值给具体类型。 3.void*一般作为参数或者返回值来实现泛型编程,但是C++中一般考虑使用模板编程来实现。
—— 本文来自火龙信奥(义乌睿码科技):义乌青少年信息学奥赛与编程教育平台,专注 CSP-J/S、NOIP、GESP 竞赛培训,线上线下融合教学,助力编程升学。网址:hlcoding.com