Sho*_*vik 38 c++ pointers void-pointers null-pointer
所以我正在经历一些面试问题,我遇到了一个关于void和null指针的问题,声称:
没有返回类型的指针称为空指针.它可以是任何类型的数据类型.
这彻底迷惑了我!它似乎无效,根据这个问题,null可以互换使用,我不相信这是正确的.我假设void是一个返回类型,null是一个值.但我只是一个代码新手,我不确定我是对的.
请表达您对空指针是什么以及空指针是什么的看法.我不是在寻找null和void之间的区别.
Mar*_*tos 45
这两个概念是正交的:
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
Run Code Online (Sandbox Code Playgroud)
非void指针也可以为null:
Foo *f = nullptr;
Foo *g = new Foo;
Run Code Online (Sandbox Code Playgroud)
Arm*_*yan 29
简单地忘记那个答案.您的链接引用:
"没有返回类型的指针称为空指针."
这是SOOO平淡错误的.指针的返回类型?真?这是一个不好的来源......
void*
是通用指针类型,因为任何指针类型(指向const和/或volatile的指针除外)都可以隐式转换为void*
.换句话说,您可以将任何指针指定给类型的变量void*
.空指针是指针值 0
Mat*_*lia 19
在void
一般类型意味着没有类型信息中给出.
你应该始终牢记,一个指针传达两个信息:该类型的尖锐的数据(int
,double
,...),其中规定了如何解释它,并且地址它指向的数据,指定其中你可以获得指向数据的实际值.
类型信息是指针类型(,...),而数据的地址是指针变量中包含的实际值.double
*
int
*
因此,void
pointer(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 | | | |
+---+----------------------+----------------------+
Run Code Online (Sandbox Code Playgroud)
琐事:NULL
至少在现行标准中,保证为0.
在语言的其他领域,void
始终用于指定缺少类型.使用它作为返回值(注意:我现在正在谈论void
,不是void *
)意味着该函数不返回任何值,并且将表达式转换为void是一种丢弃值的奇特方式(您向编译器发出信号并且其他程序员,你意识到你没有使用某个值).