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

Sho*_*vik 38 c++ pointers void-pointers null-pointer

所以我正在经历一些面试问题,我遇到了一个关于void和null指针的问题,声称:

没有返回类型的指针称为空指针.它可以是任何类型的数据类型.

这彻底迷惑了我!它似乎无效,根据这个问题,null可以互换使用,我不相信这是正确的.我假设void是一个返回类型,null是一个值.但我只是一个代码新手,我不确定我是对的.

请表达您对空指针是什么以及空指针是什么的看法.我不是在寻找null和void之间的区别.

Mar*_*tos 45

这两个概念是正交的:

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

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
Run Code Online (Sandbox Code Playgroud)

非void指针也可以为null:

Foo *f = nullptr;
Foo *g = new Foo;
Run Code Online (Sandbox Code Playgroud)

  • 类型`void*`仅仅意味着"指向内存的指针;我不知道那里有什么类型的数据".任何"普通"指针(`int*`,`char*`,`MyStruct*`)都可以隐式地转换为`void*`; 这是典型的"只是一点点记忆". (10认同)

Arm*_*yan 29

简单地忘记那个答案.您的链接引用:

"没有返回类型的指针称为空指针."

这是SOOO平淡错误的.指针的返回类型?真?这是一个不好的来源......

void*是通用指针类型,因为任何指针类型(指向const和/或volatile的指针除外)都可以隐式转换为void*.换句话说,您可以将任何指针指定给类型的变量void*.空指针是指针 0


Mat*_*lia 19

void一般类型意味着没有类型信息中给出.

你应该始终牢记,一个指针传达两个信息:该类型的尖锐的数据(int,double,...),其中规定了如何解释它,并且地址它指向的数据,指定其中你可以获得指向数据的实际值.

类型信息是指针类型(,...),而数据的地址是指针变量中包含的实际值.double*int*

因此,voidpointer(void *)是一个不指定任何类型信息的指针.它告诉您数据的位置,但它不会告诉您如何解释它.你知道在那个地址有一些东西,但你不知道它是一只int,一种double还是一群飞行的奶牛.要实际使用这些数据,您必须以其他方式获取有关它的类型信息(例如,使用其他一些魔术参数),将该指针强制转换为常规指针类型,然后照常使用它.

void *通常在C中用于为泛型编程提供某种支持; 例如,参见qsortC库函数.

一个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 |   |                      |                      |
         +---+----------------------+----------------------+
Run Code Online (Sandbox Code Playgroud)

琐事:NULL至少在现行标准中,保证为0.

在语言的其他领域,void始终用于指定缺少类型.使用它作为返回值(注意:我现在正在谈论void,不是void *)意味着该函数不返回任何值,并且将表达式转换为void是一种丢弃值的奇特方式(您向编译器发出信号并且其他程序员,你意识到你没有使用某个值).


Dan*_*dor 11

请告诉我们:差异是什么:

  • 在油箱和无气体之间的情况
  • 饼干罐和无饼干之间
  • 在"钱"和"空口袋"之间

如果你想出这些,你就能掌握null vs void*dillema.


Nic*_*uet 9

void是非类型的. null是非值.