带有指针,赋值和比较的C ++结构

时间:2017-11-02 14:11:44

标签: c++ c++11 linked-list

在以下计划中,

// 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

2 个答案:

答案 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))

请参阅this code live on ideone