我在鏈表中??遇到了一個代碼片段,但這是我第一次看到引數中使用“**”雙星號。它有什么作用?
// 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;
}
uj5u.com熱心網友回復:
如果你有一個變數,例如
int x = 10;
并想在函式中更改它,您需要通過參考將其傳遞給函式。
在 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 );
}
程式輸出為
Before calling f x = 10
After calling f x = 20
如果變數具有指標型別,例如
node_t *head = NULL;
然后再次,如果您要在函式中更改其值,則需要通過參考將其傳遞給函式,例如
push( &head, 10 );
所以相應的函式引數將被宣告為
void push(node_t ** head, int val);
并取消參考指向原始指標的指標,head如
*head = new_node;
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 );
}
在這種情況下,原始變數 x 不會改變。它是在函式中更改的值的副本。所以程式輸出將是
Before calling f x = 10
After calling f x = 10
uj5u.com熱心網友回復:
在這種情況下,它宣告了一個指向指標的node_t指標,該指標是一個函式引數。
下面是一個使用字符指標的簡單示例:
char *charPointer = "This is a text.";
char **pointerToCharPointer = &charPointer;
printf("%s\n", charPointer);
(*pointerToCharPointer) = "This is something new.";
printf("%s\n", charPointer);
輸出:
This is a text.
This is something new.
uj5u.com熱心網友回復:
在這種情況下,這是因為函式正在更新指標值。
請記住,對于更新引數的函式,我們必須傳遞一個指向該引數的指標:
void update( T *ptr ) // for any non-array object type T
{
*ptr = new_T_value(); // writes a new value to the
} // thing ptr points to
int main( void )
{
T var;
update( &var ); // writes a new value to var
}
現在,讓我們T用指標型別替換P *:
void update( P **ptr )
{
*ptr = new_Pstar_value();
}
int main( void )
{
P *var;
update( &var );
}
行為完全相同——我們var通過運算式更新 的值*ptr,所有改變的只是型別。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/496570.html
上一篇:為什么每次在新檔案指標上呼叫“getline”時都必須分配緩沖區?
下一篇:如何在C中正確釋放動態分配的陣列
