C++ C++;带指针、赋值和比较的结构
在下面的节目中, //1和//2不工作,但//3工作 //4和//5不工作,但//6不工作 问题: 如果在If条件下地址值相同,为什么比较会出现以下错误: 错误:不同指针类型“Node*”和“int*”之间的比较缺少强制转换*C++ C++;带指针、赋值和比较的结构,c++,c++11,linked-list,C++,C++11,Linked List,在下面的节目中, //1和//2不工作,但//3工作 //4和//5不工作,但//6不工作 问题: 如果在If条件下地址值相同,为什么比较会出现以下错误: 错误:不同指针类型“Node*”和“int*”之间的比较缺少强制转换* 您正在比较不同的指针类型,即Node*与int。您只需将if条件输入为 if((int*)Node1->Next==(int*)&Node2->data) //1 //and if((int*)Node2==(int*)&Node2-&g
您正在比较不同的指针类型,即
Node*
与int
。您只需将if条件输入为
if((int*)Node1->Next==(int*)&Node2->data) //1
//and
if((int*)Node2==(int*)&Node2->data) //4
<>你是对的,地址是相同的,C++是默认的,强制执行严格的类型检查,这就是为什么需要进行转换。尽管尽可能避免您正在比较不同的指针类型,即
节点*
与int
。您只需将if条件输入为
if((int*)Node1->Next==(int*)&Node2->data) //1
//and
if((int*)Node2==(int*)&Node2->data) //4
<>你是对的,地址是相同的,C++是默认的,强制执行严格的类型检查,这就是为什么需要进行转换。尽管尽可能避免看起来您只是想比较指针中存储的地址,而不关心指针的类型。但是指针比较不是这样工作的。如果比较两个指针,它们的类型必须相同
Node1->Next
属于Node*
类型,&Node2->data
属于int*
类型。这就是为什么比较失败的原因。但是如果类型相同,那么比较结果应该是true
如果您想这样做,您必须将它们转换为相同的类型,可能是void*
bool compareAddresses(void* ptr1, void* ptr2){
return ptr1 == ptr2;
}
你可以写下你的情况,比如:
if (compareAddresses(Node1->Next, &Node2->data))
在这里,指针自动转换为void*
。同样地:
if (compareAddresses(Node2, &Node2->data))
请参阅。看起来您只是想比较指针中存储的地址,而不关心指针的类型。但是指针比较不是这样工作的。如果比较两个指针,它们的类型必须相同
Node1->Next
属于Node*
类型,&Node2->data
属于int*
类型。这就是为什么比较失败的原因。但是如果类型相同,那么比较结果应该是true
如果您想这样做,您必须将它们转换为相同的类型,可能是void*
bool compareAddresses(void* ptr1, void* ptr2){
return ptr1 == ptr2;
}
你可以写下你的情况,比如:
if (compareAddresses(Node1->Next, &Node2->data))
在这里,指针自动转换为void*
。同样地:
if (compareAddresses(Node2, &Node2->data))
请参阅。
如果(Node1->Next==&Node2->data)
您对此有何期待?为什么要将节点->Next
与&Node->data
进行比较?一个是指向节点的指针,另一个是指向int
的指针。您希望通过比较实现什么?您正在尝试将节点*
类型的内容(即下一个字段)与int
的地址(即数据
字段的地址)进行比较。这没有道理。你到底想做什么?哦,我明白了,你在写随机比较:if(Node1->Next==&Node2->data)
,if(Node2==&Node2->data)
,等等。。直到你找到有效的方法。那是不可能的。大家好,目前我没有开发任何应用程序。我只是想了解带指针的结构是如何工作的。如果内存位置完全相同,为什么If语句中的比较失败?If(Node1->Next==&Node2->data)
您对此有何期待?为什么要将Node->Next
与节点->数据进行比较?一个是指向节点的指针,另一个是指向int
的指针。您希望通过比较实现什么?您正在尝试将节点*
类型的内容(即下一个字段)与int
的地址(即数据
字段的地址)进行比较。这没有道理。你到底想做什么?哦,我明白了,你在写随机比较:if(Node1->Next==&Node2->data)
,if(Node2==&Node2->data)
,等等。。直到你找到有效的方法。那是不可能的。大家好,目前我没有开发任何应用程序。我只是想了解带指针的结构是如何工作的。如果内存位置完全相同,为什么If语句中的比较会失败?不过这似乎是一个糟糕的想法。你把苹果和桔子做比较,把它们都当作香蕉,这样它们就可以比较了……似乎OP想了解一些关于内存地址和结构布局的知识(也许):上面的代码是检查内存中某个节点结构的地址是否正是该结构的第一个int数据成员的地址的方法。很可能,在这种情况下,答案是肯定的,他们有相同的地址。现在我们知道,在这个特定的情况下,两个地址是相同的。。。让我们忘记它,不要编写任何依赖于这样一个假设的代码(这肯定会打破,例如,一旦有人向节点结构添加虚拟函数)Darhuuk:不,这不是苹果和橙子之间的比较。所有指针的大小都相同,使用int*进行类型转换是安全的,只是为了比较。虽然这是可以避免的,但没有什么错。如果我错了,请纠正我一旦虚拟函数、基类和其他东西被抛出,结构中列出的第一项可能不是第一项。。。医生:你是对的,但我怀疑一个单一的链接列表对于虚拟功能是否有用:)无论如何,这个问题更多的是为了学习而不是为了做,我希望现在能弄清楚这似乎是一个糟糕的想法。你把苹果和桔子做比较,把它们都当作香蕉,这样它们就可以比较了……似乎OP想了解一些关于内存地址和结构布局的知识(也许):上面的代码是检查