Pass by Value, Reference and Pointer in C++

Min Thu Kyaw
3 min readDec 10, 2023

--

Pass by value ထိ ကျောင်းသားတော်တော်များများလိုက်မီလေ့ရှိကြပြီး reference နဲ့ pointer မှာ အနည်းငယ်မျက်စိလည်သွားတတ်ကြပါတယ်။ ကျွန်တော်လည်း အခုထိ လည်နေတုန်းပါပဲ။ ဒါကြောင့် လိုက်ဖတ်ကြည့်ရင်း လေ့လာထားတာလေးမမေ့သွားရအောင် စာရေးကြည့်ရင်း ပြန် sharing လုပ်ပေးလိုက်ရပါတယ်။

Pass by Value

ဒီကောင်ကတော့ ရှင်းပါတယ်။

#include<iostream>
using namespace std;

void changeVal(int fooVal) {
fooVal++;
cout << "Value from changeVal function : "<< fooVal << endl;
}

int main() {
int foo = 10;
changeVal(foo);
return 0;
}

ဒီ c++ program ကို run ကြည့်မယ်ဆိုရင် Value from changeVal function : 11 ဆိုပြီးထွက်လာတာတွေ့ရပါမယ်။

Program ကို Trace လုပ်ကြည့်ရအောင်

void changeVal(int fooVal) {
fooVal++;
cout << "Value from changeVal function : "<< fooVal << endl;
}

program အစမှာ changeVal() function တစ်ခုကို declare လုပ်ပြီး function ထဲမှာ လုပ်ဆောင်မယ့်program တွေတစ်ခါတည်းထည့်သွင်းပေးထားပါတယ်။ ရလာတဲ့ value ကို 1 တိုးပြီး cout ထုတ်ပြတဲ့ program တစ်ကြောင်းပါပဲ။

int foo = 10;
changeVal(foo); // argument "foo" pass to changeValue function

main function ထဲကို တစ်ချက်ကြည့်ကြည့်ရင် foo ဆိုတဲ့ integer variable တစ်ခုကို declare လုပ်ပြီး value 10 assign ပေးထားပါတယ်။ ပြီးတာနဲ့ changeVal() function ကို invoke လုပ်ပြီး (invoke လုပ်တယ်ဆိုတာ function call ခေါ်တာပါပဲ) အပေါ်မှာ declare လုပ်ထားတဲ့ foo value ကို argument အနေနဲ့ pass လုပ်ပေးလိုက်ပါတယ်။ ဒီမှာ ထည့်ပေးလိုက်တာက foo ရဲ့ value ဖြစ်တဲ့ 10 ကိုပဲထည့်ပေးလိုက်ခြင်းပါ။

void changeVal(int fooVal) {
fooVal++;
cout << "Value from changeVal function : "<< fooVal << endl;
}

main function ကနေပေးလိုက်တဲ့ argument value 10 ကို changeVal() function ကနေ fooVal ဆိုတဲ့ parameter ကနေလှမ်းယူလိုက်ပါတယ်။ ဒီတော့ program run လိုက်ရင် ထွက်လာတာက

Value from changeVal function : 11

ဆိုပြီးထွက်လာတာ တွေ့ရမှာပါ။

main function ထဲက code ကို နည်းနည်းပြင်ကြည့်ရအောင်

#include<iostream>
using namespace std;

void changeVal(int fooVal) {
fooVal++;
cout << "Value from changeVal function : "<< fooVal << endl;
}

int main() {
int foo = 10;
changeVal(foo);
cout << "Value from main function : " << foo; // new added line
return 0;
}

ဒီမှာ ကျွန်တော်တို့ main function ထဲ foo ကို ပြန်ထုတ်ကြည့်ပါမယ်။

Value from changeVal function : 11
Value from main function : 10

main function ထဲကနေ changeVal() function ကို ခေါ်ပြီး 1 တိုးလိုက်ပေမယ့် main function ထဲမှာ ထုတ်ကြည့်တဲ့ အခါ 10 ​ဖြစ်နေသေးတာတွေ့ရပါမယ်။ ဒါ pass by value မို့လို့ပါ။ changeVal() function ကနေ 10 ဆိုတဲ့ integer value ပဲ​လက်ခံထားလို့ပါ။

Pass by Reference

pass by reference မှာ code ကို နည်းနည်း ပြောင်းကြပါမယ်

#include<iostream>
using namespace std;

void changeVal(int &fooVal) { // int fooVal -> int &fooVal
fooVal++;
cout << "Value from changeVal function : "<<fooVal << endl;
}

int main() {
int foo = 10;
changeVal(foo);
cout << "Vale from main function : " << foo;
return 0;
}

ဒီနေရာ မှာ main funtion ကနေပေးလိုက်တာကို changeVal() function ကနေ လက်ခံတာဟာ value မဟုတ်တော့ဘဲ &fooVal ဆိုပြီး fooVal ရဲ့ reference ကိုလက်ခံထားတာ တွေ့ရပါလိမ့်မယ်။

void changeVal(int &fooVal) { // int fooVal -> int &fooVal
cout << &fooVal; // 0x7ff7b5cf3428
fooVal++;
cout << "Value from changeVal function : "<<fooVal << endl;
}

fooVal ကို ထုတ်ကြည့်တဲ့အခါ အထက်ပါအတိုင်း ထွက်လာတာကို တွေ့ရပါလိမ့်မယ်။​ value ကို ထုတ်ပြခြင်းမဟုတ်ဘဲ & ကို အသုံးပြုပြီး reference ကို ထုတ်ပြခြင်းပါ။

program ကို run ကြည့်မယ်ဆိုရင်တော့ pass by value လိုမဟုတ်တော့ဘဲ

Value from changeVal function : 11
Value from main function : 11

value from main function ကလည်း 11 ဖြစ်နေတာ တွေ့ရပါလိမ့်မယ်။ changeVal() မှာ ပြောင်းလိုက်တာ က value သက်သက်မဟုတ်ဘဲ​ reference တစ်ခု ဖြစ်တဲ့အတွက် main function မှာ ရှိတဲ့ foo ဆိုတဲ့ variable တန်ဖိုးကလည်း 11 ဖြစ်နေတာ တွေ့ရပါမယ်။

ပိုသေချာချင်ရင် ဒီလိုလေးထုတ်ကြည့်ပါ။

#include<iostream>
using namespace std;

void changeVal(int &fooVal) {
cout << &fooVal; // 0x7ff7b7b3e428
fooVal++;
cout << "Value from changeVal function : "<<fooVal << endl;
}

int main() {
int foo = 10;
cout << &foo; // 0x7ff7b7b3e428
changeVal(foo);
cout << "Vale from main function : " << foo;
return 0;
}

reference ချင်းတူနေတာ တွေ့ရပါမ​ယ်။ ဒါကြောင့် changeVal() function ထဲက ပြောင်းတာ နဲ့ main function မှာ ပါ လာပြောင်းခြင်းဖြစ်ပါတယ်။

ဒီလောက်ဆို နားလည်လိမ့်မယ်ထင်ပါတယ်။

နောက် pointer အကြောင်းဆက်ပါဦးမယ်။

--

--

Responses (1)