簡體   English   中英

指針中**的意義 - C語言

[英]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;
    }
}

我無法理解: -

  1. 為什么他們在參數中使用**q而在代碼部分使用*q
  2. 有什么區別 ?
  3. 最好的方法是什么?

任何幫助,將不勝感激。

請記住,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM