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

</pre> 前段时间看了篇文章讲到了C语言中void的用法细节,但是只是进行了说明并未进行实例分析也没有说明C++中void是否有区别,因此今天我在这里详细说明一下void的一些细节。分析结果皆来自代码分析,并未查阅相关技术文档,如有错误请指正。<span style="white-space:pre"></span>void的定义:void在C和C++是一种数据类型,意为“空指针”。<h1><span style="font-size:12px"><span style="white-space:pre"></span>void类型长度在C语言中:</span></h1><span style="font-size:12px"><span style="white-space:pre"></span>无法定义void类型变量,无论是cl还是gcc编译器都会对void类型变量的声明报错,因此不存在void类型赋值等方面的问题。但是void指针的定义是有效的,毕竟void*的使用应该很广泛</span><h2><span style="font-size:12px"><span style="white-space:pre"></span>相关代码:</span></h2><pre code_snippet_id="1710380" snippet_file_name="blog_20160607_2_1556825" name="code" class="csharp"><pre name="code" class="cpp">#include <stdio.h>

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编译器下会报错如图:

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

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

void*的实际应用

void*有一个特性,任何数据类型的指针可以无错误的转换为void*类型,但是void*类型无法转换为其它类型指针,而且仅限指针之间转换
下面的代码是错误的:
<pre name="code" class="cpp">#include <stdio.h>

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作为函数参数时

<pre name="code" class="cpp">#include <stdio.h>

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*的使用可以使代码更具通用性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值