所以我正在接受一些面试问题,我遇到one about void and null pointers,声称:
这让我很困惑!它似乎无效,根据这个问题,null可以互换使用,我不相信这是正确的。我假设void是一个返回类型,null是一个值。但我只是一个代码新手,我不确定我是对的。没有返回类型的指针称为空指针。它可以是任何类型的数据类型。
请表达您对空指针是什么以及空指针的看法。我不是在寻找null和void之间的区别。
答案 0 :(得分:42)
这两个概念是正交的:
void *
)是指向某个内存位置的原始指针。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
类型通常意味着没有给出类型信息。
您应该始终记住指针传达两条信息:指向数据的类型(int
,double
,...),其中指定如何解释它,以及它指向的数据的地址,它指定 where ,你可以获得指向数据的实际值。
类型信息是指针类型( double
*
, int
*
, ...),而数据的地址是指针变量中包含的实际值。
因此,void
指针(void *
)是一个不指定任何类型信息的指针。它告诉您数据的位置,但它不会告诉您如何解释它。你知道在那个地址有一些东西,但是你不知道它是int
,double
还是一群飞牛。要实际使用这些数据,您必须以其他方式获取有关它的类型信息(例如,使用其他一些魔术参数),将该指针强制转换为常规指针类型,然后照常使用它。
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)
请告诉我们:差异是什么:
如果你想出这些,你就能掌握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
是指针,可用于指向任何类型的数据。它可能是int
,float
,double
。它没有返回类型,最初指针是用指针类型创建的(具有十六进制值),我们可以将此指针指定给任何类型的数据。
虽然空指针是具有NULL值作为地址的指针,但指针被指定为NULL值,因此它不能用于访问其地址在创建时可能包含的其他数据。我认为如果现在没有使用指针,那么将指针指定为NULL是一种很好的编程技术。