





Pointer คือ อะไร
Pointer คือตัวแปรที่จะทำหน้าที่ชี้ที่อยู่ในหน่วยความจำของตัวแปรอื่นๆ เราสามารถใช้ ตัวแปร Pointer เพื่อการเข้าถึงข้อมูลที่รวดเร็ว และเพื่อความยืดหยุ่นได้ Pointer จะทำ งานกับ ที่อยู่ของตัวแปรที่อยู่ในหน่วยความจำ เพราะฉะนั้นเราจึงควร ศึกษาเรื่องที่อยู่ ของหน่วยความจำใน C++ ก่อน
รูปแบบการประกาศตัวแปร pointer
type *variable-name;
ชนิดของข้อมูล *ชื่อของตัวแปร;
พอยน์เตอร์ มี 2 ประเภท คือ
1. direct pointer เป็นตัวแปรที่เก็บตำแหน่ง(address) ในหน่วยความจำ ของข้อมูล ตัวอย่าง เช่น ตัวแปรชื่อ x มีข้อมูลเป็น 120 ซึ่งถูกเก็บไว้ในหน่วยความจำที่ตำแหน่ง 5000 พอยน์เตอร์ ชื่อ ptr มีค่าที่เก็บไว้เป็น 5000 ดังรูป

2. indirect pointer เป็นตัวแปรที่เก็บตำแหน่ง (address) ของพอยน์เตอร์ซึ่งเก็บตำแหน่งของข้อมูลของตัวแปร เช่น ตัวแปรชื่อ x มีข้อมูลเป็น 120 ซึ่งถูกเก็บไว้ในหน่วยความจำที่ตำแหน่ง 5000 พอยน์เตอร์ ชื่อ ptr มีค่าที่เก็บไว้เป็น 5000 และ พอยน์เตอร์ ชื่อ pptr เก็บตำแหน่งหน่วยความจำของ ptr ซึ่งมีค่า 3000 พอยน์เตอร์ pptr นี้อาจเรียกว่า pointer to pointer ดังรูป

การนำที่อยู่ของหน่วยความจำมาใช้
เราได้ทราบมาแล้วว่า ในC++ ตัวแปรทุกตัวแปร จะมีการจองหน่วยความจำเพื่อใช้ ในการเก็บข้อมูล และตัวแปรแต่ละตัวนั้น จะมีที่อยู่ในหน่วยความจำ โดยจะเป็น หมายเลขที่คอมพิวเตอร์จัดเตรียมให้ โดยปกติถ้าหากจะยกตัวอย่าง หมายเลข ของหน่วยความจำ คนเรามักจะยกตัวอย่างบ้านเลขที่ ซึ่งทุกบ้านจะต้องมีเพื่อให้ ไปรษณีย์สามารถส่งจดหมายได้ถูก
เมื่อเราประกาศตัวแปร Compiler จะเตรียมพื้นที่ในหน่วยความจำ ให้ พร้อมทั้งหมายเลข ของหน่วยความจำ เราอาจจะเรียกที่อยู่ของหน่วยความจำที่ตัวแปรใช้ว่า “ที่อยู่ของตัวแปร” ใน C++ เราสามารถใช้ โอเปอเรเตอร์ & (address of ) มาใช้ได้ โดยการใช้ให้เราวาง โอเปอเรเตอร์ & อยู่ข้างหน้าตัวแปร
เช่น ถ้าเราต้องการแสดงผลโดยใช้ cout
int A; cout << &A; โปรแกรมจะแสดงที่อยู่ของหน่วยความจำของตัวแปร A
โอเปอเรเตอร์ & ไม่สามารถใช้กับค่าคงที่ได้เช่น cout << &5; แบบนี้โปรแกรมจะ Compile ไม่ผ่านเพราะว่าไม่มีที่อยู่ของ ค่า 5 ตัวอย่างการใช้ โอเปอเรเตอร์ &
Source code
1:#include <iostream> using namespace std; 2:int main() 3:{ 4: 5: int A; 6: int B[3]; 7: int i; 8: float J; 9: cout << "Address of A = "; 10: cout << &A; 11: cout << endl; 12: for(i=0;i<=2;i++) 13: { 14: cout << "Address of B[" << i << "] ="; 15: cout << &B[i] << endl; 16: } 17: 18: cout << "Address of i = "; 19: cout << &i; 20: 21: return 0; 22:}
Output ของแต่ละเครื่อง อาจจะได้ไม่เหมือนตัวอย่างนี้
Address of A = 0x5f9f241a Address of B[0] = 0x5f9f2414 Address of B[1] = 0x5f9f2416 Address of B[2] = 0x5f9f2418 Address of i = 0x5f9f2412
อธิบาย Source code บรรทัดที่ 10:เป็นการแสดงที่อยู่ของหน่วยความจำของตัวแปร A บรรทัดที่ 12 ถึง บรรทัดที่ 16:เป็นการวนloopแสดงที่อยู่ของหน่วยความจำของตัวแปร B ที่เป็น array บรรทัดที่ 19:เป็นการแสดงที่อยู่ของหน่วยความจำของตัวแปร i เครื่องของผู้อ่านอาจจะแสดงผลไม่ตรงตามนี้ แต่จะมีข้อสังเกตุได้ว่า ตัวแปร A และ Bที่เป็น array และตัวแปร i ที่อยู่ของตัวแปร แต่ละตัวอาจจะไม่มีความเกี่ยวข้องกันเลยก็ได้ แต่ที่อยู่ของตัวแปรที่เป็น array ในที่นี้คือ B[0],B[1],B[2] จะเรียงลำดับกันไป รวมถึงตัวแปรarray ประเภท อื่นด้วย
การประกาศตัวแปร Pointer เราสามารถประกาศตัวแปร Pointer ได้โดยที่ตัวแปร Pointer ก็จะมีประเภทของตัวแปรตามแบบตัวแปร ปกติเช่น int,float การประกาศตัวแปร Pointer จะแตกต่างจากการประกาศตัวแปรแบบปกติ ตรงที่เวลาเราประกาศต้องมีเครื่องหมาย * นำหน้าชื่อตัวแปรด้วย เช่น
int *A; มีความหมายว่าตัวแปร A เป็นตัวแปร Pointer ที่สามารถชี้ไปที่ ที่อยู่ของตัวแปรที่เป็น int ได้ โดยปกติถ้าเราจะใช้ตัวแปร Pointer เราจะนิยมตั้งชื่อเพื่อสื่อความหมาย เช่น int *Poi; การประกาศตัวแปร Pointer ในต่างประเทศจะนิยมให้เครื่องหมาย * อยู่ข้างหน้าประเภทของตัวแปร เช่น int* Poi; แต่การประกาศแบบนี้อาจทำให้ดูสับสน และเข้าใจยากก็ได้ เพราะมีโปรแกรมเมอร์ C++ หลายคนคิดว่าถ้าเขียน Source code แบบนี้ int* A,B,C; จะเป็นตัวแปร Pointer ทั้ง 3 ตัว ซึ่งความจริงแล้ว จะเป็นตัวแปร Pointer ตัวเดียวเท่านั้นคือตัวแปร A ส่วน B และ C จะเป็นตัวแปร int ธรรมดา การนำตัวแปร Pointer มาใช้ ตัวแปร ใน C++ มีไว้สำหรับเก็บข้อมูล โดยที่แต่ละตัวแปรก็จะมีประเภทตัวแปรเช่น int A; มีความหมายว่าตัวแปร A เป็นตัวแปรประเภท int และถ้าเราประกาศตัวแปร Pointer เช่น int *Poi; มีความหมายว่า ตัวแปร Poi เป็นตัวแปรประเภท Pointer ที่สามารถชี้ไปที่ที่อยู่ของตัวแปรประเภท int ได้ วิธีการกำหนดให้ตัวแปร Pointer ชี้ไปที่อยู่ของตัวแปรอื่น สามารถทำได้โดยการกำหนดที่อยู่ของตัวแปรนั้นให้กับ Pointer เช่น ตัวแปร A มีที่อยู่คือ 0x5f9f241a ก็ให้เราเขียน Source code แบบนี้ int *Poi; Poi = 0x5f9f241a; แบบนี้จะเป็นการกำหนดที่อยู่ของตัวแปร A ให้ Poi เท่านี้ Poi ก็จะชี้ไปที่ที่อยู่ของตัวแปร A แต่ในความเป็นจริงแล้ว เราจะรู้ที่อยู่ของตัวแปร A ได้เราก็ต้องใช้ โอเปอเรอเตอร์ & เพราะฉะนั้นเวลากำหนดให้ตัวแปร Pointer ชี้ไปที่ที่อยู่ของตัวแปรอื่น เราจึงต้องเขียน Source code แบบนี้ Poi = &A; แบบนี้จะมีความหมายว่าให้ตัวแปร Poi ชี้ไปที่ที่อยู่ของตัวแปร A เหมือนแบบก่อนหน้านี้
การเข้าถึงค่าของตัวแปรที่ Pointer ชี้อยู่ เมื่อเรากำหนดให้ Pointer ชี้ไปที่ที่อยู่ของตัวแปรแล้วเราสามารถนำค่าของตัวแปรนั้นมาใช้ได้โดยให้เราใช้ตัวแปร Pointer แทน และต้องมีเครื่องหมาย * นำหน้าด้วย เช่น
Poi = &A; cout << *Poi; จะมีความหมายเหมือนกับ cout << A; นอกจากการแสดงผล แล้วเราสามารถนำค่าที่ Pointer ชี้อยู่มาใช้กับ โอเปอเรเตอร์เลขคณิตได้เหมือนที่ตัวแปร ทั่วไปใช้กัน
สรุปรูปแบบการใช้ Pointer 1.ตอนประกาศเหมือนตัวแปรปกติ แต่ต้องมีเครื่องหมาย * นำหน้าชื่อตัวแปร เช่น int *Poi;
2.ตอนกำหนดให้ชี้ที่ตัวแปรอื่นไม่ต้องมีเครื่องหมาย * นำหน้า แต่ตัวแปรที่จะให้ Pointer ชี้ต้องมี โอเปอเรอเตอร์ & นำหน้า เช่น Poi = &A;
3.ตอนนำค่าของตัวแปรที่ Pointer ชี้อยู่ ต้องมีเครื่องหมาย * นำหน้าเช่น cout << *Poi;
ตัวอย่างการใช้ Pointer
1:#include"iostream.h" 2:int main() 3:{ 4: int Num1,Num2,Result; 5: int *Poi1,*Poi2,*PoiResult; 6: cout << "Please enter Num1:"; 7: cin >> Num1; 8: cout << "Please enter Num2:"; 9: cin >> Num2; 10: 11: Poi1 = &Num1; 12: Poi2 = &Num2; 13: PoiResult = &Result; 14: 15: *PoiResult = *Poi1 + *Poi2; 16: cout << "Num1 + Num2 = " << *PoiResult; 17: 18: return 0; 19:}
Output
Please enter Num1:50 Please enter Num2:30 Num1 + Num2 = 80
อธิบาย Source code โปรแกรมนี้เป็นโปรแกรมที่จะทำการรับตัวเลข 2 ตัวและหลังจากนั้นจะนำตัวเลขทั้ง 2 ตัวนั้นบวกกันและเก็บไว้ในตัวแปรตัว หนึ่งและก็แสดงผลออกมา โดยโปรแกรมนี้เราจะใช้ Pointer เพื่อที่จะใช้ในการกำหนดค่า บรรทัดที่ 4:เราได้ประกาศตัวแปร 3 ตัวที่จะใช้ในโปรแกรมของเราคือ Num1,Num2,Result โดยที่ 2 ตัวแรกนั้นเอาไว้ใช้ เก็บจำนวน 2 จำนวน และตัวที่ 3 จะเอาไว้ใช้เก็บผลรวมของ 2 จำนวนนั้น บรรทัดที่ 5:เราได้ประกาศตัวแปร Pointer 3 ตัวโดยทั้ง 3 ตัวนั้นเราจะเอาไว้ใช้ชี้ไปยังที่อยู่ของตัวแปร ในบรรทัดที่ 4 ตามลำดับ บรรทัดที่ 11 ถึง บรรทัดที่ 13:เป็นการกำหนดให้ Pointer ทั้ง 3 ตัวชี้ไปที่ที่อยู่ของตัวแปร ทั้ง 3 ตัว บรรทัดที่ 15: *PoiResult = *Poi1 + *Poi2; จะมีการทำงานเหมือนกับ
Result = Num1 + Num2; เพราะว่า *PoiResult ชี้ไปที่ตัวแปร Result *Poi1 ชี้ไปที่ตัวแปร Num1 *Poi2 ชี้ไปที่ตัวแปร Num2 บรรทัดที่ 16:เป็นการแสดงค่าของตัวแปร ที่ PoiResult ชี้อยู่ซึ่งก็คือการแสดงค่าของตัวแปร Result
Pointer กับ array เมื่อเราประกาศตัวแปร array สมาชิกแต่ละตัวของตัวแปร array จะมีที่อยู่ที่เรียงลำดับกัน และถ้าเราใช้ โอเปอเรอเตอร์ ++ หรือ – กับ Pointer ที่ชี้ไปที่ array จะเป็นการเปลี่ยนการชี้ของ Pointer ให้ชี้เพิ่มหรือลด ไปอีก 1 index
ตัวอย่างการใช้ Pointer กับ array
Source code 1:#include <iostream> 2:int main() 3:{ 4: int *Poi; 5: int Arrayint[5]; 6: int i; 7: for(i=0;i<=4;i++) 8: { 9: cout << "Please enter Number " << i+1 << ":"; 10: cin >> Arrayint[i]; 11: 12: } 13: Poi = &Arrayint[0]; 14: cout << endl; 15: for(i=0;i<=4;i++) 16: { 17: cout << *Poi; 18: Poi++; 19: } 20: 21: return 0; 22:}
Output
Please enter Number 1:1 Please enter Number 2:2 Please enter Number 3:3 Please enter Number 4:4 Please enter Number 5:5
12345
อธิบาย Source code
บรรทัดที่ 4:เป็นการประกาศตัวแปร ชื่อ Poi เป็นตัวแปร Pointer ที่สามารถชี้ไปที่ตัวแปรประเภท int โดยตัวแปรนี้เราจะใช้กับ array ที่ประกาศในบรรทัดที่ 5
บรรทัดที่ 7 ถึง บรรทัดที่ 12:เป็นการวน loop เพื่อรับข้อมูลจากผู้ใช้ ใส่ในตัวแปร array
บรรทัดที่ 13:เป็นการกำหนดให้ Pointer Poi ชี้ไปที่ที่อยู่ของตัวแปร Arrayint[0]
บรรทัดที่ 15 ถึง บรรทัดที่ 19:เป็นการวน loop โดยใช้ตัวแปร i ในการวน loop ซึ่งจะมีการวน loop 5 รอบ โดยที่ Statement ที่อยู่ใน loop เราไม่ได้เอาตัวแปร i มาใช้เลย Statement ที่อยู่ใน loop จะมีการทำงานคือ ในบรรทัดที่ 17 ให้มีการแสดงค่าที่ตัวแปร Poi ชี้อยู่ ถ้าหากตัวแปร Poi ชี้ที่ Arrayint[0] ก็จะเป็นการแสดงค่าของตัวแปร Arrayint[0] และในบรรทัดที่ 18 เราได้มีการสั่งให้ตัวแปร Poi เลื่อนตำแหน่งที่ชี้ไปอีก 1 ตำแหน่ง เนื่องจากว่าตัวแปร array จะมีการจองเนื้อที่ในหน่วยความจำเรียงกัน ก็เท่ากับว่าเราสั่งให้ตัวแปร Poi ชี้ไปที่ตัวแปร Arrayint index ต่อไป ต่อจากที่ชี้อยู่ ถ้าชี้ที่ index ที่ 0 ก็จะเลื่อนไปชี้ที่ index ที่หนึ่ง และก็ทำต่อไปเรื่อยๆ จนถึงอินเด็กซ์ที่ 4
ใบงานที่ 1 เรื่อง pointer

บอกผลลัพท์ที่จะได้บนจอภาพ
1. บรรทัดที่ 9 ค่าของ a ..............................
2. บรรทัดที่ 11 ค่าของ pu ..............................
3. บรรทัดที่ 13 ค่าของ pu ..............................
4. บรรทัดที่ 14 ค่าของ a ..............................
5. บรรทัดใดเป็นการประกาศตัวแปร pointer.....................
ใบงานที่ 2 เรื่อง pointer

บอกผลลัพท์ที่จะได้บนจอภาพ
1. บรรทัดใดเป็นการประกาศตัวแปร pointer.....................
2. บรรทัดที่ 6 ค่าของ js ..............................
3. บรรทัดที่ 8 ค่าของ num ..............................
4. บรรทัดที่ 10 ค่าของ js ..............................
5. บรรทัดที่ 11 ค่าของ num ..............................
6. บรรทัดที่ 13 ค่าของ js ..............................
7. บรรทัดที่ 14 ค่าของ num ..............................
8. บรรทัดใดทำหน้าที่ชี้ที่อยู่ของตัวแปรอื่น.............................
9. บรรทัดใดทำหน้าที่เปลี่ยนค่าตัวแปรที่ชี้.............................
10. ที่อยู่ของตัวแปรแสดงเป็นข้อมูลชนิดใด.............................
work on smart phone...
http://1drv.ms/1wAYLZa
<img src='http://chart.apis.google.com/chart?chs=200x200&cht=qr&chld=L|0&chl=http%253A%252F%252F1drv.ms%252F1wAYLZa' border='0'/>
Example
int *b;
int a=5;
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl <<endl;
b=&a;
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl <<endl;
*b=0;
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl <<endl;
|