頁:
[1]
C++三種演算法的問題@@搞不清楚差在哪..
用call by address , reference,value三種方法演算~~輸兩數字a.b;a=b,把a和b對調,是看看函數變,主程式是否改變例子:
1.void fun(int i){i=i+1;}
2.(int&i){i=i+1;}
3.(int&i){*i=*i+1;} 且要分割檔案
以下 是小的我~~的算法..但是@@我不懂什麼的是用那三種方式有什麼不一樣嗎?
#include "stdafx.h"
#include<iostream>
using namespace std;
void data(int *a,int b,int &c)
{
*a=*a+1; c=c+3; cout<<a<<&a<<endl;
}
int main(int argc,char*argv[]){
int a=8,b=9,c=2; data (&a,c,b);
cout<<&a<<endl; return 0;
} 就是傳給函數的東西不一樣阿
call by value是把值複製一份傳給函數
所以在函數裡改變在主程式裡不會變
call by point是把這個變數的記憶體位置傳給函數
所以在函數裡改變這個記憶體的值在主程式也會改變
call by reference是傳參照
參照是什麼
基本上你可以把它想像成一個遙控器
你可以在遠處使用它
也會對原本的記憶體產生作用
所以傳參照在函數裡改變
在主程式裡也會改變 [i=s] 本帖最後由 tsukai 於 2009-5-6 12:16 PM 編輯 [/i]
call by value就是你傳值進去時,它會複製一份,比如說你手上有個單機遊戲存檔,你複製了一份給你的朋友,你朋友在他電腦上玩了之後把存檔覆蓋掉,但這並不會影響你電腦中的存檔。
call by reference就是幫你傳進去的變數取一個暱稱,比如說你有個朋友王小明,他暱稱叫大頭,某天王小明被車撞了,就代表大頭也被車撞了,因為大頭就是王小明,他們是同一個人。
call by address就是你傳地址進去,比如說,你知道王小明的msn是[email=HitByCar@iamflying.com]HitByCar@iamflying.com[/email],所以你可以在msn上跟他對話,現在你有另一個朋友想認識王小明,你就把王小明的msn帳號丟給他,那麼他就可以透過msn跟王小明對話了。
以上如果看不是很懂,請看以下:
你在函式外有個變數,記憶體位址假設是1(把它想成1號保險箱),它在這塊記憶體中存了個數字,假設是10(把它想成一張上面寫了10的紙條放在1號保險箱中),那麼call by value時,函式會向記憶體要求一個新的變數,記憶體位址假設是2(把它想成2號保險箱),然後把1號保險箱中的10複製過來(想成將紙條拿去影印,把影印出來的新紙放到2號保險箱中),現在不管你把2號保險箱中的紙條怎麼亂塗亂改,1號保險箱中的紙條是不受影響的。
你在函式外有個變數A(想成是王小明),記憶體位址假設是1(王小明是1號保險箱使用者),你把它call by reference傳給函式,那麼函式就會有個變數B(想成是王小明的老婆),記憶體位址一樣是1(他老婆一樣可以使用1號保險箱),那麼現在王小明的老婆在1號保險箱中那張紙條上畫了個愛心,等王小明也來開保險箱時就會看到那個愛心。王小明(函式外的變數A)跟他老婆(函式內的變數B)現在是共用了一個保險箱(記憶體位址),任何一方去對此保險箱(位址)中的紙條(值)做改變,另一方都會看到。
你在函式外有個變數A(王小明),它的記憶體位址假設是1(1號保險箱),它裡面存了個值是5,因為A是指標,所以5是代表某個記憶體位址(可以想成1號保險箱中存放的是5號保險箱的鑰匙),你用*A就可以去存取記憶體位址5的值(拿鑰匙來用就可以打開5號保險箱對其中的物品做處理)。你現在把它call by address傳入函式,函式會向記憶體要求一個新變數B(王小明的哥哥:王大明),它的記憶體位址假設是2(2號保險箱),它會把變數A中的值複製過來(王大明找王小明把鑰匙借來,拿去找鎖匙行打了一份備用的),現在你2號保險箱中就會也有一份5號保險箱的鑰匙,只要使用*B就可以存取記憶體位址5的值(王大明也可以拿他的備份鑰匙去打開5號保險箱了),那麼,王大明使用*B在5號保險箱的紙條上寫說「請你不要再被車撞了」,等王小明使用*A時就會看到5號保險箱中的留言。而如果王大明把2號保險箱中的鑰匙給換掉,換成6號保險箱的鑰匙時(把B的值改成6),王小明不會知道,也不會受影響,只是王大明以後拿2號保險箱中的鑰匙只能打開6號保險箱罷了,5號就變成王小明專用的了,哪天要是王小明也把1號保險箱中的鑰匙給丟了(把A的值改掉),那麼5號保險箱就再也沒人可以打開了(在某些情況下,這就是造成記憶體漏洞memory leak的原因)。
上面如果還是看不懂…那我就不行了Orz 簡單來說
call by value : 傳值不傳址,也就是不論你如何改變這個值也不影響原來的變數(不同位址)
call by address : 傳址,也就是你的任何改變是對這個address裡面存的數值做變動,所以會影響原來的變數(因為都指向同一個address),而裡面的指標變數可以指向其他位址
call by reference : 同call by address,唯一差異在於這種方式傳入的指標變數不可再次指向其他address,但是call by address可以 三種其實是一樣的東西
只是在傳入的參數不一樣
Call by value: Copy傳入參數的值,Function結束Pop Stack就Free掉了,就好像你把作業影印一份給小明,就算他在上面寫林老師XX你原版的作業也不會改變。
Call by address:傳入參數是一個記憶體位置,改變記憶體位置內的值就等於改變了你原來的變數的值,就好像你跟小明說你的作業放在你抽屜自己拿,結果小明在你作業上面寫林老師XX,林老師就真的給你XX了
Call by reference:其實跟Call by address一樣,只是這次你直接把作業交給小明只是騙她說作業不是你的,他在上面寫林老師XX你交作業的時候林老師還是滿臉XX 基本上call by address和call by reference不是相同嗎??只是call by value因為它是屬於區段消除,所以他的值不管中間給他什麼條件都與初值同
頁:
[1]