struct node * head和struct node ** head之间有什么区别?

时间:2012-08-25 17:18:58

标签: c pointers linked-list

我正在尝试对链接列表进行排序。我对何时使用struct node*head以及何时使用struct node **head感到困惑,可以使用它们来完成实现。

我应该何时使用:

void sortedinsert(struct node **head)

我应该何时使用:

void sortedinsert(struct node *head)

10 个答案:

答案 0 :(得分:9)

使用此功能签名:

void changeNode(struct node *head)

您有一个指向该节点的指针,因此您可以更改该结构。您无法更改变量head 指向的内容。我们假设struct node的以下定义:

struct node
{
    int field1;
    struct node *next;
}

使用给定的函数签名和struct node,请考虑以下操作可以更改函数中的结构:

void changeNode(struct node *head)
{
    head->field1 = 7;
    head->next = malloc(sizeof(struct node));
}

C是按值传递:当我们将变量传递给函数时,函数会获得副本。这就是为什么我们将指针传递给struct node,以便我们可以更改它,并在函数外部具有这些更改的效果。但是我们仍然只获得指针本身的副本。因此以下操作无用:

void changeNode(struct node *head)
{
    // we're only changing the copy here
    head = malloc(sizeof(struct node));
}

head 的更改不会反映在该功能之外。为了改变head指向的内容,我们必须使用额外的间接级别:

void changeNode(struct node **head)
{
    // now we're changing head
    *head = malloc(sizeof(struct node));

    // alternately, we could also do this:
    *head = NULL;
}

现在,head的更改会反映在 函数之外。

答案 1 :(得分:2)

如果head总是指向链接列表的头部(一个常量位置),那么使用struct node * head 如果您打算更改头部使用节点** head

指向的位置

答案 2 :(得分:1)

struct node **head您正在传递head指针的地址,使其可以引用/指向不同的内存区域。使用struct node *head,您无法将head修改为指向其他任何位置

答案 3 :(得分:0)

第一个是指向节点的指针,它是一个结构。

(struct node *) head;

head定义为可以存储node的地址的变量。

这允许在方法中通过引用传递node

第二个是指向节点指针的指针,该节点是一个结构。

(struct node **) head;

head定义为变量,它可以存储另一个变量的地址,该变量的地址为node

这允许在方法中通过引用传递node *

答案 4 :(得分:0)

node*是指向节点结构的指针。 node**是指向节点结构的指针。如果要通过引用修改指针,则在C中使用指针指针。

假设您要在节点B上执行操作,该操作可能会使用不同的节点替换节点B.一种做事方式是

nodeA.next = foo(nodeA.next);

另一个选择就是

foo(&nodeA.next);

让foo隐式替换nodeA.next指针。

答案 5 :(得分:0)

在此示例中,由于head的值可能会在创建时发生变化(它可能指向与当前节点不同的某些其他节点),

你应该使用,

void sortedinsert(struct node **head)

因为您的头部可能需要修改。

看来,下面的原型需要改变,

void sortedinsert(struct node *head)

因为这不允许你修改头部,所以应该是这种情况(如果你使用的话),

struct node * sortedinsert(struct node *head)

返回更新的头部,可以在此函数的调用者中使用。

答案 6 :(得分:0)

运行或阅读此内容您可以看到它

#include <stdio.h>
struct node{
    int one;
    int two;
    struct node * next;
    //char location[100];
};
void changeHead(struct node** head){

}
void sort(struct node* head){

}
int main(){
    struct node* head = (struct node*) (malloc (sizeof(struct node)));

    // now head pointing to a node stucture ( if you dereferance head you get teh first value)

    struct node* tmp = head;

    struct node** newHead = (struct node**) (malloc (sizeof(struct node*)));

    //New head points to a 'struct node*', which hold an addtess of another struct node

    head->one = 12;//*head->one =12; //head.one = 12 is wrong cos it is holding an address.
    // you can do it but it doesnt make sence since you dont know whats on address #12


    // now if you want head to point to old head which is on tmp at the moment
    *newHead = head;

    // now if you working with 2 linked list and you want to change the heads use below
    changeHead(newHead);

    // if you want to just sort its better and easy to use
    sort(head);

    //chack whats on head and newhead
    printf("double derefence newHead:%d\n",**newHead);
    printf("derefence newHead(its and address same ad address of head):%d\n",*newHead);
    printf("Head(its and address):%d\n",head);
    printf("derefence Head:%d\n",*head);//head->one works too
}

答案 7 :(得分:0)

简单来说,当您想要更改“head”指向的位置时,请使用**head,否则请使用*head,但不允许更改位置。

答案 8 :(得分:0)

  1. 要改变指向第一个指针的头部 节点,你需要传递头的地址,即(&head)来调用 函数(因此您已声明指向指针变量的指针 在函数(struct node**head)中,因为它接收的地址 head这只是指向第一个节点的指针。
  2. 但是,如果您知道头部将保持固定,即您不想要 转向指向其他节点(例如......不插入新节点) 然后你只能通过(头)来调用这个函数 并在函数定义中写入(*head)

答案 9 :(得分:0)

情况1:使用时:

void sortedinsert(struct node **head)

在功能内您将实际上正在修改 head 指针,因为很有可能您将在内部使用*headsortedinsert很可能会用参数&head来调用。

情况2:使用时:

void sortedinsert(struct node *head)

在函数内部,您将修改head 指针的副本,因为很有可能您将在内部使用head变量。 sortedinsert很可能会用参数head来调用。