在以下计划中,
// 1和// 2不起作用,但// 3正在工作。
// 4和// 5不起作用,但// 6不起作用。
问题:
如果if条件中的地址值相同,为什么比较会产生以下错误:
错误:不同指针类型之间的比较'Node *'和'int *'缺少强制转换*
#include<iostream>
using namespace std;
struct Node
{
int data;
Node *Next;
};
int main()
{
Node *Node1=new Node;
Node *Node2=new Node;
Node1->data=11;
Node1->Next=Node2;
Node2->data=22;
Node2->Next=NULL;
/*
if(Node1->Next==&Node2->data) //1
cout<<"Node1->Next==&Node2->data"<<endl; //2
*/
cout<<"Node1->Next="<<Node1->Next<<" &Node2->data="<<&Node2->data<<endl;//3
/*
if(Node2==&Node2->data) //4
cout<<"Node2==&Node2->data"<<endl; //5
*/
cout<<"Node2="<<Node2<<" &Node2->data="<<&Node2->data<<endl; //6
if(Node1->Next==Node2) //7
cout<<"Node1->Next==Node2"<<endl; //8
cout<<"Node1->Next="<<Node1->Next<<" Node2="<<Node2<<endl; //9
}
-
**Output:**
Node1->Next=0x7fb05c460e00 &Node2->data=0x7fb05c460e00
Node2=0x7fb05c460e00 &Node2->data=0x7fb05c460e00
Node1->Next==Node2
Node1->Next=0x7fb05c460e00 Node2=0x7fb05c460e00
答案 0 :(得分:3)
您正在比较不同的指针类型,例如Node*
和int
。您只需将if条件强制转换为
if((int*)Node1->Next==(int*)&Node2->data) //1
//and
if((int*)Node2==(int*)&Node2->data) //4
你是对的,地址是相同的,但是C ++默认强制执行严格的类型检查,这就是你需要强制转换的原因。虽然尽可能避免
答案 1 :(得分:0)
看起来你只想比较存储在指针中的地址,而不关心指针的类型。但指针比较并不像那样。如果比较两个指针,它们的类型必须相同。
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))