InitializeList( List * plist)

{

* plist= NULL;

}

typedef struct node{…} Node;

typedef Node * List;

int main(void)

{ …

List movie;

InitializeList(movie);

return 0;

}

我自己的理解是List * plist實際是struct node ** plist;而movie就是struct node * movie,其本身就是指針,為何傳遞的時候是還要用movie呢?

請各路大神不吝賜教!!!


List movie是struct node *movie

因此,根據語法,很明顯的,movie是一個指針,所謂指針,就是一個內存地址,那麼這個地址指向哪裡呢?換句意思一樣的話說,movie的值是什麼?暫時還不知道。什麼時候才知道?需要在InitializeList()這個函數裏分配一塊內存,然後把這塊內存的首地址賦值給movie那個時候,movie纔有了自己的值,那個時候,movie這個指針,才真正指向了一塊有效的內存(也叫作合法的內存)

因此,需要在函數內給movie賦值,通俗一點來說,就是要在函數內改變movie的值。

然而,InitializeList(movie)能改變movie的值嗎?不能!因為對於InitializeList來說,movie只是一個形參,是複製粘貼過去的。你在電腦上複製出一個新文件,然後修改新文件,能改變原來那個文件的內容嗎?不能!函數也是一樣的道理。那麼怎樣才能改變movie的值?那就把movie的地址傳入函數,也就是movie,也就是InitializeList(movie)函數內部只有知道了movie的地址,纔有辦法改變movie的值。

總結:

movie的值是一個指針,指向一塊內存區域,這塊內存區域用於存放所有的Node的具體內容movie的指針是一個地址,這個地址,就是movie這個變數自己所在的內存地址。指針就是地址,就是內容的門牌號;值就是內容。


其實就是把*變成**,那如何加一個*呢,用取地址

你就記住一個, c語言中要改變入參的值,只能傳地址

所以如果要改變指針的值, 只能傳指針的地址


List * plist實際是struct node ** plist;但是movie本身就是struct node * movie

沒發現左邊比右邊多一個*麼...


差點被你繞進去。就從數據結構實際意義來講,忽略中間。鏈表初始化函數定義給出的形參是指向鏈表的指針,而movie是個鏈表,通過取地址就可以獲得指向鏈表的指針,即movie


如果是movie,在函數傳參的時候,相當於另外定義了一個指針假設命名為p,相當於movie和p所指的是一個東西,改變p不能改變movie。給一個建議,C語言函數傳參的時候:

比如 int *a;

不用管前面的*號


可以這麼看把出現List的地方換成Node*

List *plist 相當於 Node **plist;

List movie 相當於 Node *movie;

於是之前的代碼就變成了下面的

InitializeList( Node** plist)

{

* plist= NULL;

}

typedef struct node{…} Node;

typedef Node * List;

int main(void)

{ …

Node* movie;

InitializeList(movie);

return 0;

}

Node* 存放 Node的地址

Node**存放 Node*的地址

movie是Node*類型

函數需要的是Node**


推薦閱讀:
相關文章