請教一個C鏈表typedef有關指針的問題?
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**
推薦閱讀: