แบบทดสอบ Online

สถิติผู้เข้าชม

562271
TodayToday88
YesterdayYesterday366
This WeekThis Week2041
This MonthThis Month5458
All DaysAll Days562271

ROBOT TEAM


warayuphat panumphan 'Kru Pu', Powered by Joomla!
pointer PDF Print E-mail
Written by Administrator   
Monday, 29 October 2012 03:40

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;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 




Last Updated on Tuesday, 17 January 2017 02:14
 

Poll กรุณาตอบคำถามค่ะ

คุณเขียนโปรแกรมบ่อยแค่ไหน
 

Poll สื่อการสอน

สื่อแบบไหน ที่คุณชอบ
 

จำนวนผู้ชมที่ online ขณะนี้

We have 17 guests online

analogclock

search engine

Banner
Banner
Banner
Banner
Banner
Banner
Banner
Banner
Banner
Banner
Banner