什么是void指针,什么是空指针?

所以我正在经历一些面试问题,我遇到了一个关于void和null指针的问题,声称:   没有返回类型的指针称为空指针。它可以是任何类型的数据类型。 这彻底迷惑了我!它似乎无效,根据这个问题,null可以互换使用,我不相信这是正确的。我假设void是一个返回类型,null是一个值。但我只是一个代码新手,我不确定我是对的。 请表达您对空指针是什么以及空指针是什么的看法。我不是在寻找null和void之间的区别。     
已邀请:
这两个概念是正交的: void指针(
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;
    
简单地忘记那个答案。您的链接引用:   “没有返回类型的指针是   称为空指针。“ 这太简单了。指针的返回类型?真?这是一个不好的来源......
void*
是通用指针类型,因为任何指针类型(指向const和/或volatile的指针除外)都可以隐式转换为
void*
。换句话说,您可以将任何指针指定给类型为
void*
的变量。空指针是指针值0     
void
类型通常意味着没有给出类型信息。 你应该始终记住指针传达两条信息:指向数据的类型(
int
double
,...),它指定如何解释它,以及它指向的数据的地址,它指定了在哪里可以获得指向数据的实际值。 类型信息是指针的类型(
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是一种丢弃值的奇特方式(您发信号通知编译器和其他程序员,你意识到你没有使用某个值)。     
请告诉我们:差异是什么: 在油箱和无气体之间的情况 饼干罐和无饼干之间 在“钱”和“空口袋”之间 如果你想出这些,你就能掌握null vs void * dillema。     
void是非类型的。 null是非值。     
这里有一些关于指针算术的差异: 它源于虚空是一种不完整的类型。
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)
    
链接的文章是完全错误的。它的第一句话:   没有返回类型的指针是   称为空指针 正在为我触发各种警报。这是一篇非常混乱的文章。 你几乎是对的。 “指向无效的指针”是一种类型(不是“返回类型”)。任何类型的值都可以由函数返回,因此是(函数的)返回类型。 空指针是一个指针,无论其类型如何,都指向空对象,该对象不是可以创建的任何有效对象。可以说空指针指向“无”。 指向void的指针也可以为null;
void *nothing = 0;
是完全有效的代码,只是说这个指针能够指向一个无类型的对象,但现在它不是。     
空指针指向0x000000(访问指针不正确),而void指针是指向未指定类型(
void *
)的正确指针。但是,void指针可以是空指针,但是随后引用指针会产生错误。     
void *ptr
是指针,可用于指向任何类型的数据。它可能是
int
float
double
。它没有返回类型,最初指针是用指针类型创建的(具有十六进制值),我们可以将此指针指定给任何类型的数据。 虽然空指针是具有NULL值作为地址的指针,但指针被赋予NULL值,因此它不能用于访问其地址在创建时可能包含的其他数据。我认为,如果此时未使用指针,则指定NULL是一种很好的编程技术。     

要回复问题请先登录注册