C语言 不明白为什么改变一个变量的指针会影响复制它的变量

chhkpiq4  于 2022-12-03  发布在  其他
关注(0)|答案(2)|浏览(157)

我有一段代码可以帮助我对一个链表进行排序,这个链表的节点包含一个单数单词。根据我对插入排序的理解,我已经设法想出了这个代码,它工作得很好,但是有一部分我是从网上复制的,需要帮助来理解它。

Node* insertion_sort(Node* head) {
    Node* dummy;
    dummy= malloc(sizeof(Node));
    if (dummy == NULL) {
        printf("Memory allocation error");
    }
    dummy->next = head;
    Node* last_sorted = head;
    Node* current = head->next;
    while (current != NULL) {
        if(strcmp(last_sorted, current) <= 0) {
        last_sorted = current;
        }
        else {
            Node* prev = dummy;
            while (strcmp(prev->next->word, current) < 0) {
                prev = prev->next;
            }
            last_sorted->next = current->next;
            current->next = prev->next;
            prev->next = current;
        }
        current = last_sorted->next;
    }
    return dummy->next;
}

行中

prev->next = current;

为什么它也会改变我的虚拟节点指向的值?这两个节点不是彼此独立的吗?我怀疑这是由于指针的工作方式,因为这对我来说是一个非常新的领域。
我已经尝试通过调试器运行并看到了更改,但我不明白为什么/如何发生这种情况。

8ljdwjyq

8ljdwjyq1#

dummy是指向节点的指针--它不是节点。
这些节点是由malloc创建的,它们没有名字,这就是为什么跟踪哪些指针指向什么是很重要的。
如果您这样做:

Node* dummy = malloc(sizeof(Node));
Node* prev = dummy;
prev->word = "hello";

则节点的word"hello",并且prevdummy都指向该节点,因此dummy->word也是"hello"prev->worddummy->word是完全相同的变量。
如果因为节点没有名字而仍然让人感到困惑,你可以考虑指向有名字的变量的指针:

int i;
int* p = &i;
int* q = &i;

*p*q以及i是相同的变量。p不是q,但是*pi,并且*p也是i,所以*p*q
如果你计算*p = 42;,那么*q也是42,因为它们都是i

ifsvaxew

ifsvaxew2#

指针指向完全相同的对象,而不是对象的副本。您可以通过查看prevdummy变量的内容来确认这一点-它们将具有相同的值。在执行赋值时,它将更改两个变量所指向的单个对象。

相关问题