(一)基本概念

void 类型:空类型,用于特殊目的的没有操作,也没有值的类型。不能被显式或隐式的转换为任意非空类型,可以通过强制类型转换为void类型。

void指针:指向任何对象的指针都可以转换为void*类型指针,且不会丢失信息。在ANSI C使用类型void*代替char*作为通用指针的类型。

(二)使用方法

1. void的使用

第一种是:对函数返回的限定

在不加返回值类型限定的情况之下,编译器会将其处理为整型的类型。例如以下的情况:

#include <stdio.h>
// 参考了别人写void的例子,但是这个例子十分形象
// 的表明了不加返回类型值限定时,编译器的处理规则。
add (int a, int b) 
{ 
    return a + b; 
}
 
int main(int argc, char* argv[]) 
{ 
    printf("2 + 3 = %d", add (2, 3)); 
    return 0;
}

对于每个函数,我们都要明确的指定其返回值的类型。该void的时候,就void。不要省略不写,这回带来大麻烦

第二种:对函数参数的限定

当函数不允许接受参数时,必须使用void限定。例如以下两种情况:

在C语言下:

#include <stdio.h>
// 以下两个函数都可以进行正常的编译,不会报错。
// C的容忍度还是很大的。。。
int func()
{
    return 1;
}
 
int func1(void)
{
    return 1;
}
 
int main(int argc, char* argv[]) 
{ 
    printf("%d\n", func(2)); 
    printf("%d\n", func1(2)); 
    return 0;
} 

运行结果

在C++语言下:

#include <iostream>
 
int func()
{
    return 1;
}
int func1(void)
{
    return 1;
}
int main(int argc, char* argv[]) 
{ 
    std::cout << func(1) << std::endl;
    std::cout << func1(1) << std::endl;
    return 0;
} 

运行结果

在C语言中,可以给无参数的函数传送任意类型的参数,但是在C++编译器中编译同样的代码则会出错。在C++中,不能向无参数的函数传送任何参数。

2. void指针的使用

在《C++ primer》中,对void指针的作用做了阐述:与另一指针比较;向函数传递void指针或从函数返回void指针;给void指针赋值。

由于void指针可以指向任意类型的数据,亦即可用任意数据类型的指针对void指针赋值,因此还可以用void指针来作为函数形参,这样函数就可以接受任意数据类型的指针作为参数。

以下摘至sgi stl中的代码片段:

/* __n must be > 0      */
static void* allocate(size_t __n)
{
  void* __ret = 0;
 
  if (__n > (size_t) _MAX_BYTES) {
    __ret = malloc_alloc::allocate(__n);
  }
  else {
    _Obj* __STL_VOLATILE* __my_free_list
        = _S_free_list + _S_freelist_index(__n);
    // Acquire the lock here with a constructor call.
    // This ensures that it is released in exit or during stack
    // unwinding.
    ifndef _NOTHREADS
    /*REFERENCED*/
    _Lock __lock_instance;
    endif
    _Obj* __RESTRICT __result = *__my_free_list;
    if (__result == 0)
      __ret = _S_refill(_S_round_up(__n));
    else {
      *__my_free_list = __result -> _M_free_list_link;
      __ret = __result;
    }
  }
 
  return __ret;
}

/* __p may not be 0 */
static void deallocate(void* __p, size_t __n)
{
  if (__n > (size_t) _MAX_BYTES)
    malloc_alloc::deallocate(__p, __n);
  else {
    _Obj* __STL_VOLATILE*  __my_free_list
        = _S_free_list + _S_freelist_index(__n);
    _Obj* __q = (_Obj*)__p;
 
    // acquire lock
      ifndef _NOTHREADS
    /*REFERENCED*/
    _Lock __lock_instance;
      endif /* _NOTHREADS */
    __q -> _M_free_list_link = *__my_free_list;
    *__my_free_list = __q;
    // lock is released here
  }
}

对于指针的自增行为,要迎合ANSI C 的规范。在ANSI C中void指针不能自增的,这种行为是一种非法行为,因为未知void的大小。

#include <iostream>
 
int main(int argc, char* argv[]) 
{ 
    int i = 0;
    void *p;
    int *pint;
    int *pint1;
    pint = &i;
    p = pint;
    std::cout << pint << std::endl;
    pint++;
    std::cout << pint << std::endl;
    std::cout << p << std::endl;
    pint1 = (int *)p;
    std::cout << pint1 << std::endl;
    return 0;
} 

运行的结果:

文献参考:

1. 《C++ primer》和《C语言程序设计》

2.http://wenku.baidu.com/view/22c4b8d86f1aff00bed51edc.html这篇文章很出名啊,很多void的文章都是转载这一篇文章的。

C/C++语言void及void指针深层探索
From:      http://dev.yesky.com/340/2517340.shtml

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)对函数参数的限定。

  我们将在第三节对以上二点进行具体说明。

  众所周知,如果指针p1和p2的类型相同,那么我们可以直接在p1和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 *'”。

转载于:https://my.oschina.net/alphajay/blog/60298

void和void指针解析相关推荐

  1. 【转】void及void指针的深刻解析

    void的含义 void即"无类型" ,void*则为"无类型指针",可以指向任何数据类型,所以又叫做"通用指针". void指针使用规范 ...

  2. void及void指针含义的深刻解析

    void的含义 void即"无类型",void *则为"无类型指针",可以指向任何数据类型. void指针使用规范 ①void指针可以指向任意类型的数据,亦即可 ...

  3. 关于空指针(指针指向为NULL)和void类型的指针的理解

    正在学C,书上老说空指针,或者说void指针,对于我这样的生手来说,理解非常容易造成混淆,因为void这个单词的意思也是空,到底空指针的意思是指指向地址为空的类型呢,还是指void类型的指针呢 (1) ...

  4. [转]C/C++语言void及void指针深层探索

    1.概述 许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误.本文将对void关键字的深刻含义进行解说,并详述void及void指针类型的使用方法与技巧. 2 ...

  5. C/C++语言void及void指针深层探索 .

    1.概述 许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误.本文将对void关键字的深刻含义进行解说,并详述void及void指针类型的使用方法与技巧. 2 ...

  6. C语言 void和void *(无类型指针)

    void 关键字 void的字面意思是"无类型",void *则为"无类型指针",void *可以指向任何类型的数据. void几乎只有"注释&quo ...

  7. C++中void和void*指针的含义 (指针类型的含义)

    转载自:http://blog.csdn.net/lee_shuai 指针有两个属性:指向变量/对象的地址和长度,但是指针只存储地址,长度则取决于指针的类型:编译器根据指针的类型从指针指向的地址向后寻 ...

  8. void 类型的指针

    void指针是空类型的指针,也称为无类型的指针,它不指向任何类型,即它仅仅是个地址.因此void指针不能进行指针运算,也不能取其所指向的数据的值 只有将void指针跟其他类型的指针相关联,才能使用他, ...

  9. java.lang 源码剖析_java.lang.Void类源码解析

    在一次源码查看ThreadGroup的时候,看到一段代码,为以下: /* * @throws NullPointerException if the parent argument is {@code ...

  10. static关键字 void和void指针 函数指针

    static关键字 1.作用于变量:    用static声明局部变量-------局部变量指在代码块{}内部定义的变量,只在代码块内部有效(作用域),其缺省的存储方式是自动变量或说是动态存储的,即指 ...

最新文章

  1. php实现按时间排序_按时间排序的问题?
  2. 源路由 小实验 小发现
  3. 服务器mysql显示链接次数太多,服务器mysql显示链接次数太多
  4. 文章用图的修改和排版(2)
  5. python删除连续相同字符_Python 删除连续出现的指定字符的实例
  6. hive的row_number()函数
  7. 初窥JQuery-Jquery简介
  8. c语言井字棋二维数组,【C语言】简单实现三子棋(井字棋)小游戏
  9. Mnist数据集介绍
  10. OneNET协议之LWM2M+CoAP
  11. win10MATLAB如何完全卸载,怎么完全卸载cad_win10彻底卸载cad的图文步骤-系统城
  12. mt6577驱动开发 笔记版 转载请注明出处---crosskernel@gmail.com
  13. css之“css3的新特性”
  14. 轮询查找连接电脑设备IP地址
  15. Ubuntu php安装过程,Ubuntu下Apache+PHP+MySQL安装过程详解
  16. 招行193亿港元收购永隆银行53.1%股份
  17. 蒋勋:知识分子应具备怎样的美学修养
  18. javascript 神经网络
  19. 微信小程序 —— 模块化方法的总结
  20. 高考平行报志愿计算机录取规则,2020年高考平行志愿录取规则大全

热门文章

  1. Thinkphp3.2+ 微信小程序图片上传
  2. ZXing开发彩色二维码
  3. golang 程序休眠_golang package time的用法具体详解
  4. java 数学基础_Java中的基础数学
  5. python怎么理解函数的参数_Python中函数参数理解
  6. 工人与资本家互相养活,主动权在资本家手里
  7. JAVA中如何全局监听鼠标事件
  8. WORD出错:绕排时,字太靠近形状
  9. LINUX下载编译libcurl
  10. 你抢购盐干什么?要抢购也是先选大米啊