250 likes | 488 Views
พอยน์เตอร์ ( Pointer). พอยน์เตอร์ หรือ ตัวชี้ - เป็นชนิดข้อมูลชนิดหนึ่งของภาษา C (int, float, char) - ตัวแปรชนิดตัวชี้ มีความเร็วในการทำงานสูง - ตัวแปรชนิดตัวชี้ช่วยประหยัดเนื้อที่ในหน่วยความ จำหลักขณะประมวลผล เมื่อเทียบกับ Array
E N D
พอยน์เตอร์ หรือตัวชี้ -เป็นชนิดข้อมูลชนิดหนึ่งของภาษา C(int, float, char) -ตัวแปรชนิดตัวชี้มีความเร็วในการทำงานสูง -ตัวแปรชนิดตัวชี้ช่วยประหยัดเนื้อที่ในหน่วยความ จำหลักขณะประมวลผลเมื่อเทียบกับ Array -ใช้ตัวชี้ร่วมกับฟังก์ชันเพื่อเพิ่มประสิทธิภาพการเขียน โปรแกรม
5.1 พอยน์เตอร์ กับแอดเดรส(Pointers and Addresses) ตัวแปร คือชื่อที่ใช้แทนข้อมูล การประกาศตัวแปรเป็นการกำหนดชื่อเพื่อใช้แทนข้อมูล เมื่อประกาศตัวแปร จะมีการจองเนื้อที่ในหน่วยความจำเพื่อเก็บข้อมูล เราสามารถเข้าถึงข้อมูลได้โดยอ้างถึงตัวแปร การประกาศตัวแปร เช่น int i; เป็นการประกาศ (Declaration) ตัวแปรชื่อ i เป็นตัวแปรชนิด int(integer)
int i; i 400 402 404 i = 10; 10 แอดเดรส (Address) ภาพจำลองการแทนข้อมูลในหน่วยความจำแบบปกติ แอดเดรส คือ ตำแหน่งที่เก็บข้อมูลในหน่วยความจำ เสมือนบ้านเลขที่เพื่อ ใช้ในการอ้างถึงสำหรับนำข้อมูลไปเก็บ หรือนำออกมาใช้งาน
วิธีการใช้ตัวชี้หรือพอยน์เตอร์เป็นอีกวิธีที่จะเข้าถึงตัวแปรปกติได้ ตัวแปรชนิดพอยน์เตอร์จะเก็บค่าที่อยู่ของหน่วยความจำหลัก ซึ่งต่างกับตัวแปรปกติที่เก็บค่าที่แท้จริงของข้อมูล นั่นคือการใช้ตัวแปรชนิดพอยน์เตอร์จะเป็นการเข้าถึงข้อมูลหรือเป็นการอ้างถึงตำแหน่งที่เก็บข้อมูล พอยน์เตอร์ เป็นชนิดข้อมูลชนิดหนึ่งของภาษาซี แตกต่างจากชนิดข้อมูลพื้นฐานอื่น ๆ ตัวแปรพอยน์เตอร์เป็นตัวแปรที่ใช้เก็บค่า address ของตัวแปรอื่น ๆ
p p i 360 400 400 10 i 10 10 แอดเดรส (Address) p เก็บค่าแอดเดรสของ ตัวแปร i ถ้ามีตัวแปร i เป็นตัวแปรชนิด int และมีตัวแปร p เป็นตัวแปร ชนิดพอยน์เตอร์ p เก็บค่าแอดเดรสของตัวแปร i (หรือ p ชี้ไปที่ตัวแปร i) สามารถจำลองการแทนข้อมูลในหน่วยความจำ ดังรูป
5.2 การประกาศตัวแปรชนิดตัวชี้หรือพอยน์เตอร์ ใช้การดำเนินการชนิดเอกภาค (unary operator* ) รูปแบบการประกาศตัวแปรชนิดพอยน์เตอร์ ชนิดข้อมูล *ชื่อตัวแปร ; เช่น int *point ; /* ดอกจันทร์ ติดกับชื่อตัวแปร*/ เป็นการประกาศตัวแปรชื่อ point ว่าเป็นตัวแปรชนิดพอยน์เตอร์ ที่ทำหน้าที่เก็บตำแหน่ง หรือ address ในหน่วยความจำที่มีข้อมูล ชนิดเลขจำนวนเต็ม เครื่องหมาย *(ดอกจันทร์) เป็นตัวบอกว่าตัวแปร point เป็นตัวแปรชนิดตัวชี้หรือพอยน์เตอร์
ประกาศตัวแปร prt ให้เป็นตัวแปรตัวชี้ หรือตัวแปรพอยน์เตอร์ที่ชี้ไปยังตัวแปรชนิด char ประกาศตัวแปร ip และ ตัวแปร temp เป็นตัวแปรตัวชี้ที่ชี้ไปยังตัวแปรชนิด int ตัวแปรพอยน์เตอร์ทำหน้าที่เก็บ address นั่นคือทำหน้าที่ชี้ไปยังตัวแปรตัวอื่น ดังนั้นการประกาศตัวแปรพอยน์เตอร์ ต้องสอดคล้องกับชนิดของตัวแปรตัวอื่น ที่ต้องการให้ตัวแปรพอยน์เตอร์นั้นจะชี้ไป เช่น char *prt; int *ip , *temp; double *dp; ประกาศตัวแปร dp เป็นตัวแปรตัวชี้ ที่ชี้ไปยังตัวแปรชนิด double
5.3 การดำเนินการสำหรับตัวชี้: มี 2 ตัว 5.3.1ตัวดำเนินการอ้างถึงที่อยู่ (address operator)ใช้เครื่องหมาย&นำ หน้าตัวแปร ซึ่งหมายถึงตำแหน่งที่อยู่ของตัวแปรนั้น ในหน่วยความจำ ตัวอย่าง #include <stdio.h> void main ( ) { int z= 10; int *ZPtr; ZPtr = &z; /* ตัวแปรชนิดตัวชี้เก็บ เลขที่อยู่ของตัวแปร z */ }
ให้ตัวแปรพอยน์เตอร์ z ชี้ไปยังแอดเดรสของตัวแปร y โดยการให้ z เก็บตำแหน่งแอดเดรสของ y นั้นเอง 5.3.2 ตัวดำเนินการ อ้างถึง (dereferencing operator)ใช้เครื่องหมาย * นำหน้าตัวแปรชนิดตัวชี้ จะเป็นการอ้างถึงค่าข้อมูลที่ตัวแปรชนิดตัวชี้นั้น ชี้ไป ซึ่งค่าข้อมูลนี้สามารถเปลี่ยนแปลงค่าได้ ตัวอย่าง #include <stdio.h> void main ( ) { int x; int y=20; int *z; z = &y; x = *z; /* เป็นการอ้างถึงค่าข้อมูลที่ตัวแปรชนิดตัวชี้ */ printf (“%d”, x) /* ได้ผลลัพธ์คือ 20 */ }
int count , val ,*ptr; count =100; /*การใช้ตัวแปรปกติ*/ ptr = &count; /*การให้ address ตัวแปร count แก่พอยน์เตอร์ ptr*/ val = *ptr; /*ใช้ตัวแปรกับข้อมูลที่ตัวแปร pointer ชี้อยู่*/ ตัวอย่าง1 int x=10, *y; y = &x;/* คือการให้ตัวแปร y ชี้ไปยังแอดเดรสของตัวแปร x */ ตัวอย่าง 2
ตัวอย่างที่ 3 int a , *prt , b , c ,*d; a = 25;/* การใช้ตัวแปรปกติคือ a ให้เก็บข้อมูล 25 */ prt = &a;/* การใช้ตัวแปร prt ที่เก็บค่าตำแหน่งตัวแปร a */ b = a; /* การใช้ตัวแปรปกติคือ a=b */ c = *prt; /* การใช้ตัวแปร c ให้มีค่าเดียวกับข้อมูลที่ ตัวแปร pointer กำลังชี้อยู่ */ d= prt; /* การเรียกใช้ address 2 อันให้มีค่าเดียวกัน */
ตัวอย่าง int x = 1, y = 2; int *ip, *iq; ip = &x; y = *ip; *ip = 0; y = 5; ip = &y; *ip = 3; iq = ip;
int x =1, y =2; 1 1 x y 400 402 500 502 int *ip, *iq; 2 2 ip iq ลำดับการทำงาน กำหนดให้ x และy เป็นตัวแปรชนิด int เก็บค่า 1 และ 2 ตามลำดับ ip และ iq เป็นตัวแปรพอยน์เตอร์ ซึ่งชี้ไปที่ชนิดข้อมูล int
ip = &x; 3. 1 x y 400 402 500 502 2 ip iq 400 ให้ ip ชี้ไปที่ address ของ x ดังนั้น ที่ ip:จะเก็บ addressที่ ip ชี้ไปหรือเป็น address ของ x address ที่ ip ชี้ไปคือ400
4 y = *ip; 1 1 x y 400 402 500 502 2 400 ip iq y = ค่าหรือข้อมูล ที่ addrerss นี้ point ไป นั่นคือ ip ชี้ที่ 400 ค่าที่ตำแหน่ง 400 คือ 1, y =1
5 *ip = 0; 0 1 x y 400 402 500 502 1 400 ip iq กำหนดให้ ค่า ที่ addrerss นี้ point ไป มีค่า เท่ากับ 0 นั่นคือ ip ชี้ที่ 400 ค่าที่ตำแหน่ง 400 คือ 1 จึงเปลี่ยนเป็น 0
6 y = 5; 5 0 x y 400 402 500 502 1 400 ip iq
0 x y 400 402 500 502 5 400 ip iq 7 ip = &y; 402 ให้ ipชี้ ไปที่address ของตัวแปร y ดังนั้น ที่ ip จึงเก็บ address ของ y คือ 402
*ip = 3; 3 0 x y 400 402 500 502 5 402 ip iq กำหนดให้ ค่า ที่ addrerss นี้ point ไป มีค่า เท่ากับ 3 นั่นคือ ip ชี้ที่ 402 ค่าที่ตำแหน่ง 402 คือ 5 จึงเปลี่ยนเป็น 3 8
iq = ip; 0 x y 400 402 500 502 3 402 ip iq 402 เป็นนำค่าaddress ที่เก็บใน ip ให้กับ iq ดังนั้น iq จึงมีค่า 402 หมายความว่า iq ชี้ ไปที่ y 9