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