现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

C/C++中的void类型探究

2012-09-02 18:48 工业·编程 ⁄ 共 2313字 ⁄ 字号 暂无评论

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(),这是不好的,有潜在的危险。

程序如下:

#include<stdio.h>
void f1();
void f2(void);
int main(int argc,char *argv[])
{
    int p =10;
    f1(p);//@1
    f2(p);//@2
    return 0;
}
void f1()
{
    printf("f1 I am not receive a parameter./n");
}
void f2(void)
{
    printf("f2 I am not receive a parameter./n");
}

编译器及平台为: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。

下面为一个程序演示:

#include<stdio.h>

void type_less(const void * p,const int cmd);
struct person
{
    int id;
    char * name;
};
int main(int argc, char * argv[])
{
    int i=10;
    double d = 100.001;
    struct person p_person ={1,"sa"};
    void *sa;
    double * pd = &d;
    int *p = &i;
    char * str="liyachao";
    struct person  * pp = &p_person;
   
    type_less(p,1);
    type_less(pd,2);
    type_less(str,3);
    type_less(pp,4);
    return 0;
}
void type_less(const void * p,const int cmd)
{
    int * p_int;
    char * p_char;
    double * p_double;
    struct person * pp;
    switch(cmd)
    {
        case 1:
            p_int  = (int *)p;//转换为int类型
            printf("paramenter int is %d./n",*p_int);
        break;
        case 2:
            p_double = (double *)p;//转换为double类型
            printf("paramenter double is %lf./n",* p_double);
            break;
        case 3:
            p_char = (char *)p;//转换为char *类型
            printf("paramenter char is %s./n",p_char);
        break;
        case 4:
            pp = p;//转换为结构体类型
            printf("person id is %d,name is %s./n",pp->id,pp->name);
            break;
        default:
        break;
    }
}

在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包含着丰富的程序设计哲学,作为一个设计人员,应该对这些,细微的差别进行思考。

给我留言

留言无头像?