void和void*指针的解析
2017-01-07 11:18
281 查看
前段时间看了篇文章讲到了C语言中void的用法细节,但是只是进行了说明并未进行实例分析也没有说明C++中void是否有区别,因此今天我在这里详细说明一下void的一些细节。分析结果皆来自代码分析,并未查阅相关技术文档,如有错误请指正。
void的定义:void在C和C++是一种数据类型,意为“空指针”。
void类型在C语言中:无法定义
void类型变量,无论是cl还是gcc编译器都会对void类型变量的声明报错,因此不存在void类型赋值等方面的问题。但是void指针的定义是有效的,毕竟void*的使用应该很广泛相关代码:
在cl编译器下会报错如图:
在gcc编译器下正常运行并且可以看出void的长度是4个字节但并不敢断言void的长度和int长度相同,而且在gcc下可以对void指针进行相关的运算cl下就不行。
同样的代码在C++中运行,结果基本和C语言下相同唯一不同是G++会有警告:
下面的代码是错误的:
无论是gcc还是cl都会报错:
c++得到的结果一样
void指针的使用一般多用于函数中,特别是函数指针大多都定义为void*;
类似于
这样可以让函数适用于多种数据类型(C++貌似已经不太需要)
按找上述代码编译会出错但是如果将fun(void)中的void去掉C语言编译将不受影响,但C++仍报错,所以对于一般编程尽量将void加上
void的定义:void在C和C++是一种数据类型,意为“空指针”。
void类型在C语言中:无法定义
void类型变量,无论是cl还是gcc编译器都会对void类型变量的声明报错,因此不存在void类型赋值等方面的问题。但是void指针的定义是有效的,毕竟void*的使用应该很广泛相关代码:
#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*类型无法转换为其它类型指针,而且仅限指针之间转换下面的代码是错误的:
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作为函数参数时
#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*的使用可以使代码更具通用性
相关文章推荐
- 关于c语言和C++中void和void*指针解析
- void及void指针含义的深刻解析
- void及void指针含义的深刻解析
- void及void指针含义的深刻解析
- 关于void编程规范、void*(指针)、(void*)类型转换的详解
- 指针的本质2-void和void*及其应用在nginx中的应用
- void及void指针含义的深刻解析
- void及void指针含义的深刻解析
- void及void指针含义的深刻解析
- void及void指针含义的深刻解析
- C++ Primer 学习笔记与思考_7 void和void*指针的用法
- void及void指针含义的深刻解析
- void及void指针含义的深刻解析
- void及void指针含义的深刻解析
- void及void指针含义的深刻解析
- void及void指针含义的深刻解析
- 【转】void 和 void指针 深刻解析
- void和void指针解析(原)
- void及void指针含义的深刻解析
- void及void指针含义的深刻解析