`

void与void*

阅读更多

  记得初学c++时,照葫芦画瓢的写函数时用了void a,这是我遇到的第一个错误。后来初学指针,又在void*上绕了个小弯。也许还会有初学者弄不清voidvoid*,这里简单总结一下。

void是“无类型”

如果函数没有返回值,那么应声明为void类型

如果函数无参数,那么应声明其参数为void

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 *'”。

分享到:
评论

相关推荐

    动态数组实现(所有代码均使用C语言回调函数实现及存储数据均使用void*、void**实现)

    rar文件包含:Vector.h、Vector.c、...存储数据使用void*、void**,其中包括结构体数据结构。主要功能有初始化动态数组、释放动态数组、尾插法、删除指定下标、更新指定下标数据、打印数据、获取数据对应的指定下标等。

    双链表实现(所有代码均使用C语言回调函数实现及存储数据均使用void*、void**实现)

    rar文件包含:DoubleList.h、DoubleList.c、main.c...存储数据使用void*、void**,其中包括结构体数据结构。主要功能有初始化双链表、释放双链表、尾插法、任意插入法、任意删除法、打印数据(从左至右、从右至左)等。

    解决error LNK2005 void __cdecl operator delete(void

    解决error LNK2005 void __cdecl operator delete(void

    C语言void及void指针深层探索.doc

    C 语言中的 void 关键字和 void 指针类型是初学者容易混淆和误解的概念,本文将对 void 关键字的深刻含义进行解说,并详述 void 及 void 指针类型的使用方法与技巧。 void 的含义 void 的字面意思是“无类型”,...

    深入理解void以及void指针的含义

    void的含义void即“无类型”,void *则为“无类型指针”,可以指向任何...②在ANSI C标准中,不允许对void指针进行算术运算如pvoid++或pvoid+=1等,而在GNU中则允许,因为在缺省情况下,GNU认为void *与char *一样。si

    Junit测试Void方法

    Junit通常用于那些有明确返回值的方法的测试,而无法对返回值是void类型的方法进行测试,因为Junit的assert断言方法只适用于预期值与实际值的比较,对于void类型的方法,我们无法从它的return语句获得具体的返回值。...

    void指针void指针void指针void指针

    void指针void指针void指针void指针void指针

    SeqList.cpp

    invalid conversion from `void*' to `SeqList*' 是怎么回事 void *是特殊的指针 所有类型指针都可以付给void *;但是void *类型指针付给其他指针类型需要强制类型转换。 invalid conversion from `void*' to `...

    2440三星测试程序

    (void *)User_Test, "User Test ", (void *)Manual_Register_Set,"Manual Reg. Set ", //Memory (void *)Test_PD6710, "PCMCIA test ", (void *)Test_ISram, "Stepping stone ", //(void *)Test_WaitPin, ...

    void指针小结

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

    关于C++中void*的小作用浅析

    本文主要给大家分享了关于C++中void*的一些你可能不了解的小作用,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 先来看一段代码: #include #include using namespace std; void o(int* x...

    VS2013 调用Windows API获取系统信息

    * 功能 获取并显示本地与系统时间 ************************************************ * void GetLang() * 功能 获取并显示系统的默认语言 ************************************************ * void ...

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

    void及void指针含义的深刻解析,C/c++中void的使用方法。

    void_指针 使用

    只有了解了地址,你才了解计算机。 只有了解了void指针,你才真正了解了

    编写函数void fun(char *s,char *t,char *p)将未在字符串s中出现、而在字符串t中出现的字符, 形成一个新的字符串放在p中,p中字符按原字符串中字符顺序排列,但去掉重复字符。

    编写函数void fun(char *s,char *t,char *p)将未在字符串s中出现、而在字符串t中出现的字符, 形成一个新的字符串放在p中,p中字符按原字符串中字符顺序排列,但去掉重复字符。 例如: 当s为"12345", t为"8624677"时, p...

    用JUnit测试void方法

    Junit 通常用于那些有明确返回值的方法的测试,而无法对返回值是void类型的方法进行测试,因为Junit的assert断言方法只适用于预期值与实际值的比 较,对于void类型的方法,我们无法从它的return语句获得具体的返回值...

    数据结构面试葵花宝典

    void *data; } Element; bool push( Element **stack, void *data); bool pop( Element **stack, void **data); bool createStack(Element **stack); bool deleteStack(Element **stack); bool createStack(Element ...

    void及void指针(C,C++)

    void及void指针(C,C++)

    在VC下运行的俄罗斯方块程序

    void displayInformation(void); /******************************************* ** 函数名: displayInformation ** 功能: 打印信息 ** 参数: void ** 返回值: void *********************************************/...

    对void指针的理解.pdf

    用void* 定义一个void类型的指针,它不指向任何类型的数据,意思是,void*指针“指向空类型”或“不指向确定的类型”,而不要理解为void*指针能指向“任何的类型”数据。简而言之:void*只提供一个地址,没有指向。

Global site tag (gtag.js) - Google Analytics