【发布时间】:2021-10-07 04:04:43
【问题描述】:
我的一个朋友从“理解和使用 C 指针 - Richard Reese,O'Reilly 出版物”中指出了第二个要点,我无法解释其中的 第一个 句子。我错过了什么?
指向无效的指针
指向 void 的指针是一个通用指针,用于保存对任何数据类型的引用。一个指向 void 的指针示例如下所示:
void *pv;它有两个有趣的特性:
- 指向 void 的指针与指向
char的指针具有相同的表示和内存对齐方式。- 指向 void 的指针永远不会等于另一个指针。 但是,分配了
NULL值的两个 void 指针将相等。
这是我的代码,不是来自书本,所有指针都具有相同的值并且相等。
#include <stdio.h>
int main()
{
int a = 10;
int *p = &a;
void *p1 = (void*)&a;
void *p2 = (void*)&a;
printf("%p %p\n",p1,p2);
printf("%p\n",p);
if(p == p1)
printf("Equal\n");
if(p1 == p2)
printf("Equal\n");
}
输出:
0x7ffe1fbecfec 0x7ffe1fbecfec
0x7ffe1fbecfec
Equal
Equal
【问题讨论】:
-
看起来这本书写得不好(或者,至少是那部分)。它可能的意思是
void指针永远不会等于指向其他对象的指针。但我只能猜测。 -
这个说法听起来不对。也许他们心中有一些有效的含义,但我不清楚它可能是什么。指向 void 的指针用作通用指针类型(至少对于指向数据的指针,而不是函数指针)。它可以等于任何其他数据指针,具体取决于这些指针的定义方式。
-
书错了
-
这里有一个errata,上面写着:“指向 void 的指针永远不会等于另一个指针。”应该是:“指向 void 的指针永远不会等于另一个 指向 void 的指针”。推理:指向 void 的指针可以赋值为非 void 指针的值。不确定这是否会大大改善它。
-
@EOF 您可能正在考虑另一本书,Mastering C Pointers by Robert J. Traister。那个确实以几乎完全错误而闻名,并且是由对 C 或一般编程没有任何了解的人编写的。
标签: c pointers void-pointers