1. 參數傳遞的原則是:形參傳給實參,不能反向傳遞;
2. 一級指針可以在函數內部修改形參指針指向的內容;
如:
void fun(char *p) { p[2] = a;//由形參(實參)指向的函數外部的數組的內容就被改變了。 }
如果我們想改變實參本身呢?也就是說,我們連指針值都要改變,如果使用:
void GetMemory(int num, char *p) { p = (char *)malloc(num * sizeof(char)) //或C++中:p = new char[10]; }
就不行了,因為在函數內部不能通過改變形參的值來改變實參。
但是,可以通過二級指針來改變指針值。
void GetMemory(char **p, int num) { *p = new char[num]; *p[2] = a; delete char[]; }
關鍵是:
1. 編譯器總是要為函數的每個參數制作臨時副本,指針參數p的副本是 _p,編譯器使 _p = p。如果函數體內的程序修改了_p的內容,就導致參數p的內容作相應的修改。這就是指針可以用作輸出參數的原因。
在本例中,_p申請了新的內存,只是把 _p所指的內存地址改變了,但是p絲毫未變。所以函數GetMemory並不能輸出任何東西。
如果非得要用指針參數去申請內存,那么應該改用“指向指針的指針”,
2. 變量作函數形參調用的時候都是要分配一個副本,不管是傳值還是傳址。傳入后就和形參沒有關系了,它不會改變形參的值。
注意指針所指向的內存是在函數內分配的還是在函數外分配的,以及是不是在堆上分配的。
你定義了一個指針,但是並沒有分配指針指向對象所需的內存空間;當函數返回后,此函數棧中的內存會被釋放掉,不要讓指針指向此函數棧中的內存空間,要指向堆上或此函數外的內存空間。