时间: 下载该word文档
1. 概述
许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上 出现了一些错误。本文将对 void 关键字的深刻含义进行解说,并 详述 void 及 void 指针类型的使用方法与技巧。 2. void 的含义
void的字面意思是 无类型” void *则为 无类型指针” void *可以指向任何类 型的数据。
void 几乎只有 “注释”和限制程序的作用,因为从来没有人会定义一个 void 变 量,让我们试着来定义:
void a; 这行语句编译时会出错,提示 “ illegal use of type 'void' 。不过,即”使 void a 的编译不会出错,它也没有任何实际意义。 void 真正发挥的作用在于: (1) 对函数返回的限定; (2) 对函数参数的限定。
我们将在第三节对以上二点进行具体说明。
众所周知,如果指针pl和p2的类型相同,那么我们可以直接在 pl和p2间 互相赋值;如果 p1 和 p2 指向不同的数据类型,则必须使用强制类型 转换运算符把赋值运算符右边的指针类型转换为左边指针的类型。 例如: float *p1; int *p2; p1 = p2; 其中 p1 = p2 语句会编译出错, 提示“ '=' : cannot convert from 'int *' to 'float *' , 必须改为: p1 = (float *)p2; 而 void *则不同,任何类型的指针都可以直接赋值给它, 无需进行强制类型转换: void *p1; int *p2; p1 = p2; 但这并不意味着, void *也可以无需强制类型转换地赋给其它类型的指针。因 为“无类型”可以包容 “有类型”,而“有类型”则不能包
容“无类型”。道理很简单,我们可以说 “男人和女人都是人 ”,但不能说“人是男人 或者 “人是女人 ”。下面的语句编译出错:
void *p1; int *p2; p2 = p1; 提示 “'=' : cannot convert from 'void *' to 'int *' 。 ” 3. void 的使用
下面给出 void 关键字的使用规则:
规则一 如果函数没有返回值,那么应声明为 void 类型
在 C 语言中,凡不加返回值类型限定的函数,就会被编译器作为返回整型值 处理。但是许多程序员却误以为其为 void 类型。例如: add ( int a, int b
{
return a + b; }
int main(int argc, char* argv[] {
printf ( "2 + 3 = %d", add ( 2, 3 ; }
程序运行的结果为输出:
2 + 3 = 5 这说明不加返回值说明的函数的确为 int 函数。
林锐博士《高质量C/C++编程》中提到:“ C+语言有很严格的类型安全检查, 不允许上述情况(指函数不加类型声明发生 ”。可是编译
器并不一定这么认定, 譬如在 Visual C++6.0 中上述 add 函数的编译无错也无警 告且运行正确,所以不能寄希望于编译器会做严格的类型检查。
因此,为了避免混乱,我们在编写 C/C++程序时,对于任何函数都必须一个 不漏地指定其类型。如果函数没有返回值,一定要声明为 void 类
型。这既是程序良好可读性的需要,也是编程规范性的要求。另外,加上 void 类型声明后,也可以发挥代码的 “自注释 ”作用。代码的 “自注 释”即代码能自己注释自己
规则二如果函数无参数 ,那么应声明其参数为 void 在 C++ 语言中声明一个这样的函数:
int function(void {
return 1; }
则进行下面的调用是不合法的:
function(2; 因为在 C++ 中,函数参数为 void 的意思是这个函数不接受任何参数。 我们在 Turbo C 2.0 中编译:
#include "stdio.h" fun( {
return 1; }
main( {
printf("%d",fun(2; getchar(; }
编译正确且输出 1,这说明,在 C 语言中,可以给无参数的函数传送任意类型 的参数,但是在 C++ 编译器中编译同样的代码则会出错。在 C++
中,不能向无参数的函数传送任何参数,出错提示 “'fun' : function does not take 1 parameters 。”
所以,无论在C还是C++中,若函数不接受任何参数,一定要指明参数为void。 规则三