[英]What does [Structure pointer a = Structure pointer b] do?
我只是最近才接觸鏈表,對此我絕望。 因此,無論如何,我在下面提供了一些代碼段,以使自己更好地理解。
struct node
{
int item;
struct node *next;
};
struct node *root;
struct node *conductor;
root = malloc(sizeof(struct node));
root->item = 777;
root->next = 0;
所以我的問題是,當我這樣做會發生什么: conductor = node;
? 此外,它們之間是否有區別:
conductor = node;
和
conductor = malloc(sizeof(struct node));
conductor->item = root->item;
conductor->next = root->next;
如果有區別,有什么區別? 以及您將如何寫一個conductor = root;
等於conductor = root;
的等效語句conductor = root;
?
conductor=root
使conductor
指向與node
相同的地址,而
conductor=malloc(sizeof(struct node));
conductor->item=root->item;
conductor->next=root->next;
創建一個全新的副本。 你可以試試
printf("%p %p", conductor, root);
查看他們指向的地址,或者
node->item = 12345;
printf("%d %d", conductor->item, root->item);
看看他們是否實際上引用了同一實例。
基本上,指針引用內存中存儲值的區域。 指針本身是一個8字節的整數(盡管其確切大小取決於計算機),它指向內存中的位置。 當我們有一個指向某種類型的指針時,該指針的值指向內存中該類型的第一個字節。
最初聲明指針時,在分配指針之前,它沒有有意義的值(就像C中的所有變量一樣)。 但是要有用,它需要知道指向何處。 您可以要求操作系統(通過malloc)為您提供一些指向的內存,也可以通過為其分配內存地址來指向已經擁有的內存。
當您做conductor=root
,您會將root
的值(內存地址 ,而不是內存本身)復制到conductor
。 由於它們都具有值,因此它們都指向內存中的同一位置,因此它們都指向同一位置!
此方法創建指針的副本,而不是結構的副本,因此它們都指向內存中的同一事物。 因此,如果你在哪里重新分配root->item
,價值conductor->item
也將發生變化 。
請注意,您現在為同一個內存位置指定了兩個不同的名稱,這可能非常方便也很令人沮喪。 這種現象稱為別名(請參閱Wikipedia) 。 小心使用!
調用malloc時,您要求操作系統在足以存儲您請求的數據量的地方留出一些堅固的內存塊。 malloc執行此操作,然后向您返回該塊中第一個字節的存儲位置(指針)。 因此,當您說root = malloc(sizeof(struct node))
,您將獲得一個指向一個足以容納一個節點結構的新內存塊的指針。
conductor = malloc(sizeof(struct node))
,您要預留另一個新的內存塊,並告訴conductor
指向該塊。 因此,在第一個示例中,他們正在看相同的地方,在第二個示例中,他們正在看不同的地方。
這種方法的作用是使conductor
指向結構root
點的完全獨立的副本。 如果您重新分配root->item
的值,那么root->item
conductor->item
將保持不變。
請注意,簡寫為(* conductor).item
conductor->item
。 首先,您要取消引用conductor
指針以獲取存儲在內存中的值(導體結構),然后訪問item
成員。 當您執行conductor->item=root->item
,您conductor->item=root->item
的值復制到root->item
conductor->item
變量中,該變量位於您為conductor
分配的新存儲塊中。 您無需更改conductor
變量本身的任何內容,只需更改其指向的內存即可。
在鏈接列表的上下文中,您可能想要做類似root->next = conductor
。 這將使next
指向與conductor
相同的存儲位置,因此您可以引用conductor
指向的值。 然后, conductor
可以在其next
成員中具有指向該節點的另一個指針,依此類推,可以根據需要在列表中包含任意數量的鏈接。 請注意,通常的做法是將最后一個鏈接的next
值設置為NULL
,這樣您就知道結尾在哪里。
它的完全指針概念..我希望沒有什么要處理Linkedlist。
conductor = node ;
上面的行是一個指針分配。 此后,兩個指針將指向/引用相同的存儲位置。
conductor = malloc(sizeof(struct node));
conductor->item = root->item;
conductor->next = root->next;
在這里,您正在為導體分配內存。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.