2010-10-18 23 views
1

例如:瞭解在方法定義在C使用星號的數目?

void DeleteLastNode(NodeType **L) 

如果** L表示變量L的地址,可以在不被&大號代替取代?另外,如果我要使用* L或者僅僅使用L,我是不是可以改變L的內容?如果是這樣,如果L是指向它的指針,那麼使用* L和L有什麼區別?我只能通過發送L並在實際方法中使用* L來查看它的內容嗎?

我想我還沒有與指針太好。

+1

賓基將幫助你肯定的:http://www.youtube.com/watch?v=mnXkiAKbUPg – 2010-10-18 15:11:04

+0

賓基太棒了 – pmg 2010-10-18 15:21:44

回答

5

據我所知,一個星號表示C.正常的指針例如,您可以分配內存,使指針指向的是新分配的區域。您也可以指向變量在堆棧中,如:

int x = 10; 
int *p = &x; 

但也有要一個指針傳遞給一個函數,使函數能夠改變指針指向另一個地址的一些情況。現在,我們不是通過指針也不是由它而改變文學的指針信息(這是一個MEM。地址)指出指向另一個地方存儲談論改變一個變量的內容。在這種情況下,我們使用一個指針指向一個由雙星號表示的指針。

int x, y; 
int *p; 
int **pp; 

pp = &p; //pp points to pointer p 
*pp = &x; //pp changes pointer p to point to variable x 
*p = 10; //p (now points to x) assigns value 10 to x 
*pp = &y; //pp changes pointer p again assigning the address of y 
*p = 20; //p assigns 20 to y; 
**pp = 25;// that's tricky, the first * give access to the address pointed by p (&y) the second changes the content of that address to 25. so now y ends with 25 

最終x = 10和y = 25

現在,特別是在你看的情況下,該函數調用看起來像將從鏈表中刪除一個節點的功能。這是有道理的,因爲你有一個指向列表頭部的外部指針。當你刪除最後一個元素時,你的函數必須能夠將指針從當前地址改爲null。你可以使用全局指針來完成它,或者像你的情況那樣,傳遞頭指針的地址。

0

不,不是在C,在函數頭部星號不能被用在函數體代替符號(&)代替。但在C++中,這是另一回事。當人們決定使用C++的功能時,人們想到了一些類似的想法並添加了這個功能。

1

讓我們澄清一些事情。從技術上講,L是一個指向NodeType實例的指針。但是,該函數的名稱提供了不同的解釋:可能L是指向數組的指針地址或NodeType實例的鏈接列表(您必須查閱該函數的文檔以驗證此情況)。

如果是這樣的話,那麼該函數通常會使用這樣的:

NodeType *list = malloc (5 * sizeof(NodeType)); 
/* do something with the list, e.g. put entries into it */ 
DeleteLastNode (&list); /* delete last node in list */ 

功能可能會修改變量指向數組/列表,這就是爲什麼你必須通過的地址列表的功能。

但要說具體的話,我們需要更多關於DeleteLastNode()的信息。

0

東西可能有助於理解

NodeType **L 

裝置L是指針的NodeType對象的指針。

例如,如果它是

NodeType *P 

那麼P是一個指向的NodeType對象,並且如果P是0xE0101010,並且每個節點類型對象是80個字節,則P + 1將0xE0101060(0xE0101010加0x50 = 0xE0101060)。

然後我們來看看L,它是指向NodeType指針的指針。如果我們考慮一個指針是4字節,那麼如果L是0xE0202020,並且L + 1將只是0xE0202024。

因此,每當涉及指針算術時,使用正確的類型非常重要。請注意,L [3]與*(L + 3)相同,因此L [3]涉及指針算術,因此指針類型需要非常精確,否則當您查看指針指向的內容時到by * L,這是調用解引用,然後可能發生分段錯誤(Unix/Linux)或GP錯誤(Windows)。

0
NodeType nt; 
NodeType *pnt = &nt; 

--------   ------ 
| pnt |-------->| nt | 
--------   ------ 

這裏,pnt(的pnt含量)&nt; *pntnt

NodeType **L = &pnt; 

------  --------   ------ 
| L |------->| pnt |-------->| nt | 
------  --------   ------ 

現在L(的L含量)&pnt; *Lpnt;因此**L*pnt,即nt。請注意0​​彼此取消*L -> *&pnt -> pnt)。

0
如果** L表示變量L的地址,是否不能用&L替換?

**L表示在由L指向的位置所指向的位置處的。爲了說明,假設下面的聲明:

int  a = 1; 
int * pa = & a; // whitespace doesn't matter here 
int **ppa = &pa; 

ppapa,這反過來又指向a,其具有值1。這裏是展示他們的關係的假想存儲器映射(假設32位整數,大端):

 
Object  Address  0x00 0x01 0x02 0x03 
------  -------  ---------------------- 
    a  0x10008000  0x00 0x00 0x00 0x01 
    pa  0x10008004  0x10 0x00 0x80 0x00 
    ppa  0x10008008  0x10 0x00 0x80 0x04 

聲明符,在*運營商表示此變量是指針並持有的地址另一個變量。在表達式中,*運算符產生指針指向的值。在一個C++聲明符,所述&操作者指示該變量是一個參考並且是同義詞爲另一個變量(它不一定是同樣的東西作爲一個指針; C不允許在所述&聲明符)。在表達式中,運算符產生其操作數的地址地址

所以,通過以上的存儲器映射去,以下所有條件都爲真:

 
    a == 1; 
* pa == 1; // again, whitespace doesn't matter here. 
**ppa == 1; 

    &a == 0x10008000; 
    pa == 0x10008000; 
*ppa == 0x10008000; 

    &pa == 0x10008004; 
    ppa == 0x10008004; 

&ppa == 0x10008008;