在C语言中,函数参数中的双星号**有什么作用

gig*_*ure -1 c pointers pass-by-reference function-declaration

我在链接列表中遇到了一个代码片段,但这是我第一次看到参数中使用“**”双星号。它有什么作用?

// Adding an item to the beginning of the list
void push(node_t ** head, int val) {
    node_t * new_node;
    new_node = (node_t *) malloc(sizeof(node_t));

    new_node->val = val;
    new_node->next = *head;
    *head = new_node;
}
Run Code Online (Sandbox Code Playgroud)

Vla*_*cow 5

如果你有一个变量,例如

int x = 10;
Run Code Online (Sandbox Code Playgroud)

并且想要在函数中更改它,您需要通过引用将其传递给函数。

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

这是一个演示程序。

#include <stdio.h>

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

int main( void )
{
    int x = 10;

    printf( "Before calling f x = %d\n", x );

    f( &x );

    printf( "After  calling f x = %d\n", x );
}
Run Code Online (Sandbox Code Playgroud)

程序输出是

Before calling f x = 10
After  calling f x = 20
Run Code Online (Sandbox Code Playgroud)

如果变量具有指针类型,例如

node_t *head = NULL;
Run Code Online (Sandbox Code Playgroud)

然后,如果您要在函数中更改其值,则需要通过引用将其传递给函数,例如

push( &head, 10 );
Run Code Online (Sandbox Code Playgroud)

所以相应的函数参数将被声明为

void push(node_t ** head, int val);
Run Code Online (Sandbox Code Playgroud)

并将指针取消引用到原始指针,head例如

*head = new_node;
Run Code Online (Sandbox Code Playgroud)

head您可以更改main 中定义的原始指针。

如果您不通过引用传递指针,而是通过值传递指针,则该函数将处理原始指针值的副本。更改副本不会影响原始指针。

考虑前面的演示程序,其中原始变量按值传递给函数

#include <stdio.h>

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

int main( void )
{
    int x = 10;

    printf( "Before calling f x = %d\n", x );

    f( x );

    printf( "After  calling f x = %d\n", x );
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,原始变量 x 将不会改变。它是在函数内更改的其值的副本。所以程序输出将是

Before calling f x = 10
After  calling f x = 10
Run Code Online (Sandbox Code Playgroud)