2009-04-20 91 views
34

所以,我有一些代碼,有點像下面的結構增加結構的列表:如何修改已傳遞到C中函數的指針?

void barPush(BarList * list,Bar * bar) 
{ 
    // if there is no move to add, then we are done 
    if (bar == NULL) return;//EMPTY_LIST; 

    // allocate space for the new node 
    BarList * newNode = malloc(sizeof(BarList)); 

    // assign the right values 
    newNode->val = bar; 
    newNode->nextBar = list; 

    // and set list to be equal to the new head of the list 
    list = newNode; // This line works, but list only changes inside of this function 
} 

這些結構的定義如下:

typedef struct Bar 
{ 
    // this isn't too important 
} Bar; 

#define EMPTY_LIST NULL 

typedef struct BarList 
{ 
    Bar * val; 
    struct BarList * nextBar; 
} BarList; 

,然後在另一文件我做類似如下:

BarList * l; 

l = EMPTY_LIST; 
barPush(l,&b1); // b1 and b2 are just Bar's 
barPush(l,&b2); 

然而,在此之後,L仍然指向EMPTY_LIST,不barPush內創建的修改後的版本。如果我想修改它,還是需要其他一些黑暗咒語,我是否必須將列表作爲指針傳入指針?

回答

41

,如果你想做到這一點你必須在一個指針傳遞給一個指針。

void barPush(BarList ** list,Bar * bar) 
{ 
    if (list == NULL) return; // need to pass in the pointer to your pointer to your list. 

    // if there is no move to add, then we are done 
    if (bar == NULL) return; 

    // allocate space for the new node 
    BarList * newNode = malloc(sizeof(BarList)); 

    // assign the right values 
    newNode->val = bar; 
    newNode->nextBar = *list; 

    // and set the contents of the pointer to the pointer to the head of the list 
    // (ie: the pointer the the head of the list) to the new node. 
    *list = newNode; 
} 

然後使用它是這樣的:

BarList * l; 

l = EMPTY_LIST; 
barPush(&l,&b1); // b1 and b2 are just Bar's 
barPush(&l,&b2); 

喬納森·萊弗勒提出的意見返回列表的新掌門人:

BarList *barPush(BarList *list,Bar *bar) 
{ 
    // if there is no move to add, then we are done - return unmodified list. 
    if (bar == NULL) return list; 

    // allocate space for the new node 
    BarList * newNode = malloc(sizeof(BarList)); 

    // assign the right values 
    newNode->val = bar; 
    newNode->nextBar = list; 

    // return the new head of the list. 
    return newNode; 
} 

用途變爲:

BarList * l; 

l = EMPTY_LIST; 
l = barPush(l,&b1); // b1 and b2 are just Bar's 
l = barPush(l,&b2); 
+1

謝謝,我想這是問題所在,但希望它不是;) – 2009-04-20 04:38:52

2

是的,你必須傳入指針指針。 C通過值傳遞參數,而不是通過引用。

6

請記住,在C中,一切都是按價值傳遞的。

你在一個指針傳遞到指針,這樣

int myFunction(int** param1, int** param2) { 

// now I can change the ACTUAL pointer - kind of like passing a pointer by reference 

} 
2

這是一個經典的p roblem。返回分配的節點或使用指針指針。在C中,你應該將一個指針傳遞給一個你希望修改X的函數。在這種情況下,既然你想要一個指針被修改,你應該把一個指針傳給一個指針。

14

通用答案:將指針傳遞給要更改的內容。

在這種情況下,它將是您想要更改的指針的指針。