各种void

来源:互联网 发布:淘宝开网店的详细步骤 编辑:程序博客网 时间:2024/05/15 11:47

1. void


这个不难理解, 就是一个空类型.

1) 可以用在函数, 例如: void fun(int, int)

2) 可以用在函数参数, 例如:void fun(void), int main(void)

3) 可以用来强制类型转换, 例如:#define ZERO (void)0. 

此时ZERO便不能做右值, 也就是说, int a=ZERO这样的语句会出现错误, 编译不了. 但如果将之前两句改为改为

#define ZERO 0;

int a=ZERO;

         则编译器不会出错, 程序也能正常运行, a的值也会变为0;

4) 不能作为数据的类型, 例如: void a; 想定义一个void类型的a变量的时候, 编译器会报错.


2. void *


这个比void稍微难理解, 这是一个万能的指针类型, 而不是空指针类型.

1) 在c的stddef.h或stdio.h里面, 都可以找到这样一段话

#ifndef NULL
#ifdef  __cplusplus
#define NULL    0
#else
#define NULL    ((void *)0)
#endif
#endif

        这段程序定义了NULL这个宏. 关键看红色那一句. 我们都知道NULL代表一个任意类型的空指针,  void *的意思跟NULL也就异曲同工. (void *)后面那个0代表空指针NULL指向的内存地址为0, 外面再套一层括号是因为宏的安全问题(有关c语言的宏的使用问题, 可以百度一下, 这里不展开论述).

2) 我们先看一段程序

#include <stdio.h>
int main()
{
    int *p=new int;
    double *pp=new double;
    void *ppp;


    *p=1;
    *pp=1.1;


    ppp=p;
    printf("%d\n",*(int *)ppp);//强制类型转换为int的指针, 再加*取值


    ppp=pp;
    printf("%lf\n",*(double *)ppp);//强制类型转换为double的指针, 再加*取值
    return 0;
}

         各定义一个int, double和void类型的指针, 把p地址的值赋为1, pp地址的值赋为1.1, 再用万能指针ppp分别指向p的地址和pp的地址, 最后分别输出ppp指针指向的内存地址的值. 

          程序输出结果如下, ppp分别指向了p和pp并把里面的值输出.

        通过程序我们可以简单地了解了一下void *这个万能指针的含义.更多void *的信息请上网百度一下, 这里只是补充了一下网上说得比较少, 但又比较重要的内容

原创粉丝点击