傳遞動態記憶體:
下面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 裡我認為哪一本書都沒有完全說清楚,也是涉及概念細節最多,語言中最難的技術之一的動態記憶體的傳遞.並且在軟體開發中很多專業...