c c 使用指標做函式返回值和指標作函式引數問題

2021-08-05 20:41:45 字數 1547 閱讀 9732

一、使用指標做函式返回值:

1、當使用指標做為函式的返回值時,主函式處的char *p;將獲得呼叫函式char *pf;的值,即乙個位址值,如oxae72。此時需要我們注意的是該位址值所指向的空間是否存在(即已向作業系統宣告註冊,不會被釋放,即可能被其他操作修改);

2、使用棧記憶體返回指標是明顯錯誤的,因為棧記憶體將在呼叫結束後自動釋放,從而主函式使用該位址空間將很危險。

[code] 

char

* getmemory(

)void main(

)

3、使用堆記憶體返回指標是正確的,但是注意可能產生記憶體洩露問題,在使用完畢後主函式中釋放該段記憶體。 

例如: 

char

* getmemory(

)void main(

)

二、使用指標做函式引數: 

1、有的情況下我們可能需要需要在呼叫函式中分配記憶體,而在主函式中使用,而針對的指標此時為函式的引數。此時應注意形參與實參的問題,因為在c語言中,形參只是繼承了實參的值,是另外乙個量(ps:返回值也是同理,傳遞了乙個位址值(指標)或實數值),形參的改變並不能引起實參的改變。 

2、直接使用形參分配記憶體的方式顯然是錯誤的,因為實參的值並不會改變,如下則實參一直為null: 

void getmemory(char* p)

void main() 

3、由於通過指標是可以傳值的,因為此時該指標的位址是在主函式中申請的棧記憶體,我們通過指針對該棧記憶體進行操作,從而改變了實參的值。 

void change(

char

*p)void main(

)

4、根據上述的啟發,我們也可以採用指向指標的指標來進行在呼叫函式中申請,在主函式中應用。如下:假設a的位址為ox23,內容為'a';而str的位址是ox46,內容為ox23;而pstr的位址是ox79,內容為ox46。 

我們通過呼叫函式getmemory,從而將pstr的內容賦給了p,此時p = ox46。通過對*p(ox23)的操作,即將記憶體位址為ox23之中的值改為char[100]的首位址,從而完成了對char* str位址的分配。 

void getmemory(

char

** p)

void main(

)

5、注意指標的釋放問題,可能形成懸浮指標。 

當我們釋放掉乙個指標p後,只是告訴作業系統該段記憶體可以被其他程式使用,而該指標p的位址值(如ox23)仍然存在。如果再次給這塊位址賦值是危險的,應該將p指標置為null。 

呼叫函式刪除主函式中的記憶體塊時,雖然可以通過位址傳遞直接刪除,但由於無法對該指標賦值(形參不能傳值),可能造成懸浮指標,所以此時也應該採用指向指標的指標的形參。例如: 

void memoryfree(char*

* p)

void main(

)

頂 0

踩0

指標作為函式返回值

c語言允許函式的返回值是乙個指標 位址 我們將這樣的函式稱為指標函式。下面的例子定義了乙個函式 strlong 用來返回兩個字串中較長的乙個 include include char strlong char str1,char str2 else int main 執行結果 c language ...

c 函式指標和返回值為指標的函式

函式指標 返回值為指標的函式 指標函式 注意指標函式與函式指標表示方法的不同,千萬不要混淆。最簡單的辨別方式就是看函式名前面的指標 號有沒有被括號 包含,如果被包含就是函式指標,反之則是指標函式。來講詳細一些吧!請看下面 主要的區別是乙個是函式,乙個是指標變數。在使用是必要要搞清楚才能正確使用 指標...

函式返回值為指標型別

char getstring void void main void 在函式getstring 中定義的變數p屬於local 區域性變數 當函式結束時自動消失,所以在返回時,根本就得不到p所指的內容。解決辦法有以下幾種 可能還有很多方法,不過這裡只是最常見的幾中,也是最能體表現程式中記憶體使用的情況...