什么是void指针,什么是空指针?

时间:2010-12-02 12:12:07

标签: c++ pointers void-pointers null-pointer

所以我正在接受一些面试问题,我遇到one about void and null pointers,声称:

  

没有返回类型的指针称为空指针。它可以是任何类型的数据类型。

这让我很困惑!它似乎无效,根据这个问题,null可以互换使用,我不相信这是正确的。我假设void是一个返回类型,null是一个值。但我只是一个代码新手,我不确定我是对的。

请表达您对空指针是什么以及空指针的看法。我不是在寻找null和void之间的区别。

9 个答案:

答案 0 :(得分:42)

这两个概念是正交的:

  1. void指针,(void *)是指向某个内存位置的原始指针。
  2. 根据定义,空指针是一个不指向任何内容的特殊指针。它可以是指向任何类型的指针,无效或其他。
  3. void指针可以为null:

    void *void_ptr1 = nullptr;
    void *void_ptr2 = malloc(42);
    void *void_ptr3 = new Foo;               // void * can point to almost anything
    void *void_ptr4 = (char*)void_ptr3 + 1;  // even somewhere inside an object
    

    非void指针也可以为null:

    Foo *f = nullptr;
    Foo *g = new Foo;
    

答案 1 :(得分:29)

简单地忘记那个答案。来自您链接的引用:

  

“没有返回类型的指针是   称为空指针。“

这很简单 错误 。指针的 返回类型 ?真?这是一个不好的来源......

void*是通用指针 类型 ,因为任何指针类型(指向const和/或volatile的指针除外)都可以隐式转换为{{1} }。换句话说,您可以将任何指针指定给类型为void*的变量。空指针是指针 0

答案 2 :(得分:16)

void类型通常意味着没有给出类型信息。

您应该始终记住指针传达两条信息:指向数据的类型intdouble,...),其中指定如何解释它,以及它指向的数据的地址,它指定 where ,你可以获得指向数据的实际值。

类型信息是指针类型( double * int *, ...),而数据的地址是指针变量中包含的实际值。

因此,void指针(void *)是一个不指定任何类型信息的指针。它告诉您数据的位置,但它不会告诉您如何解释它。你知道在那个地址有一些东西,但是你不知道它是intdouble还是一群飞牛。要实际使用这些数据,您必须以其他方式获取有关它的类型信息(例如,使用其他一些魔术参数),将该指针强制转换为常规指针类型,然后照常使用它。

void *经常在C中用于为泛型编程提供某种支持;例如,参见qsort C库函数。

相反,NULL指针是指向任何内容的指针。在这种情况下,通常存在关于指针的类型信息,但它是缺少的指向数据的地址。当然,void *可能是NULL

快速示例(假设v被声明为double v;):

                         Type information present
             +----------------------+----------------------+
             |          ✔           |          ✘           |
         +---+----------------------+----------------------+
    p  c |   |                      |                      |
 v  o  o | ✔ | double * ptr = &v;   | void * ptr = &v;     |
 a  i  n |   |                      |                      |
 l  n  t +---+----------------------+----------------------+
 i  t  e |   |                      |                      |
 d  e  n | ✘ | double * ptr = NULL; | void * ptr = NULL;   |
    d  t |   |                      |                      |
         +---+----------------------+----------------------+

琐事 NULL,至少在当前标准中,保证为0。

在该语言的其他区域,void始终用于指定缺少类型。使用它作为返回值(注意:我现在谈论的是void,而不是void *)意味着该函数不返回任何值,并将表达式转换为void是一种丢弃a的奇特方法值(你向编译器和其他程序员发出信号,告知你没有使用某个值)。

答案 3 :(得分:10)

请告诉我们:差异是什么:

  • 在油箱和无气体情况之间
  • 在cookie jar和no-cookies之间
  • 在“金钱”和“空口袋”之间

如果你想出这些,你就能掌握null vs void * dillema。

答案 4 :(得分:9)

void 是非类型。 null 是非值。

答案 5 :(得分:3)

这里有一些关于指针算术的差异:

它源于虚空是一种不完整的类型。

void *vp;
vp++;     // error, incomplete type
vp += 2;  // same error

void *p = 0;
p++;      // still same error

int *p = 0;
p++;      // well-formed program, but UB ($5.6/5)

答案 6 :(得分:2)

链接的文章是完全错误的。它的第一句话是:

  

没有返回类型的指针是   称为空指针

正在为我触发各种警报。这是一篇非常混乱的文章。

你几乎是对的。 “指向无效的指针”是一种类型(不是“返回类型”)。任何类型的值都可以由函数返回,因此是(函数的)返回类型。

空指针是一个指针,无论其类型如何,都指向空对象,该对象不是可以创建的任何有效对象。可以说空指针指向“无”。

指向void的指针也可以为null;

void *nothing = 0;

是完全有效的代码,只是说这个指针能够指向一个无类型的对象,但现在它不是。

答案 7 :(得分:1)

空指针指向0x000000(访问指针不正确),而void指针是指向未指定类型(void *)的正确指针。但是,void指针可以是空指针,但是不引用指针会产生错误。

答案 8 :(得分:1)

void *ptr是指针,可用于指向任何类型的数据。它可能是intfloatdouble。它没有返回类型,最初指针是用指针类型创建的(具有十六进制值),我们可以将此指针指定给任何类型的数据。

虽然空指针是具有NULL值作为地址的指针,但指针被指定为NULL值,因此它不能用于访问其地址在创建时可能包含的其他数据。我认为如果现在没有使用指针,那么将指针指定为NULL是一种很好的编程技术。