1:概述
在C/C++中void类型本意指的是,无类型。就说这个类型,不像int、double那样成为一个可以提供用户正常使用的系统数据类型。如果定义了一个变量如下:
void v;
在Linux中,用gcc编译报错如下:“variable or field 'v' declared void”。
如果定义void类型的指针,如下:
void * p;
在Linux中,用gcc编译,没有问题。
也就是说,void不能用于一般的系统数据类型,但是可以用作指针。其实void的真正用途用在指针上,他可以指向任意类型的指针。
2:void的用途
void主要用在,函数返回类型和函数参数传递和类型转换上。
2.1 函数返回值
如果一个函数没有返回值,则应该声明为void类型,比如:
void f(int p);
有些编译器,在用户没有声明函数的返回值时,系统会自动判断为int类型,但是为了程序的可移植性和安全性,最好显式声明函数的类型。
2.2 函数参数
如果一个函数没有返回值,则应声名为void:比如
int f(void);
通常,我们可以省略为:int f(),这是不好的,有潜在的危险。
程序如下:
编译器及平台为:gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5)
在注释掉@2,只有@1时,运行如下:
f1 I am not receive a parameter.
f1是个没有参数的函数,调用时,传递了参数,程序可以正常运行,这是错误的。
在加上@2时,运行如下:
error: too many arguments to function
这说明,如果没有显示声明参数为void,则会发生意想不到的错误。
2.3 任意类型的参数传递
如果一个函数的参数类型不确定,则可以用void来实现。比如,内存操作的函数原型:
void * memcpy(void *dest, const void *src, size_t len);
void * memset ( void * buffer, int c, size_t num );
前边提到过,void可以用作void指针,可以指向任意类型的数据类型。比如:
int i1 = 10;
int * p = &i1;
void * pv = (int *)p
则,pv就指向了i1。
下面为一个程序演示:
在gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5)下运行如下:
paramenter int is 10.
paramenter double is 100.001000.
paramenter char is liyachao.
person id is 1,name is sa.
总结:
void包含着丰富的程序设计哲学,作为一个设计人员,应该对这些,细微的差别进行思考。