比较C中空指针指向的值
我需要比较C中两个比较C中空指针指向的值,c,pointers,void-pointers,C,Pointers,Void Pointers,我需要比较C中两个void指针的值。在下面的代码中,我得到了控制台打印的结果,表明它们是不同的。似乎比较的是这两个void指针中包含的地址 如何使代码能够比较void指针的值(即:1==1),并打印“相同” 指针是不同的。如果您试图比较指针指向的整数,那么您需要 if ( *(int*)pi == *(int*)pj ) { //some code... } 您必须知道void指针真正指向的数据类型,强制指针指向该类型,然后取消对强制指针的引用(并假设使用=可以比较这些类型): 比较原
void
指针的值。在下面的代码中,我得到了控制台打印的结果,表明它们是不同的。似乎比较的是这两个void
指针中包含的地址
如何使代码能够比较void
指针的值(即:1==1
),并打印“相同”
指针是不同的。如果您试图比较指针指向的整数,那么您需要
if ( *(int*)pi == *(int*)pj ) {
//some code...
}
您必须知道
void
指针真正指向的数据类型,强制指针指向该类型,然后取消对强制指针的引用(并假设使用=
可以比较这些类型):
比较原始变量要容易得多:
if (i == j)
…
或使用正确键入的指针:
int *pi = &i;
int *pj = &j;
if (*pi == *pj)
…
如果我不知道数据的类型(假设用户总是传递相同类型的数据以与我的链表删除方法进行比较),会发生什么情况 然后生活变得艰难。理想情况下,您可以让程序员向您传递一个比较器函数-请参阅和 来自标准C库的示例 如果做不到这一点,您需要知道目标类型的大小,并且希望
memcmp()
能够很好地完成这项工作。这远不能保证-不清楚将两个double
值与memcmp()
进行比较是否总能得到正确的答案(例如,它可能声称NaN的不同表示形式是不同的),而将struct
类型与填充进行比较是令人担忧的,而且,如果您从两个节点传递了数据字段,那么它将无法正确地用于链表数据类型
如果您需要进行排序而不仅仅是相等(例如,二元搜索树),那么情况就更糟了——在这种情况下,需要程序员提供比较器函数。u必须将无效指针转换为int类型* 由于编译器不知道指针指向的地址类型,因此不知道从指针地址读取并比较多少字节。试试这个
int i = 2;
int j = 1;
void *pi = &i;
void *pj = &j;
if ( (*(int*)(pi)) == (*(int*)(pj)) )
{
printf("same.\n");
} else
{
printf("different.\n");
}
return 0;
从您的评论来看,您试图实现一个链表,但不知道指针目标的数据类型。您的设计是错误的:使用
void*
指针,您无法(合理或可靠地)在不知道类型的情况下比较数据。你需要以不同的方式处理它。最好的方法是将链表实现为模板类。您的节点类将类似于
template <typename T> class Node
{
private:
T *m_pValue;
Node *m_prev;
Node *m_next;
...
}
template <typename T> class Node
{
private:
std::auto_ptr<T> m_pValue;
Node *m_prev;
Node *m_next;
...
}
这只是假设T类型可以通过==进行比较,这在大多数情况下应该是正确的
请注意,使用内存比较之类的建议非常危险——这种比较完全忽略了底层数据类型的结构和符号
好的,考虑到这必须是C语言,让你的节点
struct node
{
void * m_pValue;
node * m_pPrev;
node * m_pNext;
}
并要求链表的用户必须向您提供指向比较器函数的指针
int (comparitor*)(void* lhs, void* rhs);
这正是Jonathan Leffler在下面提出的建议。具体如何构造这一切取决于如何构造链表。没有空指针,就有int指针,然后是*pi==*pj。但是,虽然它是一个无效的指针,但它只是一个指针,然后尝试将指向的内容与
memcmp
进行比较是非常糟糕的做法,例如if(memcmp(pi,pj,sizeof(int))==0){
更具体地说,我正在尝试实现一个链接列表,其中节点存储通用的void值。在delete方法中,我希望传递一个void项,该项与要删除的链接列表中的值进行比较。但是,当我尝试比较两个void指针时,即使它们指向的值相同,比较返回false。因此,我想知道是否有方法比较指针的值?@jl987:如果不明确地告诉编译器如何比较它们,就不可能比较void*
指针指向的值。编译器不知道。只有你知道如何做。在最简单的情况下,你必须告诉编译器i通过指定强制转换中的确切类型来确定这些值的类型。或者,您可以为delete
方法提供通用比较函数(您将提供该函数),就像使用标准的bsearch
或qsort
函数一样。如果我不知道数据类型(假设用户总是传递相同类型的数据以与我的链表删除方法进行比较),会发生什么情况?那么,是否无法比较这两个指针(假设它们是相同的类型,但您不知道是哪种类型,因此无法转换为各自的类型)?您怎么可能不知道指针是哪种类型..您正在编写程序。正如Jonathan指出的,如果您只需要使用一种类型的指针,您不需要void类型,只需从该类型(int*)开始但是如果你想不断地改变指针的类型,以指向不同的值,那么你需要在每次比较时明确地对它进行类型转换。谢谢C++中的建议!但是,我需要在C WOOPS中实现这个!当然,错过了这个小问题……当然,这就是为什么C++是我创建的,因为这样的问题。
Node rhs, lhs;
*(lhs.m_pValue) == *(rhs.m_pValue);
struct node
{
void * m_pValue;
node * m_pPrev;
node * m_pNext;
}
int (comparitor*)(void* lhs, void* rhs);