傳遞動態記憶體

2021-07-10 14:25:19 字數 1238 閱讀 7988

傳遞動態記憶體:

下面5個幻術哪乙個能夠成功進行兩個數的交換?

#include   using   namespace   std; 

void swap1(int p, int q)

void swap2(int *p, int *q)

void swap3(int *p, int *q)

void swap4(int *p, int *q)

void swap5(int &p,int &q)

int main(){

int a=1,b=2;

//swap1(a,b);

//swap2(&a,&b);

//swap3(&a,&b);

//swap4(&a,&b);

//swap5(a,b);

cout <

swap1傳的是值的副本,在函式體內被修改了形參p、q(實際引數a、b的乙個拷貝),p、q的值的確交換了,但是它們是區域性變數,不會影響到主函式中的a和b。當函式swap1生命週期結束時,p,q所在棧也就被刪除了。

swap2傳的是乙個位址進去,在函式體內的形參*p、*q是指向實際引數a、b位址的兩個指標。但是這裡注意:

int *temp;

*temp = *p;

以上語句是不符合邏輯的一段**,int *temp新建乙個指標(但沒有分配記憶體)。*temp = *p不是指向而是拷貝。把*p所指向的記憶體裡的值(也就是實參a的值)拷貝到*temp所指向記憶體裡了。但是int *temp不是不分配記憶體嗎?的確不分配,於是系統在拷貝時臨時給了乙個隨機位址,讓它存值。分配的隨機位址是個「意外」,且函式結束後不收回,造成記憶體洩露。

swap3傳的是乙個位址進去,在函式體內的形參*p、*q是指向實際引數a、b位址的兩個指標。這裡需要注意的是(itnt *temp; temp = p;)  int *temp新建乙個指標(但沒有分配記憶體)。temp = p是指向而不是拷貝。temp指向了*p所指向的位址(也就是a)。而**

p=q;

q=temp;

意思就是p指向了*q所指向的位址(也就是b)。q指向了*t所指向的位址(也就是a)。但是函式swap3不能實現兩個數的交換,這是因為函式體內只是指標的變化,而對位址中的值沒有改變。

函式swap4可以實現兩數的交換,因為它修改的是指標所指向位址中的值。

函式swap5函式與swap4類似,是乙個引用傳遞,修改的結果直接影響實參。

傳遞動態記憶體

當你涉及到c c 的核心程式設計的時候,你會無止境地與記憶體管理打交道.這些往往會使人受盡折磨.所以如果你想深入c c 程式設計,你必須靜下心來,好好苦一番.現在我們將討論c c 裡我認為哪一本書都沒有完全說清楚,也是涉及概念細節最多,語言中最難的技術之一的動態記憶體的傳遞.並且在軟體開發中很多專業...

傳遞動態記憶體

當你涉及到c c 的核心程式設計的時候,你會無止境地與記憶體管理打交道。這些往往會使人受盡折磨,所以如果你想深入c c 程式設計,你必須靜下心來好好苦一番。現在我們將討論c c 裡我認為哪一本書都沒有完全說清楚,也是涉及概念細節最多,語言中最難的技術之一的動態記憶體的傳遞。並且在軟體開發中很多專業人...

傳遞動態記憶體

當你涉及到c c 的核心程式設計的時候,你會無止境地與記憶體管理打交道.這些往往會使人受盡折磨.所以如果你想深入c c 程式設計,你必須靜下心來,好好苦一番.現在我們將討論c c 裡我認為哪一本書都沒有完全說清楚,也是涉及概念細節最多,語言中最難的技術之一的動態記憶體的傳遞.並且在軟體開發中很多專業...