-
void
的含义
void
即“无类型”,
void <
/p>
*
则为“无类型指针”,可以指向任何数据类型。
void
指针使用规范
①void
指
针可以指向任意类型的数据,亦即可用任意数据类型的指针对
void
指针赋值。例如:
int * pint;
void
*pvoid;
pvoid = pint; /*
不过不能
pint= pvoid;
*/
如果要将
pvoid
赋给其他类型
指针,则需要强制类型转换如:
pint= (int
*)pvoid;
②在
ANSIC
标准中,
不允许对
void
指针进行算术运算如
pvoid++
或
pvoid+=1
等,
而
在
GNU
中则允许,
因为在缺省情况下
,
GNU
认为
void
*
与
char
*
一样。
sizeof(*pvoid )==
sizeof( char).
void
的作用
①对
函数返回的限定。
②对
函数参数的限定。当函数不需要返回值时,必须使用
void
限
定。例如:
void func(int, int);
p>
当函数不
允许接受参数时,必须使用
voi
d
限定。例如:
int func(
void)
。由于
void
指针可以指
向任意类型的数据,
亦即可用任意数据类型的指针对
void<
/p>
指针赋值,因此还可以用
void
指针来
作为函数形参,这样函数就可
以接受任意数据类型的指针作为参数。例如:
void * memcpy( void *dest, const
void *src, size_t len );
void * memset( void * buffer, int c,
size_t num);
---
--------------------------------------------------
-------------------------
1.
综述
许多初学者对
C/
C++
语言中的
void
及
voi
d
指针类型不甚理解,
因此在使用上出现了一些错误。
本文将对
void
关键字的深刻含义进行解说,
并详述
void
及
void
指针类型的使用方法与技巧。
的含义
<
/p>
void
的字面意思是“无类型”,
vo
id*
则为“无类型指针”,
void*
可以指向任何类型的数据。
void
几乎只有“注释”和限制
程序的作用,
因为从来没有人会定义一个
void
变量,
让我们试着来定义:
void a;
这行语句编译时会出错,提示“illegal use
of type’void’”。不过,即使
voida
的编译
不会出错,它也
没有任何实际意义。
void
真正发挥的作用在于:
(
1
)对函
数返回的限定;
(
2
)对函数参数
的限定。
众所周知,如果指针
p1
和
p2
的类型相同,那
么我们可以直接在
p1
和
p2
间互相赋值;如
果
p1
和
p2
指向不同的数据类型,则必须使用强制类型转换运算符把
赋值运算符右边的指针类型转换为左
边指针的类型。
例如:
float * p1;
in t*
p2;
p1 = p2;
其中
p1 = p2
语句会编译出错,
提示“’=’:cannotconvertfrom’int *’to’float
*’”,
必须改为:
void *
p1;
int * p2;
p1=(float*)p2;
而
void*
则不同,任何类型的指针都可以直接赋值给它,无需进行强制类型转换:
p1 = p2;
但这
并不意味着,
void*
也可以无需强制类型转换地赋给其它类
型的指针。
因为“无类型”可
以包容“有类型”,
而“有类型”则不能包容“无类型”。
道理很简单,
我们可以说“男人和女人都是人”,
但不能说“人是男人”或者“人是女人”。下面的语
句编译出错:
void * p1;
int * p2;
p2 =
p1;
提示“’=’:cannotconvertfrom’void*’to’int*’”。
的使用
下面给出
void
关键字的使用规则:
p>
规则一如果函数没有返回值,那么应声明为
void
类型
在
< br>C
语言中,凡不加返回值类型限定的函数,就会被编译器作为返回整型值处理。但
是许多程序员却误以为
其为
void
类
型。例如:
add(inta,intb)
{
}
{
return
a+b;
int main(int argc,char
* argv[])
printf(/
}
程序运行的结果为输出:
2+3=5
这说明不加返回值说明的函数的确为
int
函数。
林锐博
士《高质量
C/
C++
编程》中提到:“C++语
言有很严格的类型
安全
检查,不允许上述情况(指函数不加
p>
类型声明)发生”。可是编译器并不一定这么认定,譬如在
Visu
alC++6.0
中上述
add
函数的
编译无错也
无警告且运行正确,所以不能寄希望于编译器会做严格的类型检查。
因此,为了避免混乱,我们在编
写
C/C++
程序时,
对
于任何函数都必须一个不漏地指定其类型。
如果函数没有返回值,
一定要声明为
void
类型。这既是程序良好可读性的需要,
也是编程规范性的要求。另外,加上
void
类型声明后,也可
以发挥
代码的“自注释”作用。
代码的“自注释”即代码能自己
注释自己。
[Page]
规则二如果
函数无参数,那么
应声明其参数为
void
在
C++
语言中声明一个这样的函数:
int
function(void)
{
return1;
}
则进行下面的调用是不合法的:
function(2);
因为在
C++
中,
函数参数为
void
的意思是这个函数不接受任何参数。
我们在<
/p>
TurboC2.0
中编译:
fun()
{
}
{
#include
return1;
main()
printf(/
getchar();
}
编译正确且输出
1
< br>,这说明,在
C
语言中,可以给无参数的函数传送任意类
型的参数,但是在
C++
编
译
器
中
编
译
同
样
的
代
< br>码
则
会
出
错
。
在
C++
中
,
不
能
向
无
参
数
的
p>
函
数
传
送
任
何
参
数
,
出
错
提
< br>示
“’fun’:functiondoesnottake1paramete
rs”。
所以,无论在
C
还是
C++
中,若函数
不接受任何