指針用作傳出參數時,需要二級指針


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. 變量作函數形參調用的時候都是要分配一個副本,不管是傳值還是傳址。傳入后就和形參沒有關系了,它不會改變形參的值。

 

注意指針所指向的內存是在函數內分配的還是在函數外分配的,以及是不是在堆上分配的。

你定義了一個指針,但是並沒有分配指針指向對象所需的內存空間;當函數返回后,此函數棧中的內存會被釋放掉,不要讓指針指向此函數棧中的內存空間,要指向堆上或此函數外的內存空間。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM