不同的指针如何相互影响?

How different pointer affect each other?

请随时将此 post 标记为重复项,因为我找不到我的问题的任何答案

这是代码,

#include <stdio.h>
#include <stdlib.h>

typedef struct queue
{
    int val;
    struct queue *next;
} queue;
queue *head, *tail, *h1, *t1;

void enqueue (queue **a, queue **b, queue *c)
{
    if (*a) *b=(*b)->next=c;
    else *a=*b=c;
}

void add (int val)
{
    queue *node=(queue*) malloc (sizeof (queue));
    node->val=val, node->next=NULL;
    
    enqueue (&head, &tail, node);
    enqueue (&h1, &t1, node);
}

int main (void)
{
    add (1);
    add (2);
    add (3);
    add (4);
    
    queue *node=head, *test=h1;
    while (node) printf ("%d ", node->val), node=node->next; puts ("");
    
    head->val=99;
    printf ("%d\n", h1->val);
    
    node=head;
    while (node) printf ("%d ", node->val), node=node->next; puts ("");
    
    return 0;
}

而不是打印出来

1 2 3 4 
1
99 2 3 4

它打印出来

1 2 3 4
99
99 2 3 4

改变 h1->val test->val 产生相同的输出

h1 为什么以及如何以某种方式 连接 head

我刚刚尝试了一些东西,但我越来越困惑了 printf ("%p %p\n", head, h1); 打印出同样的东西,这是为什么呢,不应该是不同的吗?

当您将第一个值添加到队列时,由于函数 enqueue.[=24= 中的这条语句,两个指针 headh1 都指向创建的节点]

void enqueue (queue **a, queue **b, queue *c)
{
    if (*a) *b=(*b)->next=c;
    else *a=*b=c;
    ^^^^^^^^^^^^^
}

因为函数被同一个节点和指针headh1调用了两次。

void add (int val)
{
    queue *node=(queue*) malloc (sizeof (queue));
    node->val=val, node->next=NULL;
    
    enqueue (&head, &tail, node);
    enqueue (&h1, &t1, node);
}

两个指针都分配了存储在指针 node 中的相同值。

在那之后指针没有改变,因为这条语句在入队

    else *a=*b=c;

没拿到控制权了

因此您可以使用任一指针来更改指向的节点。

这是一个演示程序,展示了幕后发生的事情。

#include <stdio.h>

int main(void) 
{
    int val = 1;
    int *p1, *p2;
    
    p1 = &val;
    p2 = &val;
    
    *p1 = 99;
    
    printf( "val = %d\n", *p2 );
    
    return 0;
}

程序输出为

val = 99

也就是指针p1p2都指向同一个变量val。所以你可以使用任何一个指针来访问指向的对象。