2015-11-03 134 views
1

你好,我有以下功能定義:C編程...鏈接表指針迭代

head(); 
traverse(struct *); 

我擔心通過列表迭代時,它已被修改。

void tail() 
{ 
    n3.next = (struct entry*) 0xff; 
} 

void traverse(struct entry *listPt) 
{ 
    while(listPt != (struct entry *) 0xff) 
    { 
     printf("%i\n", listPt->value); 
     listPt = listPt->next; 
    } 
} 

我應該使用不同的算法來迭代列表嗎?複製列表更有利嗎?

while循環中的以下表達式是否覆蓋了現有(值)內存?

listPt = listPt->next; 
+1

爲什麼'0xff'而不是'NULL'? – ShadowRanger

+0

我想看看gdb中的值。使用0xff允許我看到一個獨特的值。 – dcrearer

回答

1

聲明只覆蓋聲明爲函數參數

struct entry *listPt 

它不會修改列表本身局部變量listPt

函數參數是它的局部變量。該函數處理其參數的副本。任何參數的改變都不會影響相應的參數。

考慮

#include <stdio.h> 

void func(int *p) 
{ 
    int y = 20; 

    p = &y; 

    printf("%d\n", *p); // prints 20 
} 

int main(void) 
{ 
    int x = 10; 
    int *px = &x; 

    printf("%d\n", *px); // prints 10; 

    func(px); 

    printf("%d\n", *px); // prints 10; 
} 
+0

因此,在C#中,通過引用將對象傳遞給方法會將更改傳播給保存對該對象引用的任何代碼。與指針有什麼不同。它是否與傳遞引用某些數據的內存相同? – dcrearer

+0

@d_blk這與將引用傳遞給C#中的對象相同。作爲參數傳遞的原始引用iitself將不會更改,但引用引用的對象將被更改。 –

+0

@d_blk另一方面,如果在C#中通過引用傳遞引用,即相應的參數將具有說明符引用,那麼原始引用本身也可以被更改,看起來就像您將指針傳遞給C中的指針一樣。例如void遍歷(struct entry ** listPt);並在函數內部改變了表達式的值* listPt –

-2

沒有這種算法是確定的,你不會修改列表。 如果你想修改你必須設置這樣的函數頭void traverse(struct entry * & listPt)

+0

你的意思是'void traverse(struct entry ** listPt)',不是? –

+0

對,但在C++中,你可以使用&,它更易於使用 –