C 探幽 指標引數

2021-10-25 12:07:31 字數 615 閱讀 1616

不要用return語句返回指向「棧記憶體」的指標,因為該內存在函式結束時自動消亡。

char *getstring(void)

int main()

區域性變數儲存在棧中,區域性變數的生命週期是有限的,函式退出的時候會釋放,所以這裡返回的指向棧的指標是危險的。

改寫成如下示例

char *getstring2(void)

int main()

這裡的輸出內容是正確的,但是函式getstring2內的「hello world」是常量字串,位於靜態儲存區,它在程式生命期內恆定不變。無論什麼時候呼叫getstring2,它返回的始終是同乙個「唯讀」的記憶體塊。

面試的時候遇到這道題,沒有回答正確嚶嚶嚶,需要搞清楚變數在記憶體中是如何儲存的。

如果在函式體中,改變的是指標指向的變數的值,則該改變是會被儲存的;如果改變的是指標本身,則不會被直接改變。

指標引數p的副本是 _p,編譯器使 _p = p。如果函式體內的程式修改了_p的內容,就導致引數p的內容作相應的修改。這就是指標可以用作輸出引數的原因。如果只是把_p所指的記憶體位址改變了,將p絲毫未變。

參見c++記憶體管理

C 探幽系列 指標 引用 const(二)

在c 中,當我們定義需要定義一種值不允許修改的變數時,就用到了const關鍵字,應用場景如表示緩衝區大小或者表示乙個常量。const修飾的物件具有以下特點。1.const修飾的常量不可修改 const int a 10 定義const常量 a 11 錯誤 不允許修改2.const物件一旦建立必須初始...

C 探幽 指標與陣列的對比

陣列要麼被建立在靜態儲存區 如全域性陣列 要麼被建立在棧上 區域性陣列 陣列名對應著一塊記憶體,而不是指向一塊記憶體,其位址與容量保持不變,只有陣列的內容可以改變。指標可以隨時指向任意型別的記憶體塊,其特徵是可變。因此經常使用指標操作動態記憶體塊,比陣列靈活,卻也更危險。char p hello 其...

c 函式探幽

inline double square double x int rats 1,next 2 int rodents rats rodents next 賦值操作而已必須在宣告引用變數時進行初始化。一旦與某個變數關聯,將不能改變關聯關係。void swap int a,int b const fr...