我在理解双指针时遇到问题

I'm having a problem understanding double pointers

我正在编写一个程序,用于将项目添加到 LIFO(后进先出)数组,其中元素插入到数组的开头。

这是我的代码:

typedef struct neud{
    int num;
    struct neud *next;
}neud;

void add(neud** head,int val){
    //creat a new neod
    neud* newNeod;
    newNeod = malloc(sizeof(neud));
    //assigning
    newNeod->num = val;
    newNeod->next= *head;
    //change the head;
    *head = newNeod;
}

int main()
{
     neud* head = NULL;
     add(&head,10);
     add(&head,20);
     add(&head,30);
     return 0;
}

一切正常,但我不明白这里是否需要双指针。有人可以解释一下吗?

在 C 中,函数的所有参数都按值传递。这意味着调用中使用的值被 copied 到函数 local 参数变量中。

因此,参数变量的行为与任何其他局部变量一样,并且它的 life-time 在函数结束时结束。当函数 returns.

时,您对变量所做的所有更改都将丢失

现在想想head指针。如果不传指针给指针,直接赋值给head:

void add(neud* head,int val){
    // ...
    head = newNeod;
}

现在该分配将丢失。

当您将一个指针传递给一个指针时,您通过 reference 模拟调用。该函数现在有一个指向原始指针的指针。您可以取消引用 double-pointer head 以在 main 函数中获取原始变量 head

考虑这个简单的程序。

#include <stdio.h>

void f( int x )
{
    x = 10;
}

int main( void )
{
    int x = 0;

    f( x );

    printf( "x = %d\n", x );
}

程序输出为

x = 0

也就是说函数f处理传递给函数的变量x的值的副本。所以在函数内改变副本相对于原始变量x没有影响。

要更改函数中的原始变量 x,您需要通过引用传递它。在 C 中,按引用传递意味着通过指向对象的指针间接传递对象。因此在函数中取消引用指针,您可以直接访问指针指向的对象并可以更改它。

将下面的程序与上面的程序进行比较

#include <stdio.h>

void f( int *px )
{
    *px = 10;
}

int main( void )
{
    int x = 0;

    f( &x );

    printf( "x = %d\n", x );
}

程序输出为

x = 10

因此,如果您将函数声明为

void add(neud * head,int val);

并称其为

add( head, 10 );

那么函数将处理原始指针头值的副本。指针本身的值将保持不变。所以你需要通过引用传递指针,函数应该声明为

void add(neud** head,int val);

并称赞

add( &head, 10 );