[英]If a parameter is a pointer type, is the parameter a pointer allocated in local memory
我只是學習C,我對指針參數有疑問。 我的代碼如下:
int Length(node *head)
{
int length = 0;
while (head) {
length++;
head = head->next;
}
return length;
}
我正在閱讀的書中的代碼說要做到這一點:
int Length(struct node* head)
{
struct node* current = head;
int count = 0;
while (current != NULL) {
count++;
current = current->next;
}
return count;
}
真的有區別嗎? 我正在閱讀我的代碼的方式是我得到一個指向node
結構的指針作為參數。 然而,指針本身是一個局部變量,只要我不首先取消引用它,我就可以自由變異。 因此,我可以將指針的值更改為指向不同的node
(可能是下一個節點)。
這會導致內存泄漏還是還有其他一些我沒看到的差異?
此代碼用於鏈接列表實現。 節點結構定義為:
// Define our linked list node type
typedef struct node {
int data;
struct node *next;
} node;
是的,他們都在做同樣的事情。 但在第二個例子中,由於代碼,作者試圖做的更清楚。 在第一個示例中,您使用指針頭來引用除頭部之外的節點。 這可能令人困惑。
你可以像這樣編寫你的函數,你的意圖是明確的:
int GetLength(node* current)
{
int length = 0;
while (current != NULL)
{
length += 1;
current = current->next;
}
return length;
}
您的解決方案和推理是正確的。 node
參數是一個局部變量:傳遞給函數的指針的副本,在堆棧上分配。 這就是你可以在函數中修改它的原因。
兩種解決方案之間沒有區別,至少在功能上沒有區別,現代編譯器最有可能優化本書解決方案中的額外變量。 唯一的細微差別在於風格,許多人傾向於將參數作為不可修改的值,以防萬一,以避免錯誤。
您對論證傳遞機制的理解是正確的。 有些人只是不喜歡修改參數值,原因是修改參數往往容易出錯。 人們強烈期望在函數的任何一點,如果你想獲得調用者作為head
傳遞的值,你就可以寫出head
。 如果修改參數,然后不注意,或者如果你沮喪個月后維護的代碼,你可以寫head
期待的原始值,並得到一些其他的事情。 無論參數的類型如何,都是如此。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.