空指针& 无效指针?
答案 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不正确。
NULL
只是一个指针常量,否则我们怎么能有ptr = NULL
。 NULL
是一个指针,它的类型是什么。我认为类型只是(void *)
,否则我们怎么能同时拥有int * ptr = NULL
和(user-defined type)* ptr = NULL
。 void
类型实际上是一种通用类型。值为0的整型常量表达式,或者类型为void *的表达式,称为空指针常量
所以简单地说:NULL
指针是一个空指针常量。
答案 9 :(得分:0)
空指针的值为0。空指针是ANSI引入的通用指针。通用指针可以保存任何数据类型的地址。
答案 10 :(得分:0)
void
和null
指针都指向最后的存储位置。
null
指针指向的位置(在内存段中)通常是内存段的第0个地址。当您尝试访问“保留的”内存位置(实现细节)时,几乎所有有关底层OS的处理方式。例如,该特定的内存位置可以标记为“不可访问”,并在访问时引发期望。
void
指针可以指向任何地方,并可能表示任何类型(原始,引用类型和包括null
)。
正如上面所说的那样,null
指针表示一个值,而void*
则表示一个类型而不是一个值。