2018年6月14日 星期四

The difference between Call by value,Call by address and Call by reference - 參考MLab

Call by value
  • copy main主程式 的變數給 一個獨立行使程式的 void函數 (他被分配到兩個記憶體位址,所以做交換時,會有自己交換,而主程式未交換的情形)
void swap (int c , int d){
   int temp=c;
   c=d;
   d=temp;
}
int main(){
  int a=5,b=10;
  swap(a,b);
  printf(" %d %d ", a,b);
}


main的amain的bswap的cswap的d
儲存值510……510
記憶體位址0x040x08……0x160x20

當副程式的程式執行完之後記憶體會變如下:
main的amain的bswap的cswap的d
儲存值510……105
記憶體位址0x040x08……0x160x20

Call by address

  • 綁定位址,對指定位址的值做交換
void swap (int *c , int *d){
   int temp=*c;
   *c=*d;
   *d=temp; "做deference,對指定位址的值做交換"
}
int main(){
   int a=5,b=10;
   swap(&a,&b);
   printf(" %d %d ", a,b);
}


main的amain的bswap的*cswap的*d
儲存值510……0x040x08
記憶體位址0x040x08……0x160x20
所以副程式執行完交換後記憶體如下表示:
main的amain的bswap的*cswap的*d
儲存值105……0x040x08
記憶體位址0x040x08……0x160x20

Call by reference (C++有,C沒有)

  • void函數參考 main函數的一切(記憶體以及數值)
  • The formula of reference: int &c=a; (a為一左值),因此c擁有和a相同的一切,c可以獨立活動
void swap (int &c , int &d){
   int temp=c;
   c=d;
   d=temp;
}
int main(){
   int a=5,b=10;
   swap(a,b);
   printf(" %d %d ", a,b);
   return 0;
}


這樣就會是用傳參考的方式來接收主程式a跟b的值,此時記憶體如下所示:
main的amain的bswap的&cswap的&d
儲存值510……510
記憶體位址0x040x08……0x040x08

沒有留言:

張貼留言

Ethereum- Learn Solidity step by step

Common Function Types: public: Anyone can call this function,but it isn't really used for any type of security per se. priv...