指標和數組作為參數傳入函數時,傳入的是地址,即指向變數的地址和數組的首地址,可以在函數中改變指標或數組的值,但本質上它們還是值的傳遞(區別於變數的值傳遞的是:變數值傳遞不會改變實參原來的值。),我們無法對指標和數組的地址進行操作(如:地址賦值,分配記憶體等),要進行地址操作需要使用指標引用或指標的指標。
樣本:
<span style="font-size:18px;">int main(){int i = 1;int *p = &i;int sz[] = {1};testFun(p, sz); //10, 20testFun1(p);//10testFun2(p);//50int * p1 = NULL;testFun3(p1);*p1 = 10;//10 delete p1; return 0;}</span>
<span style="font-size:18px;">//值傳遞void testFun(int *p, int sz[]){*p = 10;sz[0] = 20;}//值傳遞int g_int = 50;void testFun1(int *p){p = &g_int;}//指標引用void testFun2(int *&p){p = &g_int;}//指標引用分配記憶體void testFun3(int *&p){p = new int;}</span>
運行testFun()後,指標值變為10,數組變為20
運行testFun1()後,指標值為10,不變
運行testFun2()後,使用指標引用,指標值變為50
運行testFun3()後,使用指標引用,記憶體配置成功,指標可進行賦值
指標引用 == 指標的指標
指標的引用儲存的地址實際是指標本身的地址(即類似於int型的4位元組空間),對它進行地址賦值或記憶體配置,實際是使該指標重新指向一個新的記憶體塊的首地址(即儲存新的指標變數地址,當然類型要是一樣的)。
使用const &傳參
屬於值傳遞,雖然使用引用,傳入的是地址,但是傳入的值無法改變。