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

所以我遇到了一些面试问题,我遇到了这个问题

这个问题的答案彻底让我困惑! 根据这个问题,似乎无效和空可以交替使用,我不相信这是正确的。 我认为无效是一个返回types,空值是一个值。 但是我只是一个代码新手,我不知道我是否正确。 因此,所有的专家在那里..如果你可以摆脱一些光,这将是非常有益的! 🙂

请expression您的意见,什么是空指针和空指针是什么。 不寻找无效之间的区别。 也请validation问题的答案,并告诉我,如果这是正确的…谢谢

这两个概念是正交的:

  1. void指针,( void * )是指向某个内存位置的原始指针。
  2. 空指针是一个特殊的指针,根据定义,它不指向任何东西。 它可以是任何types的指针,无效或其他。

一个void指针可以是null也可以不是:

 void *void_ptr1 = NULL; 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 = NULL; Foo *g = new Foo; 

只是忘记了这个答案。 来自您的链接的报价:

“没有返回types的指针被称为空指针”。

这是明显的错误 。 指针的返回types ? 真? 这是一个不好的来源…

void*是通用指针types,因为任何指针types(除了指向const和/或volatile的指针)都可以隐式转换为void* 。 换句话说,您可以将任何指针指定给void*types的variables。 空指针是一个指针 0

通常的voidtypes意味着没有给出types信息。

你应该时刻记住,一个指针传达了两条信息:指向数据的typesintdouble ,…),它指定了如何解释它,以及它指向的数据的地址在那里你可以得到有针对性的数据的实际价值。

types信息是指针types( double *int * ,…),而数据的地址是指针variables中包含的实际值。

所以, void指针( void * )是一个不指定任何types信息的指针。 它会告诉你数据在哪里,但它不会告诉你如何解释它。 你知道在那个地址有什么东西,但是你不知道它是一个int ,一个double还是一群飞行的牛。 要实际使用这些数据,必须以其他方式获取types信息(例如,使用其他一些魔术参数),将该指针转换为常规指针types,然后照常使用。

void *经常用于C语言,为generics编程提供某种支持; 请参阅例如qsort C库函数。

相反, NULL指针是一个指向任何东西的指针。 在这种情况下,通常存在关于指针的types信息,但是缺less指向的数据的地址。 当然,可能有一个void *NULL

快速示例(假设v被声明为double v; ):

  Type information present +----------------------+----------------------+ | ✔ | ✘ | +---+----------------------+----------------------+ pc | | | | voo | ✔ | double * ptr = &v; | void * ptr = &v; | ain | | | | lnt +---+----------------------+----------------------+ ite | | | | den | ✘ | double * ptr = NULL; | void * ptr = NULL; | dt | | | | +---+----------------------+----------------------+ 

琐事 :至less在当前的标准中, NULL保证为0。

在其他语言领域, void总是用于指定缺lesstypes。 使用它作为返回值(注意:我现在谈论关于void ,而不是void * )意味着该函数不会返回任何值,并将expression式转换为void是丢弃值的奇特方式(您正在发信号编译器和其他程序员,你意识到你没有使用某个值)。

void是非types的。 null是一个非值。

请告诉我们:有什么区别:

  • 油箱与无油气之间的情况
  • cookie jar和no-cookies之间
  • 在术语“金钱”和“空口袋”之间

如果你想出了这些,你可以把握无效与无效* dillema。

链接的文章是完全错误的。 第一句话:

没有返回types的指针称为空指针

正在为我引发各种警报。 这是一个高度混淆的写作。

你几乎是正确的。 “void指针”是一个types(不是“返回types”)。 任何types的值都可以被函数返回,因此是(函数的)返回types。

空指针是一个指针,不论其types如何,都指向空对象,而不是任何可以创build的有效对象。 空指针可以说是指向“无”。

指向void的指针也可以为null;

 void *nothing = 0; 

是完全有效的代码,只是说这个指针能够指向一个无types的对象,但现在不是。

以下是关于指针算术的一些区别:

这是因为空缺是一个不完整的types。

 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) 

空指针指向0x000000(这是访问指针不正确),而空指针是一个正确的指针指向一个未指定的types( void * )。 但是,void指针可以是空指针,但是当不指向指针时会产生错误。

void *ptr是可以用来指向任何types的数据的指针。 它可能是intfloatdouble 。 它没有返回types,最初的指针是用指针types(有hex值)创build的,我们可以把这个指针分配给任何types的数据。

空指针是以NULL值作为地址的指针,指针指定为NULL值,以便在创build时不能访问其地址可能包含的其他数据。 如果现在没有使用指针,我认为这是一个很好的编程技术。