关于c语言和C++中void和void*指针解析

前段时间看了篇文章讲到了C语言中void的用法细节,但是只是进行了说明并未进行实例分析也没有说明C++中void是否有区别,因此今天我在这里详细说明一下void的一些细节。分析结果皆来自代码分析,并未查阅相关技术文档,如有错误请指正。void的定义:void在C和C++是一种数据类型,意为“空指针”。

void类型长度在C语言中:

无法定义void类型变量,无论是cl还是gcc编译器都会对void类型变量的声明报错,因此不存在void类型赋值等方面的问题。但是void指针的定义是有效的,毕竟void*的使用应该很广泛

相关代码:

#include 

int main(int argc,char* argv[])
{
	// error: void void_num;
	void*p;

	//voi的长度地址
	printf("void的长度    :%d\n",sizeof(void));   
	printf("void指针的长度:%d\b",sizeof(p));
	printf("void的地址    :%p\n",p);
	p ++;
	printf("void++的地址  :%p\n",p);
	p += 3;
	printf("void + 3的地址:%p\n",p);

	return 0;
}


 
  

在cl编译器下会报错如图:关于c语言和C++中void和void*指针解析_第1张图片

在gcc编译器下正常运行并且可以看出void的长度是4个字节但并不敢断言void的长度和int长度相同,而且在gcc下可以对void指针进行相关的运算cl下就不行

关于c语言和C++中void和void*指针解析_第2张图片

同样代码在C++中运行,结果基本和C语言下相同唯一不同是G++会有警告:

void*的实际应用

void*有一个特性,任何数据类型的指针可以无错误的转换为void*类型,但是void*类型无法转换为其它类型指针,而且仅限指针之间转换
下面的代码是错误的:
#include 

int main(int argc,char* argv[])
{
	int iNum = 12;
	double dNum = 12.00; 
	void* ip = &iNum;
	void* dp = &dNum;
	printf("ip:%d\n",*ip);
	printf("dp:%d\n",*dp);

	return 0;
}


 
   
无论是gcc还是cl都会报错:
       
c++得到的结果一样
void指针的使用一般多用于函数中,特别是函数指针大多都定义为void*;
类似于void *  memcpy(_Out_writes_bytes_all_(_Size) void * _Dst, _In_reads_bytes_(_Size) const void * _Src, _In_ size_t _Size);(摘自stdio.h源文件)
这样可以让函数适用于多种数据类型(C++貌似已经不太需要)

当void作为函数参数时

#include 

void fun(void)
{
	printf("fun\n");
}

int main(int argc,char* argv[])
{
	fun(1);
	return 0;	
}


 
   按找上述代码编译会出错但是如果将fun(void)中的void去掉C语言编译将不受影响,但C++仍报错,所以对于一般编程尽量将void加上 
  

总结

1、void无法作为一种数据类型存在
2、void*在不同环境下行为不同,cl不可寻址运算,gcc下可以寻址也可以运算
3、对于无参数的函数,C语言对接受参数不会做详细的类型检查,尽量加上void
4、void*的使用可以使代码更具通用性

你可能感兴趣的:(关于c语言和C++中void和void*指针解析)