今天遇到一個問題,如題,下面上例子
1 void Get(Node* head) 2 { 3 Node* temp = new Node(); 4 temp->a = 5; 5 head = temp; 6 } 7 8 int main() 9 { 10 Node* head = nullptr; 11 Get(head); 12 13 std::cout << head->a; 14 15 std::cin.get(); 16 return 0; 17 }
程序一運行就會報錯,后來想了想,想明白了,修改代碼如下
1 Node* Get(Node* head) 2 { 3 Node* temp = new Node(); 4 temp->a = 5; 5 head = temp; 6 return head; 7 } 8 9 int main() 10 { 11 Node* head = nullptr; 12 head = Get(head); 13 14 std::cout << head->a; 15 16 std::cin.get(); 17 return 0; 18 }
兩個代碼主要修改就是Get函數增加了返回值。那為什么就正確了呢,我們的指針形參不應該直接返回我們修改后的值嗎。你仔細想想我們指針在主函數中被賦值為空,也就是並沒有指向任何內存,然后到了Get函數,我們的指針被賦值了,指向了一個新的內存塊。
我們僅僅只看這些代碼,你就會發現我們在Get函數中,其實是對指針這個類型的值進行了改變,而這個我們所說的指針形參是對我們指針指向的內存中的元素進行改變。所以這里的我們的指針head就像int一樣是個值傳遞。如果你把Node*改成int,就很清晰了。所以說到底還是概念和理解的不到位。