欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

再次认识void

程序员文章站 2022-04-08 23:11:25
重新认识void 在初学c/c++时感觉void是一个很不起眼的关键字。因为在c++中我使用的还是比较少的。但是到了Linux中,不论是在内核源码中还是在程序编写的过程中有关void与*的组合随处可见,为了搞清楚、弄明白,具体的原理我写下此博客。 void的定义 void简单描述“无类型”用作限定的 ......

重新认识void

在初学c/c++时感觉void是一个很不起眼的关键字。因为在c++中我使用的还是比较少的。但是到了linux中,不论是在内核源码中还是在程序编写的过程中有关void与*的组合随处可见,为了搞清楚、弄明白,具体的原理我写下此博客。

void的定义

void简单描述“无类型”用作限定的作用。例如:

//限制返回值
void swap(int &a, int &b) //限定函数的返回值为空。
{
   int temp;
   temp = a;
   a = b;
   b = temp;
}
//限制参数类型
int prompt(void) //不需要参数传递
{
   cout<<"到此结束"<<endl;
   return 0;
}

注意:不要允许使用void去定义变量的类型

  • 例如:

#include<iostream>
using namespace std;

int main()
{
void a; //会提示错误 “不允许使用不完整的类型”

return 0;
}

void*表示无类型指针

如果让我描述void*那么可以这样理解,既然是无类型指针那么我们也可以认为任意类型指针,说它是什么类型就是什么类型。为什么这么理解,首先不论是char*,int*,float*等,它们都指向的是一块内存,void*可以指向它们所指向的内存。例如:

//此程序并无实际意义只是做演示用
#include<iostream>
using namespace std;

int main()
{
void* temp; //任意指针类型
int* p_a = new int; //int* 类型
char* p_str = "hello"; //char* 类型

*p_a = 10;
temp = p_a; //viod* 类型指向 int* 类型
cout << *(int*)temp << endl;

temp = p_str; //void* 类型指向 char* 类型
cout << (char*)temp << endl;

delete p_a;
return 0;
}
//打印结果为
//10
//hello
//请按任意键继续. . .

注意:上述例子中存在类型转换的问题,首先void*指针类型指向其他指针类型时不需要强制转换,但是void*转其他指针类型时需要强制转换,如下:

//从上例中摘取的代码
void* temp; //任意指针类型
int* p_a = new int; //int* 类型
*p_a = 10;
temp = p_a; //viod* 类型指向 int* 类型 不需要强制转换
cout << *(int*)temp << endl;//需要用(int*)将temp的viod*转换为int*

看一下linux.11内核源码中在string.h中的应用:

void * memcpy(void * dest,const void * src, int n)

void * memmove(void * dest,const void * src, int n)
/*在实际应用中也许我们能看见使用这两个函数时,第一个个参数不给char*类型时不会报错,是因为在实际源码中他们时"void*"类型的*/