您当前的位置: 首页 > 
  • 1浏览

    0关注

    322博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

void* data 数据类型参数以及void *data[ ]解释

森明帮大于黑虎帮 发布时间:2022-07-11 15:03:00 ,浏览量:1

文章目录
  • 一、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             
关注
打赏
1664288938
查看更多评论
0.0525s