c語言基礎必備 用指標作為引數來申請記憶體

2021-06-20 19:09:40 字數 1335 閱讀 9803

引數策略

如果函式的引數是乙個指標,不要指望用該指標去動態申請記憶體。如下:

void getmemory(char *p, int

num)

void test(void

)

原因是編譯器總是為每個引數製作臨時副本。指標引數p, 其副本為_p,使_p=p。如果改變了_p所指的內容,相應的p所指的內容也跟著改變(畢竟指向同樣的地方)。但是在getmemory中動態分配記憶體空間,改變了_p的內容。在呼叫函式中的p還是指向null。再者,因為函式getmemory中動態分配了空間,但是沒釋放,這樣呼叫一次函式,就洩露了一次記憶體。圖示:

如果非得用指標引數申請記憶體,可以用指標的指標作為引數申請記憶體

void getmemory(char **p, int

num)

void test(void

)

原理是一樣的,比較難理解,圖示表示:

比較好的方法是傳指標的引用

#include #include 

#include

#include

using

namespace

std;

void getmemory(char

*&p, int

num)

void test(void

)int

main()

這裡注意指標的引用 為char* &a,要是不好理解可以這樣:

typedef char*pchar;

pchar &a

返回值策略

可以用函式返回值來傳遞動態記憶體。這中方法比「指標的指標」簡單多了

char *getmemory(int

num)

void test(void

)

在使用返回值時,千萬別返回指向「棧記憶體」的指標、引用,因為該內存在函式結束時自動消亡了,返回的指標是個野指標了。例如

char *getstring()

void test(void

)

在函式中不定義陣列,定義指標,示例:

char *getstring()

void test(void

)

此時的程式是正確的,但是有一點,此時分配的記憶體處於靜態區,是只可以讀取但是不可以修改

的。

指標作為函式引數,C語言指標作為函式引數詳解

include void swap int a,int b 函式宣告 intmain void void swap int a,int b 大家想一下,執行這個程式是否能互換 i 和 j 的值?不能!i 還是3,j 還是5。因為實參和形參之間的傳遞是單向的,只能由實參向形參傳遞。被調函式呼叫完之後系...

C語言指標變數作為函式引數

有讀者反饋,不理解字元陣列和普通陣列的區別,下面筆者作一下解答。實際上,字元陣列和普通陣列一樣,沒有本質區別。請大家注意陣列型別的含義 資料型別指的是陣列所包含的元素的型別,而不是陣列名的型別,陣列名永遠是乙個指標,指向第乙個元素的位址,即陣列首位址。字元陣列的每個元素都是char型別,整型陣列的每...

c語言指標作為函式的引數

在c語言中實參和形參之間的資料傳輸是單向的 值傳遞 方式,也就是實參可以影響形參,而形參不能影響實參。指標變數作為引數也不例外,但是可以改變實參指標變數所指向的變數的值。include void swap1 int x,int y swap2 int px,int py swap3 int px,i...