- 一、void 的作用
- 二、void 指针的使用规则
- 三、代码示例
-
void 在英文中作为名词的解释为 “空虚、空间、空隙”,而在 C 语言中,void 被翻译为"无类型",相应的
void *
为"无类型指针"。 -
void *
似乎只有"注释"和限制程序的作用,当然,这里的"注释"不是为我们人提供注释,而是为编译器提供一种所谓的注释。
void data[ ]是个什么鬼?
1、先来解决形如 type name[ ]的问题。这里有一个比较实在的推断方法
-
int buf[48]
,指的是一个数组有48个元素,每个元素都是int类型 -
char buf[48]
,指的是一个数组有48个元素,每个元素都是int类型
需要注意先表述元素个数再表述元素类型,这么表述的情况下就会容易理解数组里带指针的情况:
-
int *buf[48]
,指的是一个数组有48个元素,每个元素都是int类型,因此这个是包含有48个int 类型数据的数组; -
char *buf[48]
,指的是一个数组有48个元素,每个元素都是char*类型,因此这个是包含有48个char *类型数据的数组;
由此我们就能知道, 对于void *data[ ]
,我们先分析[ ],再分析void *
,可知,这个是包含了若干个void *类型的数组。
为什么说是若干,因为[ ]里面未指定具体的数字。我们在定义数组时有这么一种定义形式,如 int buf[ ] ={0,1,2,3,4};
如果[ ]里不指定具体的大小,则大小由实际赋值的内容决定,这种通配的形式会比较灵活。
这么来解答这个问题是不是有点耍流氓,其实还有理论基础的:在运算符的优先级中,[ ]运算符的优先级是处于第一级的,而运算符作为一元运算符时,优先级处于第二级,作为乘法运算符时,处于第四级,[ ]的优先级高于,因此在和[ ]同时出现时,我们应该先考虑[],再考虑,上述推断的方法也只是提供了一个方便记忆的方法;
2 、有关void 类型的困惑
确定了void *data[ ]
是一个包含由若干个void *
指针的元素的数组外,又有了新的问题,那么void *又是个什么鬼?
从多方查阅资料得知:void *
有如下的特性:
-
void指针是一种没有类型的指针。
-
任何指针都可以赋值给void指针。
-
void指针转换为其他指针时需要进行类型转换。
-
void指针由于不确定类型不能解引用。
因此,可以这么说,void *
的存在就是为了通配各种参数类型的,如果在一个函数的参数列表中有个void *
的参数,那么给它传入任何类型的指针参数都是正确的。
3、引发血案的罪魁祸首
那么void*
也讲清了,那么参数列表中出现void *data[ ]
时,到底该传入什么参数呢?
来讨论下如下的函数场景。
void func1(void *_data0[ ]);
然后有一个int类型的数组: int data[10]={0};
如何给这个函数传参呢?我们都知道数组名data代表数组的首元素data[0]的地址,data本身是一个指针,那么我们传入的方式是下面的形式吗?
func1(data);
如果是这么传入参数的话,那么如果有一个如下的函数原型
void func1(void * _data0);
这个该怎么传入数据呢?还是func1(data)吗?
如果照这么说,那么 void func1(void *data0[ ]) 和 void func1(void *data0)
是等价的吗?
一时没有搞清楚,到底是不是一样的呢,于是简单的写了如下的测试代码看了下效果:
#include
#include
#include
char a[12] = {0,1,2,3,4,5,6,7,8,9,10,11};
void function1(void *data,int length)
{
char tmp[12] = {0};
memcpy(tmp,data,length);
for(int i = 0 ; i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?