POINTER AND REFERENCES(указателя и ссылки)

The concept of pointer and references

Declaration of pointer(Объявление указателей)
ကြန္ပ်ဴတာ၏ memory သည္ bites(memory unit) ၿဖင့္တိုင္းတာထားေသာ တိက်ေသာ address မ်ားၿဖင့္ တည္ရွိေနေသာ အစိတ္အပိုင္းမ်ားၿဖင့္ ေပါင္းစပ္ထားၿခင္းၿဖစ္သည္။high level language မ်ားတြင္ variable မ်ားအား memory တြင္ ေနရာခ်ထားရန္အတြက္ ပူပင္စရာမလိုေပ။အဘယ္ေၾကာင့္ဆိုေသာ္ complier မွ အလိုအေလွ်ာက္ေၿဖရွင္းတြက္ခ်က္လိုက္ေသာ ေၾကာင့္ၿဖစ္သည္။သို႕ေသာ္ programming ေရးသားတြက္ခ်က္ၿပဳလုပ္ရာတြင္ variable မ်ားဆီသို႕ return ၿပန္ရာတြင္ ၎တို႕၏ address မ်ားအား အသံုးၿပဳရာတြင္ ပိုမို၍လြယ္ကူေစသည္။ထိုသို႕ ရည္ရြယ္ခ်က္ၿဖင့္ pointer အားအသံုးၿပဳၿခင္းၿဖစ္သည္။

Pointer(index) ဆိုသည္မွာ variable တစ္ခုၿဖစ္ၿပီး ၎တြင္ အၿခား variable ၏ address ပါ၀င္ေပသည္။address ဆိုသည္မွာ memory cell မွ location တစ္ခုၿဖစ္သည္ဟုနားလည္မွတ္ယူနိဳင္သည္။
အကယ္၍ variable name တစ္ခုအား အသံုးၿပဳလွ်င္ ကၽြန္ေတာ္တို႕သည္ ၎ဆီသို႕ တန္ဖိုးအား တိုက္ရိုက္ access ၿပဳလုပ္နိဳင္မည္ၿဖစ္သည္။သို႕ေသာ္ pointer အားအသံုးၿပဳလွ်င္ တိုက္ရိုက္ access ၿပဳလုပ္နိဳင္မည္မဟုတ္ေပ။
Pointer အားေၾကၿငာရန္အတြက္ *(asterisk) အား data type ၏ေနာက္တြင္ space ၿခား၍ ၿဖည့္စြက္ေရးသားရမည္ၿဖစ္သည္။


Example
int i;             / / i - integer variable;
char c;          / / c - a character type variable;
int * i Ptr;     / / Pointer to an integer variable, stored in a
                   / / Memory location; interpreted as "* i Ptr is something like int";
                   / / The same as the declaration int * i Ptr;            
char * cPtr;    / / "* cPtr expression is something like char"
အကယ္၍ pointer တစ္ခုထက္ပိုမို၍ ေၾကၿငာလိုပါက *(asterisk) အား တစ္ခုၿခင္းဆီ၏ေရွ႕တြင္ထည့္ေပးရမည္ၿဖစ္သည္။
Float *fptr1,*fptr2,*fptr3

ေအာက္ေဖာ္ၿပပါ အခ်က္သံုးခ်က္အား သတိၿပဳမိသင့္သည္။
Pointer သည္ int(သုိ႕)float တို႕ကဲ့သို႕ variable ၿဖစ္သည္။
Pointer ၏ variable type တြင္ memory ေပၚမွ ေနရာတစ္ခုသို႕ ညြန္ၿပေသာ address ပါ၀င္သည္ၿဖစ္သည္။
Memory location ေပၚတြင္ သိမ္းဆည္းထားေသာ တန္ဖိုးမ်ားသည္ pointer တြင္ တိုက္ရိုက္တည္ရွိေနေသာ data မ်ားၿဖစ္သည္။

အၿခားေသာ variable မ်ားသကဲ့သို႕ပင္ pointer သည္လည္း initialize ၿပဳလုပ္နိဳင္သည္။ အဘယ္ေၾကာင့္ဆိုေသာ္ ၎တို႕တြင္လည္း မတိက်မသတ္မွတ္ရေသးေသာ တန္ဖိုးမ်ား တည္ရွိေသာေၾကာင့္ၿဖစ္သည္။ pointer အား initialize ၿပဳလုပ္ရာတြင္ 0 တန္ဖိုးနင့္ assign(တူညီ) ၿပဳလုပ္ေပးရမည္ (သို႕) တိက်ေသာ address တစ္ခု နွင့္ assign ၿပဳလုပ္ေပးရမည္။
Pointer အား initialize မၿပဳလုပ္ပဲႏွင့္ အသံုးမၿပဳသင့္ေပ။အဘယ္ေၾကာင့္ဆိုေသာ္ debug ၿပဳလုပ္ရာတြင္ ခက္ခဲေစတက္ၿပီး တစ္ခါတစ္ရံ error ၿဖစ္ေပၚေစတက္သည္။

Dereferencing Pointer(Разыменование указателей)
Data မ်ားဆီသို႕ access ၿပဳလုပ္ရန္အတြက္ pointer အားအသံုးၿပဳရာတြင္ ထို pointer မ်ားသည္ derefercing pointer (သို႕) indirect addressing operation ဆီသို႕ တိုက္ရိုက္ခ်ိတ္ဆက္အလုပ္လုပ္ရသည္။

Example
int i;        //variable i is integer;
int *iPtr; //pointer iPtr သည္ integer value။ ယခုေရးသားရာတြင္ ၎သည္ မည္သည့္ variable
             //နွင့္မွ် initialize ၿပဳလုပ္မထားေပ။

iPtr variable အား i variable ၏တန္ဖိူးနွင့္ assign ၿပဳလုပ္နိဳင္သည္။
iPtr = &i;     //& - operan i ၏ address အား return ၿပန္ရန္တြက္ unary operaotr ၿဖစ္သည္။
                  //ယခုအခ်ိန္တြင္ iPtr သည္ i –variable အား adderessing ၿပဳလုပ္ေနၿပီၿဖစ္သည္။
variable- i နွင့္ pointer iPtr အား assign ၿပဳလုပ္ၿပီးသည့္ေနာက္တြင္ ၎တို႕၏ၾကားတြင္ variable တန္ဖိုးမ်ား ဆက္စပ္ေၿပာင္းလဲရာတြင္ variable ၏ name အားၿဖင့္တိုက္ရိုက္ ေၿပာင္းလဲနိဳင္သည္ ထို႕အတူ pointer အားၿဖင့္လည္း တစ္ဆင့္ခံေၿပာင္းလဲနိဳင္သည္။

Example.
# include <iostream>
using namespace std;
int main ()
{ int x = 1;
int * xPtr;
xPtr = & X;
x * = 2;               / / x ၏တန္ဖိုးအား နွစ္ဆၿဖစ္ေအာင္ၿပဳလုပ္ၿခင္း
* XPtr * = 2;       / / x ၏တန္ဖိုးအား နွစ္ဆၿဖစ္ေအာင္ pointer အသံုးၿပဳ၍ ၿပဳလုပ္ၿခင္း
* X Ptr = * X Prt +10;     / /* x Ptr ၏တန္ဖိုးမ်ားအား ဆက္လက္၍ 10 ေပါင္းထည့္ၿခင္း
                                    / / ေအာက္ေဖာ္ၿပပါ နည္းလည္းနွစ္လမ္းအတိုင္း output ထုတ္ၿပနိဳင္သည္။
cout <<*xPtr<<endl;    / / Through a pointer (pointer မွတစ္ဆင့္)
cout <<x<<end;          / / Directly(တိုက္ရိုက္)
return 0;
}

Initialization နွင့္ pointer type- variable ၏ dereferencing အားနားလည္ေစ၇န္ေအာက္ေဖာ္ၿပပါ ပရိုဂမ္အား ေလ့လာနိဳင္သည္။

Example.
#include <iostream>
using namespace std;
int main ()
{ char c;
char * cPtr; / / ad a pointer to a character first e mennuyu
cPtr = &c; / / initialize the pointer
for (c = 'A'; c <= 'Z'; c++)
cout << *cPtr; / / on the screen will display a liter favit
cout<<endl;
return 0;
}
Pointer သည္ သတ္မွတ္ထားေသာ data-type ၏ object ေပၚတြင္သာ refer ၿပဳလုပ္ၿခင္းသာခြင့္ၿပဳသည္။ထိုသို႕ၿဖစ္ရၿခင္းသည္ အမ်ိဳးမ်ိဳးေသာ data-type မ်ားသည္ ကြန္ပ်ဴတာ၏ memory ေပၚတြင္ memory ပမာဏ မတူညီေသာေၾကာင့္ၿဖစ္သည္။ၿခြင္းခ်က္အေနၿဖင့္ viod type –pointer သည္အသံုးၿပဳနိဳင္သည္။
Pointer သည္ သတ္မွတ္ထားေသာ data-type အားကန္႕ထားေသာေၾကာင့္ complier သည္ data-type မ်ားအား ကိုက္ညီမွု႕ရွိမရွိ စစ္ေဆးလိမ့္မည္ၿဖစ္သည္။
float *fPtr;
char c;
fPtr=&c; //compiler error
( အဘယ္ေၾကာင့္ဆိုေသာ္ float type နွင့္ char type တို႕သည္ memory ပမာဏၿခင္းမတူညီေပ)။

Null pointer and void-type pointer(Нулевые указатели и указатели на тип void)
C++ တြင္ null-pionter မ်ားရွိၾကသည္။null-pointer ဆိုသည္မွာ pointer ပင္ၿဖစ္ၿပီး ၎အားစတင္အသံုးၿပဳခ်ိန္ တြင္ memory ေပၚတြင္ မည္သည့္တန္ဖိုးမွ တည္ရွိလိမ့္မည္မဟုတ္ေပ။null-pointer ၏ တန္ဖိုးသည္ null(zero) ပင္ၿဖစ္သည္။၎သည္ မည့္သည့္ တန္ဖိုးမွ access မၿပဳလုပ္ရေသးေသာ တစ္ခုတည္းေသာ address ၿဖစ္သည္။ပံုမွန္အားၿဖင့္ header file မ်ားၿဖစ္ၾကေသာ stddef.h , stdio.h (သို႕) stdlib.h ေနရာတြင္ #define NULL 0 ဟုေၾကၿငာအသံုးၿပဳနိဳင္သည္။(၎နည္းသည္ complier အားအဆင္ေၿပေစသည္)။
မၾကာခဏအေနၿဖင့္ programming ၿပဳလုပ္ေနခ်ိန္တြင္ species test ၿပဳလုပ္ရန္အတြက္ အသံုးၿပဳေလ့ရွိသည္။
if(fPtr != NULL ) operator;
အကယ္၍ pointer သည္ NULL နွင့္သြားညီေနပါက ၎သည္ မည္သည့္တန္ဖုိးကုိမွ address မၿပဳလုပ္ထားေပ ထို႕ေၾကာင့္ fPtr=NULL (သို႕) fPtr = 0; ဟု initialize ၿပဳလုပ္ထားၿခင္းသည္ pointer အား initialize မၿပဳလုပ္ထားပဲ အသံုးၿပဳၿခင္းမွ ၿဖစ္ေပၚလာေစတက္ေသာ error မ်ားမွေရွာင္ရွားေစနိဳင္သည္။
အၿခားေသာ global variable မ်ားသကဲ့သို႕ global pointer မ်ားသည္ initialize ၿပဳလုပ္ရာတြင္ 0 နွင့္ညီေပးရသည္။
float *fPtr=NULL;

C++ language တြင္ void type – pointer ကိုလည္းေတြ႕ၿမင္နိဳင္မည္ၿဖစ္သည္။၎သည္ မတိက်ေသးေသာ data-type ဆီသို႕ indicate(ညြန္ၿပ) ၿပဳလုပ္ထားေသာ pointer ၿဖစ္သည္:
Void *SomePlace;
ထိုကဲ့သို႕ေသာ pointer မ်ားသည္ data-type မ်ားအား ကန္႕သတ္ထားၿခင္းမရွိေပ ထို႕အတူ memory တြင္ နွစ္သက္ရာေနရာဆီသို႕ address ၿပဳလုပ္နိဳင္သည္။void –pointer သည္ generic pointer ၿဖစ္ၿပီး data မ်ားအား address ၿပဳလုပ္ရန္အတြက္ အသံုးၿပဳ၍ ၎တြင္ ၎တို႕တြင္ ၾကိဳတင္သတ္မွတ္ထားေသာ type မရွိေပ။

အေၿခခံအားၿဖင့္ void–pointer အား အခ်ိဳ႕ေသာ အဓိက ကိစၥရပ္မ်ားအတြက္ အသံုးၿပဳေလ့ရွိသည္။ဥပမာ:
Addressing buffers
Filling in memory blocks
Reading martial registers
Transfer of pointer to function
အကယ္၍ pointer နွစ္ခုသည္ တူညီေသာ data-type မ်ားရွိပါက တစ္ခုနွင့္တစ္ခု assign ၿပဳလုပ္နိဳင္သည္။ၿခြင္းခ်က္အေနၿဖင့္ void-pointer သည္ မည္သည့္ data-type ကိုမဆို assign ၿပဳလုပ္နိဳင္သည္။သို႕ေသာ္ ပထမအေနၿဖင့္ viod-pointer အား assign ၿပဳလုပ္မည့္ data-type နွင့္ ဦးစြာတူညီေပးရမည္ၿဖစ္သည္။

Example.
char buffer[1024]; //1024 –byte buffer
void *bPtr;
bPtr=buffer; //bPtr pointer သည္ buffer [array] ၏ address နွင့္ assign ၿပဳလုပ္ၿခင္းၿဖစ္သည္။
အကယ္၍ ထိုကဲ့သို႕ပင္ character type variable ၿဖစ္ေသာ char c
နွင့္ define ၿပဳလုပ္လိုပါက ေအာက္ပါအတိုင္း ေရးသားနိဳင္သည္။
c=*(char *)bPtr;
(char *)bPtr ဟုေရးသားၿခင္းသည္ complier အား character-type ၿဖစ္ေသာ bPtr အတြက္ temporary တစ္ခုရွာေဖြခိုင္းၿခင္းပင္ၿဖစ္သည္။*(char *)bPtr သည္ character-type တန္ဖိုးနွင့္ bPtr – pointer တို႕၏ address တို႕အား တန္ဖိုးယူလိုက္ၿခင္းပင္ၿဖစ္သည္။
int data-type အတြက္ဆိုလွ်င္
i=*(int *)bPtr;
bPtr – pointer သည္ ေပးထားေသာ(i) တန္ဖိုးနွင့္ address ၿပဳလုပ္လိမ့္မည္ၿဖစ္သည္။

Example.
#include<iostream>
using namespace std;
void main()
{ int i;
float f;
int *iPtr;
float *fPtr;
void *vPtr;
iPtr = &i;
fPtr= &f;
vPtr= &i;
vPtr= &f;
fPtr= &i; //error;
iPtr= &f; //error
}

References(Ссылки)
Variable တစ္ခုအား reference ၿပဳလုပ္သည္ဆိုသည္မွာ pointer မ်ားအား dereference ၿပဳလုပ္ၿပီး အသံုးၿပဳေနၿခင္းပင္ ၿဖစ္သည္ဟု မွတ္ယူနိဳင္သည္။reference အတြက္ဆိုလွ်င္ memory ေပၚတြင္ ေနာက္ထပ္ memory space ထပ္မံအသံုးၿပဳရန္မလိုအပ္ေပ။၎သည္ တစ္နည္းအားၿဖင့္ variable name တစ္ခုၿဖစ္သည္ ဟု၍လည္းေၿပာဆိုနိဳင္သည္။ထိုသို႕ reference အားအသံုးၿပဳရန္အတြက္ unary-operator တစ္ခုၿဖစ္ေသာ & အားအသံုးၿပဳရမည္ၿဖစ္သည္။
Data_type  &identifier_1=identifier_2;

Example.
#include<iostream>
using namespace std;
void main()
{ int a=5,b=10;
  int &aRef=a;     //aRef သည္ a ၏ reference ၿဖစ္သည္။
 aRef=b;            //a = b
aRef++;
cout<<a<<endl;
}
Reference သည္ object အား copy အၿဖစ္ဖန္တီးၿခင္းမဟုတ္ေပ။object ၏အၿခားနာမည္တစ္ခုပင္ၿဖစ္သည္။ မ်ားေသာအားၿဖင့္ reference အား function မ်ားတြင္ parameter မ်ားအား passing ၿပဳလုပ္ရန္အသံုးၿပဳေလ့ရွိသည္။



                                                                                          translated by zmk@miet51

No comments:

Post a Comment