記錄 當指標作為函式引數時要注意的問題

2021-10-24 16:44:25 字數 901 閱讀 5939

當指標作為函式引數時,最好加上const,防止函式修改指標所指的位址。

考慮這樣乙個函式,分析輸出結果:

void function(std::shared_ptrptr)

int main()

分析上面的輸出結果可知,當shared_ptr以值傳遞的方式傳入函式時,會生成臨時變數存放傳入的指標內容,臨時變數位址與傳入變數的位址不是同乙個位址。只是都指向了同乙個記憶體中的位置。如果函式中修改了這個臨時變數所指向的位置,那麼傳入引數的位址就再也找不回來了。所以函式在傳遞指標引數時要注意防止函式修改指標的指向位置,通常可以在函式前面加const變數,如:

void function(const std::shared_ptrptr)
理論上如果不希望呼叫函式時產生臨時物件,那麼可以採用傳引用的方向,但同樣要記得加const物件。

void function(const  std::shared_ptr&ptr);
其實函式呼叫用的傳參都是採用傳值的方式,傳引用和指標的方式雖然在表面看上去形式不同,但底層實現的本質相同,也存在臨時物件,只是這個物件我們獲取不到。

完整測試**記錄

#include#includetemplate void show_shared_ptr(std::shared_ptrptr)

class a

void operator << (const a& a)

int data;

};class b

std::shared_ptrdata_a;

};void function(std::shared_ptrptr)

int main()

指標引數需要注意

void func u16 x,u16 y void main void 這樣的方式很多可能會得到乙個錯誤的a,b值,因為在函式func中,x,y是被當作16位操作的。也就是說a,b的值只有低16位在函式func中被賦值了,高16位維持不變。void func u32 x,u32 y void ma...

指標作為函式引數

當指標作為函式引數時,對引數本身的修改並不影響原來的值,比如下面的 刪除鍊錶中第乙個值為item的結點。但是結果卻不正確。void delete node head,int item 這段 的問題是,第乙個引數是指標型別而head null修改的實際上是這個指標的乙個副本,所以不會對原來的指標產生效...

指標作為函式引數

臨近畢業,還有找工作的事情,繁忙之際還是堅持看一下c語言的知識,重點的地方或者不清楚的地方還是要記錄一下。本章以指標作為函式傳參來說一下學習心得,大部分內容源自c語言程式設計課本。首先從c語言中函式引數的傳遞方向說起,大家都知道,c語言中函式引數的傳遞方向是單向的,只能由主調函式的實參傳遞到被調函式...