具有不同值的相同地址

时间:2015-06-01 12:00:45

标签: c pointers

我试图用链表制作多个数组。 因此,一个链表列表会收集其他链表。

然而,当我把链表头部地址 转换为int变量然后放入int变量 回到指针。

指针保持相同的地址,但指针的值不同 前)

&(list.head) : 0x0032FAFAC
*(list.head) : 10
pointer : 0x0032FAFAC
*pointer : 1530784

我删除了不必要的代码。 程序是

  1. TotalList添加列表头。

  2. 转到插入功能。

  3. 转到Print2函数并将列表头地址赋给指针。

  4. 指针的值与前一个值不同。

  5. 我等着你的回答。谢谢。

    #include <stdio.h>
    #include <stdlib.h>
    
    struct node
    {
        int key;
        struct node* next;
    };
    
    struct Linkedlist
    {
        struct node* head;
        int (*Search)(struct node** head, struct node** pNode, struct node** nNode);
        int (*Insert)(struct node** head, int data);
        int (*Delete)(struct node** head);
        int (*Print)(struct node** head);
        int (*Print2)(struct node** head);
        int (*Move)(struct node** head);
    };
    
    int Insert(struct node** head, int data)
    {
        struct node* newNode;
        struct node* temp;
        struct node* temp2;
        newNode =(struct node*)malloc(sizeof(struct node));
        newNode->key=data;
        printf("address in int variable (Insert function) : %p\n",data);
        newNode->next=0;
        if((*head)==NULL)
        {
            (*head)=newNode;
            return 1;
        }
        else if(Search(head,&temp,&temp2)==1)
        {
            temp->next=newNode;
            return 1;
        }
        else
            return 0;
    }
    
    int Print2(struct node** head)
    {
        struct node* temp = (*head);
        int* kp;
    
        while(temp!=NULL)
        {
            printf("Linked list key : %p\n",temp->key);
            kp=temp->key;
            printf("value of pointer with Linked list key : %d \n",*kp);        
            //tail을 찾았을 경우
            if(temp->next==NULL)
            {
                printf("\n");
                return 1;
            }
            temp=temp->next;
        }
        return 0;
    }
    
    int main()
    {
        struct Linkedlist list;
        struct Linkedlist list2;
        struct Linkedlist list3;
        struct Linkedlist TotalList;
    
        Linkedlist_init(&list);
        Linkedlist_init(&list2);
        Linkedlist_init(&list3);
        Linkedlist_init(&TotalList);
    
        list.Insert(&(list.head),10);
        list.Insert(&(list.head),20);
        list.Insert(&(list.head),30);
    
        list.Insert(&(list2.head),40);
        list.Insert(&(list2.head),50);
        list.Insert(&(list2.head),60);
    
        list.Insert(&(list3.head),70);
        list.Insert(&(list3.head),80);
        list.Insert(&(list3.head),90);
    
        printf("&(list.head) : %p\n",&(list.head));
        printf("&(list2.head) : %p\n",&(list2.head));
        printf("&(list3.head) : %p\n",&(list3.head));
    
        printf("*(list.head) : %d\n",*(list.head));
        printf("*(list2.head) : %d\n",*(list2.head));
        printf("*(list3.head) : %d\n",*(list3.head));
    
        TotalList.Insert(&(TotalList.head),&(list.head));
        TotalList.Insert(&(TotalList.head),&(list2.head));
        TotalList.Insert(&(TotalList.head),&(list3.head));
    
        list.Print(&(list.head));
        list.Print(&(list2.head));
        list.Print(&(list3.head));
        TotalList.Print2(&(TotalList.head));
    
        //printf("%d\n",list.Delete(&(list.head)));
        //list.Print(&(list.head));
    
        return 0;
    }
    

    结果:

    &(list.head) : 003DFE34
    &(list2.head) : 003DFE10
    &(list3.head) : 003DFDEC
    *(list.head) : 10
    *(list.head) : 40
    *(list.head) : 70
    
    address in int variable (Insert function) : 003DFE34
    address in int variable (Insert function) : 003DFE10
    address in int variable (Insert function) : 003DFDEC
    
    10 20 30
    40 50 60
    70 80 90
    
    Linked list key : 003DFE34
    value of pointer with Linked list key : 2117552
    
    Linked list key : 003DFE10
    value of pointer with Linked list key : 2104160
    
    Linked list key : 003DFDEC
    value of pointer with Linked list key : 2104328
    

2 个答案:

答案 0 :(得分:1)

&amp; a显示

的地址

* a显示查看地址时的值

所以在这种情况下:

 &(list.head) == pointer
 (list.head) == *pointer
 *(list.head) == **pointer

答案 1 :(得分:0)

&(list.head) : 0x0032FAFAC
*(list.head) : 10
pointer : 0x0032FAFAC
*pointer : 1530784

这里缺少间接步骤。 (list.head)也是一个指针,其值为1530784

因此,&(list.head)是指针list.head的地址。它总是一样的。 (list.head)是该指针的值。它可以改变,但它不会在你的程序中。 *(list.head)是指向的对象的值,即10。