[英]Significance of ** in pointers - C language
我正在嘗試使用C語言對鏈表進行一些操作。 我是一個新手,有點混淆功能append()
。
他們在函數中傳遞了參數,如struct node **q
。 他們正在使用*q
。
函數append()
用C語言編寫:
void append(struct node **q, int num) {
struct node *temp, *r;
if(*q==NULL) {
temp=malloc(sizeof(struct node));
temp->data=num;
temp->link=NULL;
*q=temp;
}
else {
temp=*q;
while(temp->link!=NULL)
temp=temp->link;
r=malloc(sizeof(struct node));
r->data=num;
r->link=NULL;
temp->link=r;
}
}
我無法理解: -
**q
而在代碼部分使用*q
? 任何幫助,將不勝感激。
請記住,C中的參數是按值傳遞的 ,這意味着它們的值被復制。 因此,要更改函數中的參數,必須通過引用傳遞它。 在C中,這是通過使用指針完成的。 然而,指針本身時,傳遞給函數也是按值傳遞的,這樣一來就能改變這個指針,你必須通過引用傳遞它 ,因此你把它作為一個指針的指針。
對於您的特定代碼,函數append
修改了您在其頂部傳遞的指針,因此您需要通過引用將其傳遞給指針的地址。 來電者做的事情如下:
struct node *queue;
append(&queue, ...);
然后當append
返回時, q
可能會改變。
在函數中使用*q
是因為一元*
運算符用於解引用指針。 因此,如果你有一個指針q
那么*q
將是q
指向的值。 在函數的情況下,由於q
是指向指針的指針,因此*q
將導致原始指針。
如果使用上面的短片段調用,則*q
將返回queue
指針。
這是為了將頭指針的地址傳遞給append()
。
我很確定,追加將被稱為這樣,
int main()
{
struct node *k;
//calling append() function.
append(&k);
}
請參考這里的一些簡單示例。 http://www.cplusplus.com/forum/general/13227/
** q表示q是指向另一個指針的指針,例如p。 如果我想得到p的值,使用qi必須使用像** q。 * q將q中的值指向p的地址.Again a *將得到p的值。
你必須很好地理解指針的概念。 通常,如果您使用指針,則可以使用*運算符訪問該指針內的值。
例如:
x=10; //Assume Memory Address of x is 1000. 1000 holds value 10
int *y=&x; //Assume Memory address of y is 1100. 1100(y) holds pointer value 1000
這里,
y will hold 1000
*y => value at y => value at 1000 => 10
讓結構看起來像這樣。
struct node
{
int data;
struct node *link;
}
最初您的隊列是空的。
//Initially queue is empty.
struct node *queue=NULL;
append(&queue,10); //append(4000,10);
這里假設隊列的地址是4000。
4000 => queue => holds value 0
所以這里4000保持隊列的開始。 由於隊列為空,因此它保持為0。
這里我們必須訪問值4000才能獲得第一個節點地址。 因此,您將訪問指向指針(當前為0)的指針(4000)。 在這種情況下,您正在處理雙指針,因此您的聲明是** q 。
void append(struct node **q, int num)
這里q將是4000,* q => q處的值是NULL(零) 。 進入if塊。
if(*q==NULL) //*q => value at q is NULL(Zero)
{
temp=malloc(sizeof(struct node)); //assume temp=3000
temp->data=num; //3000->data=10
temp->link=NULL; //3000->link=NULL;
*q=temp; //*q => value at q => value at 4000 is 3000 now.
}
現在再次呼叫追加
append(&queue,20); //append(4000,20);
4000 => queue => holds value 3000 //updated address in queue
如果列表不為空,則它將在else塊上運行。
temp=*q; // temp= value at q => 3000
//Iterate from 3000 to traverse the list and add num in the end.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.