【问题标题】:What's the difference between a null pointer and a void pointer?空指针和空指针有什么区别?
【发布时间】:2011-04-04 15:21:31
【问题描述】:

空指针空指针有什么区别?

【问题讨论】:

  • 这是两个不同的概念,不能比较。臭鼬和月光有什么区别?
  • 月亮*没有气味&
  • @qrdl 臭鼬和月光之间的区别 --> 尽管两者都有阴暗面和光明面,但不知道差异会影响约会和基因库。

标签: c pointers


【解决方案1】:

空指针是一个特殊的保留指针。任何类型的指针都有这样的保留值。形式上,每个特定的指针类型(int *char * 等)都有自己专用的空指针值。从概念上讲,当指针具有空值时,它不会指向任何地方。

Void 指针 是一个特定的指针type - void * - 一个指向存储中某个数据位置的指针,它没有任何特定的类型。

所以,null pointer 是一个 value,而 void pointer 是一个 type。这些概念是完全不同的,不可比的。如前所述,这基本上意味着您的问题并不完全有效。这就像问,例如,“三角形和汽车有什么区别?”。

【讨论】:

  • @Pavitar,它作为标记很有用。例如,指示尚未分配内存的指针或标记链表的结尾。
  • 您可以并且应该使用空指针。例如,如果 malloc 无法分配内存,它会返回一个空指针。最好在 free() 'em 之后将指针指向 null 以避免悬空指针 en.wikipedia.org/wiki/Dangling_pointer
  • @Pavitar:空指针常量保证无效,并且可以识别。您不能将其与任何有效指针混淆。因此,它可以用作失败的信号,或者是没有更多数据的标记,或者指针没有指向任何地方,或者类似的东西。
  • “空指针”与“空指针”我看到您使用两个词作为描述性名词,并使用连字符作为名词例外的形容词从句。这看起来和听起来对我的“头脑的耳朵”来说都是正确的;但它实际上在语法上是正确的吗?
  • @DavidThornley 详细信息:空指针常量 是一个值。它可以有0 的值和int 的类型。 空指针“保证不等于指向任何对象或函数的指针”。
【解决方案2】:

它们是两个不同的概念:“void 指针”是一种类型(void *)。 “空指针”是一个值为零 (NULL) 的指针。示例:

void *pointer = NULL;

这是一个 NULL void 指针。

【讨论】:

    【解决方案3】:

    保证空指针不等于指向任何对象的指针。它的实际值取决于系统,并且可能因类型而异。要获得一个空的 int 指针,你会这样做

    int* p = 0;
    

    如果失败,malloc 将返回一个空指针。

    我们可以测试一个指针是否为空,即malloc或其他函数是否失败,只需测试它的布尔值:

    if (p) {
        /* Pointer is not null */
    } else {
        /* Pointer is null */
    }
    

    一个 void 指针可以指向任何类型,由您来处理被引用对象为解除引用和指针运算而消耗的内存量。

    【讨论】:

      【解决方案4】:

      Void 是指类型。基本上它指向的数据类型是未知的。

      Null 指的是值。它本质上是一个空指针,并且无法使用。

      【讨论】:

        【解决方案5】:

        空指针指向的值 NULL 通常为 0,但在任何情况下都是无法取消引用的内存位置。 void 指针指向 void 类型的数据。 “void”一词并不表示指针引用的数据无效或指针已被无效。

        【讨论】:

        • NULL 在 C 中是 0(void *)0,而在 C++ 中 NULL 始终是 0。然而,空指针的实现的内部表示可能不是 0(所有位都被清除)。
        【解决方案6】:

        通常一个空指针(可以是任何类型,包括空指针!)指向:

        • 地址 0,大多数 CPU 指令集可以针对该地址进行非常快速的比较和分支(例如检查未初始化或无效指针),并为 ISA 提供最佳代码大小/性能。

        • 用户代码无法访问的地址(例如在许多情况下为 0x00000000),因此如果代码实际上试图访问此地址处或附近的数据,操作系统或调试器可以轻松停止或捕获有这个错误的程序。

        空指针通常是一种欺骗或关闭编译器类型检查的方法,例如,如果您想返回指向一种类型或未知类型的指针以用作另一种类型。例如 malloc() 返回一个指向无类型内存块的 void 指针,您可以将其类型转换为以后用作指向字节、短整数、双浮点数、typePotato 或其他任何东西的指针。

        【讨论】:

        • 空指针是否指向地址 0 与其正确使用完全无关,尽管如果您在调试和检查变量值时这样做会很好。也没有必要引起任何类型的错误,尽管我认为这是一个很好的功能。它保证与任何其他相同类型的空指针值比较相等,并保证与任何有效指针比较不相等,这才是真正的用途。
        【解决方案7】:

        NULL 是一个对任何指针类型都有效的值。它表示没有值。

        空指针是一种类型。任何指针类型都可以转换为 void 指针,因此它可以指向任何值。这使它适合一般存储,但不适合使用。它本身不能用于访问值。程序必须有额外的上下文来理解 void 指针引用的值的类型,然后才能访问该值。

        【讨论】:

          【解决方案8】:

          空指针和空指针完全不同。如果我们请求操作系统(通过 c 语言中的 malloc())为特定数据类型分配内存,那么操作系统会在堆中分配内存(如果堆中有可用空间)并发送已分配内存的地址。

          当 os 在堆中分配内存时,我们可以在该数据类型的任何指针类型变量中分配该地址值。然后这个指针被称为 void 指针,直到它不被任何进程占用。

          当堆中的空间不可用时,操作系统当然会分配内存并发送该位置的地址值,但是操作系统不会在堆中分配该内存,因为堆中没有空间,在这种情况下是该内存由操作系统在系统内存中分配。这个内存不能被用户访问,因此当我们在指针中分配这个地址值时,这个指针被称为空指针,我们不能使用这个指针。在 void 指针的情况下,我们可以将它用于任何编程语言中的任何进程。

          【讨论】:

          • 如果 C 库在堆上分配失败,要么是因为操作系统不给它内存,要么是因为堆碎片太多,无法获得足够大的块,它会返回一个空指针。我不知道你在说什么系统内存。另外,我不确定什么是“然后称为 void 指针,直到它不被用于任何进程”。你说的“不参加任何流程”是什么意思?
          【解决方案9】:

          voidnull 指针最后都指向一个内存位置。

          null 指针指向(在内存段中)通常是内存段的第 0 个地址。当您尝试访问它以读取/写入或取消引用时,几乎所有关于底层操作系统如何处理“保留”内存位置(实现细节)。例如,该特定内存位置可以标记为“不可访问”,并在访问时引发期望。

          void 指针可以指向任何地方并可能表示任何类型(原始类型、引用类型和包括null)。

          正如上面所说的,null 指针代表一个,而void* 代表一个类型而不是一个值。

          【讨论】:

            【解决方案10】:

            我不认为AnT's answer 是正确的。

            1. NULL 只是一个指针常量,否则我们怎么会有ptr = NULL
            2. 由于NULL 是一个指针,它的类型是什么。我认为类型只是(void *),否则我们怎么可能同时拥有int * ptr = NULL(user-defined type)* ptr = NULLvoid 类型实际上是一个通用类型。
            3. 在“C11(ISO/IEC 9899:201x) §6.3.2.3 指针第 3 节”中引用:

              值为 0 的整数常量表达式,或转换为 void * 类型的表达式称为空指针常量

            所以简单地说:NULL 指针是一个 void 指针常量。

            【讨论】:

            • 即使NULLint,我们也可以拥有void *ptr = NULL;,因为作为分配的一部分,NULL 从它的任何类型转换为void *,并且转换很好指定。
            【解决方案11】:

            Null 指针的值为 0。void 指针是 ANSI 引入的通用指针。通用指针可以保存任何数据类型的地址。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2023-03-17
              • 2010-12-17
              • 2013-07-12
              • 2011-05-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多