2015-11-17 110 views
0
struct Entry { 
    std::string name, phone; 
    Entry *next; 
}; 

Entry * getNewEntry() { 
    std::cout << "Enter name (RETURN to quit): "; 
    std::string name; 
    std::getline(std::cin, name); 
    if (name == "") return NULL; 
    Entry *newOne = new Entry; //allocates a new entry struct obj in the heap 
    newOne->name = name; 
    std::cout << "Enter phone number: "; 
    std::string number; 
    std::getline(std::cin, number); 
    newOne->phone = number; 
    newOne->next = NULL; //in this function pointer to next entry is NULL 
    return newOne; 
} 

void prepend(Entry *ent, Entry *first) { 
    ent->next = first; 
    *first = *ent; 
} 

Entry * buildAddressBook() { 
    Entry *listHead = NULL; 
    while (true) { 
     Entry *newOne = getNewEntry(); 
     if (!newOne) break; 
     prepend(newOne, listHead); 
    } 
    return listHead; 
} 

爲什麼不工作在prepend()這一行:指針範圍

*first = *ent; 

我知道我可以通過參考第一遍得到它的工作,但如果我先引用並設置等於ent指向爲什麼不工作的結構?即使指針變量是按值傳遞的,它們仍然指向同一個結構體?

+1

你是什麼意思與「不工作」?代碼如你所擁有的,會因爲NULL指針解引用而崩潰,因爲在第一次調用prepend時,listHead爲NULL(所以函數中的first將爲NULL)。 – 1201ProgramAlarm

回答

1

*first = *ent所做的是將ent指向的字節的數據字節複製到first指向的位置,在您的示例中該位置將爲NULL,並且可能會導致seg故障。

你想要的首先是對指針(* &)的引用或指向指針(**)的指針,所以你可以改變外部函數中的指針。

爲了您的目的,我建議參考,因爲它會更容易閱讀。

所以前置應爲(通知我已經刪除在等於行derefs):

void prepend(Entry *ent, Entry *&first) { 
    ent->next = first; 
    first = ent; 
} 
+0

謝謝,只是我們的好奇心,指針指針的工作原理,因爲我不需要解引用null?所以我會解除引用**第一個這將使我的地址爲第一,然後設置= ent入哪一個也是一個指針? – andypf

+1

@ crypt3c是的。指針只是一個保存內存位置的變量。指向指針的指針是保存指針內存中位置的變量。所以你可以使用它來做指向指針的事情,比如設置它。 –

1

*指針指在地址中的值=指針。由於指針當前指向垃圾,您將會遇到seg錯誤。

你不能先解引用「第一」,因爲首先是指向內存中最可能不是你程序自己的位置。