什么是空指针,什么是空指针?
所以我遇到了一些面试问题,我遇到了这个问题
这个问题的答案彻底让我困惑! 根据这个问题,似乎无效和空可以交替使用,我不相信这是正确的。 我认为无效是一个返回types,空值是一个值。 但是我只是一个代码新手,我不知道我是否正确。 因此,所有的专家在那里..如果你可以摆脱一些光,这将是非常有益的! 🙂
请expression您的意见,什么是空指针和空指针是什么。 不寻找无效之间的区别。 也请validation问题的答案,并告诉我,如果这是正确的…谢谢
这两个概念是正交的:
- void指针,(
void *
)是指向某个内存位置的原始指针。 - 空指针是一个特殊的指针,根据定义,它不指向任何东西。 它可以是任何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
通常的void
types意味着没有给出types信息。
你应该时刻记住,一个指针传达了两条信息:指向数据的types ( int
, double
,…),它指定了如何解释它,以及它指向的数据的地址 , 在那里你可以得到有针对性的数据的实际价值。
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的数据的指针。 它可能是int
, float
, double
。 它没有返回types,最初的指针是用指针types(有hex值)创build的,我们可以把这个指针分配给任何types的数据。
空指针是以NULL值作为地址的指针,指针指定为NULL值,以便在创build时不能访问其地址可能包含的其他数据。 如果现在没有使用指针,我认为这是一个很好的编程技术。