原文
本文是在程式設計過程中遇到的實際問題,作為總結。參考文件:
一般用指標做函式形參是為了傳入引數位址,來進行修改實引數的值,即指標指向的值。但是如果要用來修改指標本身的值則需要指標的指標或者指標變數的傳址引用。
先來看一段經典的**:
[cpp]view plain
copy
?void
getmemory1(
char
*p )
void
test(
void
)
顯然你會發現,經過指標變數通過函式getmemory後,還是null,並沒有分配記憶體,所以編譯執行會出錯,或者直接編譯報錯。
原因在於,函式引數傳遞的時候,直接傳遞是值傳遞,需要引用傳遞需要加上『&』,作為值傳遞,p=str,也就是說,p指向的位址和str指向的位址是相同的,同為指向null,但是在函式中區域性變數p又重新分配了100個位元組的變數,他的值發生變化,指向了別的位址,但是str並沒有變化,所以函式對str是無效的。
究其根本原因,在於p指標的位址和str指標的位址不一樣,兩者只是共同指向同乙個地方(p先指向str指向的地方,後又指向一塊記憶體,然後在函式結束後記憶體收回)。
要實現指標作為函式形參,改變實參的值。一般有兩種做法:
1.使用雙指標,或者指標陣列形式作為形參,將實參的位址傳入函式。
[cpp]view plain
copy
?void
getmemory2(
char
**p,
intnum)
}
void
test(
void
)
getmemory2函式還可以使用陣列指標進行傳值,如getmemory2(char* p, int num);
2. 函式直接返回分配好記憶體的位址。
[cpp]view plain
copy
?char
*getmemory3()
return
p;
}
void
test(
void
)
該方法使用乙個指標函式,返回乙個指向分配好記憶體的位址,返回的是乙個值(p指向的位址,乙個int變數(處理器位數決定)),是能夠返回的,如果返回的是指向區域性變數的指標,那麼會發生程式錯誤。指標做函式返回值,指向的值在函式結束後不能夠被登出,否則發生程式錯誤(返回時並沒有錯,使用的時候已經變成未知的值,可能造成系統紊亂)。
指標作為函式形參
先來看兩個程式 程式1 include void fun int p int main void 輸出為 程式2 include void fun int p int main void 輸出為 對於程式2,不難理解 程式1,明明改變了p的指向了,為什麼還是輸出1呢?其實問題的關鍵不是指標作為形參的...
C C 指標作為函式形參注意點
函式形參是指標變數,直接對其賦值 指標相互賦值 只是改變了它的指向,原先傳入的指標指向的內容並沒改變 若要想改動其指向的值,需要通過memcpy或通過指標呼叫賦值 include include include include include include include using namesp...
C 中的函式指標2(作為函式形參使用)
在 c 中函式引數型別為指標的指標 中提到,在c 中,每次呼叫函式時都會重新建立它的形參,並用傳入的實參對形參進行初始化。因此,不能用函式當做其他函式的形參,因為在函式內部無法建立函式的副本。而函式的指標可以作為其他函式的引數,指標是可以在函式內部進行複製的。bool fp const string...