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

I'm having a problem understanding double pointers [duplicate]

提问人:Alane 提问时间:5/27/2022 最后编辑:Remy LebeauAlane 更新时间:5/27/2022 访问量:286

问:

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

这是我的代码:

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 指针 按引用传递 值传递 声明

评论

0赞 kaylum 5/27/2022
重复的帖子解释了为什么需要双指针。
0赞 yano 5/27/2022
C 语言中的所有内容都是按值传递的,指针也不例外。如果希望函数对在其外部保留的数据进行更改,则必须 1) 返回一个值或 2) 传入指向数据的指针,以便可以在函数内部取消引用指针,从而访问它指向的数据。在这种情况下,要更改的数据本身就是一个指针,因此需要双指针。

答:

0赞 Some programmer dude 5/27/2022 #1

在 C 中,函数的所有参数都是按值传递的。这意味着调用中使用的值将复制到函数局部参数变量中。

因此,参数变量的行为与任何其他局部变量一样,其生命周期以函数的结束而结束。当函数返回时,您对变量所做的所有更改都将丢失。

现在想想指针。如果不将指针传递给指针,而只需分配给:headhead

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

现在,该任务将丢失。

当您将指针传递给指针时,将模拟引用调用。该函数现在具有指向原始指针的指针。您可以取消引用双精度指针以获取函数中的原始变量。headheadmain

0赞 Vlad from Moscow 5/27/2022 #2

考虑这个简单的程序。

#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 );