空指针和空指针有什么区别?
什么是空指针和空指针之间的区别?
空指针是指针的特殊保留值 。 任何types的指针都有这样一个保留的值。 forms上,每个特定的指针types( int *
, char *
等)都有其专用的空指针值。 从概念上讲,当一个指针具有该空值时,它不会指向任何地方。
void指针是一个特定的指针types – void *
– 一个指向存储中的某个数据位置的指针,它没有任何特定的types。
所以,再次, 空指针是一个值 ,而空指针是一个types 。 这些概念是完全不同的,不可比较的。 这基本上意味着你所说的问题并不完全正确。 就像是问,例如“三angular车和汽车有什么区别?”。
它们是两个不同的概念:“void pointer”是一个types(void *)。 “空指针”是一个值为零(NULL)的指针。 例:
void *pointer = NULL;
这是一个NULL空指针。
一个空指针保证不等于指向任何对象的指针。 它的实际价值取决于系统,可能因types而异。 要获得一个空int
指针,你会这样做
int* p = 0;
malloc
失败时将返回空指针。
我们可以testing一个指针是否为空,也就是说,如果malloc
或其他某个函数仅仅通过testing其布尔值就失败了:
if (p) { /* Pointer is not null */ } else { /* Pointer is null */ }
一个void指针可以指向任何types,取决于引用对象为解除引用和指针运算而消耗多less内存。
空指针指向的值为NULL
,通常为0,但是在任何情况下都是无效的解除引用的内存位置。 void指针指向voidtypes的数据。 单词“void”并不表示指针引用的数据无效或指针已被取消。
无效是指types。 基本上它指向的数据types是未知的。
空值是指值。 它本质上是一个没有用的指针,并且使用无效。
通常一个空指针(可以是任何types,包括一个空指针!)指向:
-
大多数CPU指令集所针对的地址0可以做一个非常快速的比较分支(比如检查未初始化或无效的指针),并为ISA提供最佳代码大小/性能。
-
一个用户代码访问非法的地址(例如0x00000000),因此如果代码实际上试图访问该地址处或附近的数据,操作系统或debugging器可以很容易地停止或捕获具有该错误的程序。
void指针通常是一种欺骗或closures编译器types检查的方法,例如,如果要返回指向一种types的指针或未知types的指针以用作另一种types。 例如,malloc()返回一个voidtypes的内存指针,你可以将它指向字节,短整型,双浮点型,typePotato或其他任何types的指针。
NULL
是一个对任何指针types都有效的值。 它代表了价值的缺失。
一个void指针是一个types。 任何指针types都可以转换为void指针,因此它可以指向任何值。 这对于一般存储来说是好的,但是对于使用不好。 它本身不能用来访问一个值。 程序必须有额外的上下文来理解void指针在访问值之前引用的值的types。
空指针和空指针是完全不同的。 如果我们请求操作系统(通过c语言中的malloc())为特定的数据types分配内存,则操作系统在堆中分配内存(如果堆中有空间),并发送分配的内存地址。
当内存被os分配给堆时,我们可以在这个数据types的任何指针typesvariables中分配这个地址值。 然后这个指针被称为一个void指针,直到它不被用于任何进程。
当堆空间不可用时,操作系统肯定会分配内存并发送该位置的地址值,但是由于堆中没有空间,因此该内存不是由堆分配的,在这种情况下,该内存由在系统内存中的操作系统。这个内存不能被用户访问,因此当我们在一个指针中分配这个地址值时,这个指针被称为空指针,我们不能使用这个指针。 在void指针的情况下,我们可以将它用于任何编程语言的任何进程。
我不认为AnT的答案是正确的。
-
NULL
只是一个指针常量,否则我们怎么能有ptr = NULL
。 - 由于
NULL
是一个指针,它的types是什么。 我认为这个types只是(void *)
,否则我们怎么能有int * ptr = NULL
和(user-defined type)* ptr = NULL
。void
types实际上是一个通用types。 - 引用“C11(ISO / IEC 9899:201x)§6.3.2.3指针第3节”:
值为0的整数常量expression式,或者转换为void *types的expression式称为空指针常量
所以简单的说: NULL
指针是一个void指针常量。
空指针是一个指针,它不指向任何东西,在指针未在内存中分配有效地址的情况下使用。 每个指针types(即int *,char *)都有自己的空指针值。
void指针是一个没有任何数据types的指针 ,也就是说它可以被赋值为任何types的值。 也称为通用指针,它是一个原始地址的C约定。
所以,空指针基本上是分配给任何数据types的指针的空值,而空指针是只要数据types的地址没有分配给它的数据types就保持为空。