空指针和void指针之间有什么区别?

时间:2010-08-27 05:38:16

标签: c pointers

空指针& 无效指针

11 个答案:

答案 0 :(得分:108)

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

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

因此,空指针再次是,而无效指针类型。这些概念完全不同且不具有可比性。这实际上意味着你所提出的问题并不完全有效。例如,问问“三角形和汽车之间有什么区别?”。

答案 1 :(得分:11)

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

void *pointer = NULL;

这是一个NULL无效指针。

答案 2 :(得分:4)

保证空指针不等于指向任何对象的指针。它的实际值取决于系统,可能因类型而异。要获得空int指针,您将执行

int* p = 0;

失败时malloc将返回空指针。

我们可以测试指针是否为空,即如果malloc或其他一些函数只是通过测试其布尔值而失败:

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

void指针可以指向任何类型,由您来处理引用对象为解除引用和指针算术而消耗了多少内存。

答案 3 :(得分:3)

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

Null指的是值。它本质上是指向任何东西的指针,并且无效。

答案 4 :(得分:2)

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

答案 5 :(得分:1)

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

  • 地址0,大多数CPU指令集可以使用最快的代码大小/性能来执行非常快速的比较和分支(例如检查未初始化或无效的指针)。

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

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

答案 6 :(得分:1)

NULL是一个对任何指针类型有效的值。它代表缺乏价值。

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

答案 7 :(得分:1)

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

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

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

答案 8 :(得分:0)

我认为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 *的表达式,称为空指针常量

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

答案 9 :(得分:0)

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

答案 10 :(得分:0)

voidnull指针都指向最后的存储位置。

null指针指向的位置(在内存段中)通常是内存段的第0个地址。当您尝试访问“保留的”内存位置(实现细节)时,几乎所有有关底层OS的处理方式。例如,该特定的内存位置可以标记为“不可访问”,并在访问时引发期望。

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

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