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)
如果你有一个变量,例如
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)