不同的指针如何相互影响?
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= 中的这条语句,两个指针 head
和 h1
都指向创建的节点]
void enqueue (queue **a, queue **b, queue *c)
{
if (*a) *b=(*b)->next=c;
else *a=*b=c;
^^^^^^^^^^^^^
}
因为函数被同一个节点和指针head
和h1
调用了两次。
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
也就是指针p1
和p2
都指向同一个变量val
。所以你可以使用任何一个指针来访问指向的对象。
请随时将此 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= 中的这条语句,两个指针 head
和 h1
都指向创建的节点]
void enqueue (queue **a, queue **b, queue *c)
{
if (*a) *b=(*b)->next=c;
else *a=*b=c;
^^^^^^^^^^^^^
}
因为函数被同一个节点和指针head
和h1
调用了两次。
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
也就是指针p1
和p2
都指向同一个变量val
。所以你可以使用任何一个指针来访问指向的对象。