我希望這個函式在鏈表的開頭添加一個點:
void addPoint(Point *head, int x, int y, SDL_bool dir) {
Point *p = malloc(sizeof *p);
p->x = x;
p->y = y;
p->dir = dir;
p->next = head;
head = p;
}
頭部初始化較早,如下所示:
Point *down = NULL;
之后我像這樣呼叫函式:
addPoint(&down, x * grid_cell_width, (y - 1) * grid_cell_height, SDL_FALSE);
不幸的是,這不起作用,因為在呼叫之后頭部仍然為 NULL。
uj5u.com熱心網友回復:
您正在傳遞一個指向 的指標,這意味著您正在傳遞一個函式head地址的副本。在您更改值的行中,您實際上是在修改本地指標。要更改它,您需要將指標傳遞給指標,如下所示:headaddPointhead
void addPoint(Point **head, int x, int y, SDL_bool dir) {
Point *p = malloc(sizeof(Point));
p->x = x;
p->y = y;
p->dir = dir;
p->next = head;
*head = p;
}
uj5u.com熱心網友回復:
你做對了這部分:
addPoint(&down,...);
但是運算式的型別&down是Point **, not Point *,所以你需要改變 to 的addPoint定義
void addPoint(Point **head, int x, int y, SDL_bool dir) {
...
p->next = *head;
*head = p;
}
使用此代碼,您具有以下關系:
head == &down // Point ** == Point **
*head == down // Point * == Point *
所以在addPoint函式中,寫到和寫到*head是一樣的down。
uj5u.com熱心網友回復:
嘗試類似:
void addPoint(Point **head, int x, int y, SDL_bool dir) {
Point* p = malloc(sizeof(p));
p->x = x;
p->y = y;
p->dir = dir;
p->next = head;
*head = p;
}
在 C 中,本身沒有傳遞參考機制,您只需將指標傳遞給引數(在這種情況下,是指向指標的指標)。但是這些指標仍然只是值,因此對它們的更改在函式之外是不可見的。可見的是指標指向的值的變化。這就是為什么您需要將您的 p 指標分配給指標頭指向的位置,因此您需要首先使用 (*) 運算子取消參考它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/496568.html
上一篇:從C中的字串中洗掉最常見的單詞
