1 / 21

พอยน์เตอร์ ( Pointer)

พอยน์เตอร์ ( Pointer). พอยน์เตอร์ หรือ ตัวชี้ - เป็นชนิดข้อมูลชนิดหนึ่งของภาษา C (int, float, char) - ตัวแปรชนิดตัวชี้ มีความเร็วในการทำงานสูง - ตัวแปรชนิดตัวชี้ช่วยประหยัดเนื้อที่ในหน่วยความ จำหลักขณะประมวลผล เมื่อเทียบกับ Array

Download Presentation

พอยน์เตอร์ ( Pointer)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. พอยน์เตอร์ (Pointer)

  2. พอยน์เตอร์ หรือตัวชี้ -เป็นชนิดข้อมูลชนิดหนึ่งของภาษา C(int, float, char) -ตัวแปรชนิดตัวชี้มีความเร็วในการทำงานสูง -ตัวแปรชนิดตัวชี้ช่วยประหยัดเนื้อที่ในหน่วยความ จำหลักขณะประมวลผลเมื่อเทียบกับ Array -ใช้ตัวชี้ร่วมกับฟังก์ชันเพื่อเพิ่มประสิทธิภาพการเขียน โปรแกรม

  3. 5.1 พอยน์เตอร์ กับแอดเดรส(Pointers and Addresses) ตัวแปร คือชื่อที่ใช้แทนข้อมูล การประกาศตัวแปรเป็นการกำหนดชื่อเพื่อใช้แทนข้อมูล เมื่อประกาศตัวแปร จะมีการจองเนื้อที่ในหน่วยความจำเพื่อเก็บข้อมูล เราสามารถเข้าถึงข้อมูลได้โดยอ้างถึงตัวแปร การประกาศตัวแปร เช่น int i; เป็นการประกาศ (Declaration) ตัวแปรชื่อ i เป็นตัวแปรชนิด int(integer)

  4. int i; i 400 402 404 i = 10; 10 แอดเดรส (Address) ภาพจำลองการแทนข้อมูลในหน่วยความจำแบบปกติ แอดเดรส คือ ตำแหน่งที่เก็บข้อมูลในหน่วยความจำ เสมือนบ้านเลขที่เพื่อ ใช้ในการอ้างถึงสำหรับนำข้อมูลไปเก็บ หรือนำออกมาใช้งาน

  5. วิธีการใช้ตัวชี้หรือพอยน์เตอร์เป็นอีกวิธีที่จะเข้าถึงตัวแปรปกติได้ ตัวแปรชนิดพอยน์เตอร์จะเก็บค่าที่อยู่ของหน่วยความจำหลัก ซึ่งต่างกับตัวแปรปกติที่เก็บค่าที่แท้จริงของข้อมูล นั่นคือการใช้ตัวแปรชนิดพอยน์เตอร์จะเป็นการเข้าถึงข้อมูลหรือเป็นการอ้างถึงตำแหน่งที่เก็บข้อมูล พอยน์เตอร์ เป็นชนิดข้อมูลชนิดหนึ่งของภาษาซี แตกต่างจากชนิดข้อมูลพื้นฐานอื่น ๆ ตัวแปรพอยน์เตอร์เป็นตัวแปรที่ใช้เก็บค่า address ของตัวแปรอื่น ๆ

  6. p p i 360 400 400 10 i 10 10 แอดเดรส (Address) p เก็บค่าแอดเดรสของ ตัวแปร i ถ้ามีตัวแปร i เป็นตัวแปรชนิด int และมีตัวแปร p เป็นตัวแปร ชนิดพอยน์เตอร์ p เก็บค่าแอดเดรสของตัวแปร i (หรือ p ชี้ไปที่ตัวแปร i) สามารถจำลองการแทนข้อมูลในหน่วยความจำ ดังรูป

  7. 5.2 การประกาศตัวแปรชนิดตัวชี้หรือพอยน์เตอร์ ใช้การดำเนินการชนิดเอกภาค (unary operator* ) รูปแบบการประกาศตัวแปรชนิดพอยน์เตอร์ ชนิดข้อมูล *ชื่อตัวแปร ; เช่น int *point ; /* ดอกจันทร์ ติดกับชื่อตัวแปร*/ เป็นการประกาศตัวแปรชื่อ point ว่าเป็นตัวแปรชนิดพอยน์เตอร์ ที่ทำหน้าที่เก็บตำแหน่ง หรือ address ในหน่วยความจำที่มีข้อมูล ชนิดเลขจำนวนเต็ม เครื่องหมาย *(ดอกจันทร์) เป็นตัวบอกว่าตัวแปร point เป็นตัวแปรชนิดตัวชี้หรือพอยน์เตอร์

  8. ประกาศตัวแปร prt ให้เป็นตัวแปรตัวชี้ หรือตัวแปรพอยน์เตอร์ที่ชี้ไปยังตัวแปรชนิด char ประกาศตัวแปร ip และ ตัวแปร temp เป็นตัวแปรตัวชี้ที่ชี้ไปยังตัวแปรชนิด int ตัวแปรพอยน์เตอร์ทำหน้าที่เก็บ address นั่นคือทำหน้าที่ชี้ไปยังตัวแปรตัวอื่น ดังนั้นการประกาศตัวแปรพอยน์เตอร์ ต้องสอดคล้องกับชนิดของตัวแปรตัวอื่น ที่ต้องการให้ตัวแปรพอยน์เตอร์นั้นจะชี้ไป เช่น char *prt; int *ip , *temp; double *dp; ประกาศตัวแปร dp เป็นตัวแปรตัวชี้ ที่ชี้ไปยังตัวแปรชนิด double

  9. 5.3 การดำเนินการสำหรับตัวชี้: มี 2 ตัว 5.3.1ตัวดำเนินการอ้างถึงที่อยู่ (address operator)ใช้เครื่องหมาย&นำ หน้าตัวแปร ซึ่งหมายถึงตำแหน่งที่อยู่ของตัวแปรนั้น ในหน่วยความจำ ตัวอย่าง #include <stdio.h> void main ( ) { int z= 10; int *ZPtr; ZPtr = &z; /* ตัวแปรชนิดตัวชี้เก็บ เลขที่อยู่ของตัวแปร z */ }

  10. ให้ตัวแปรพอยน์เตอร์ 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 */ }

  11. int count , val ,*ptr; count =100; /*การใช้ตัวแปรปกติ*/ ptr = &count; /*การให้ address ตัวแปร count แก่พอยน์เตอร์ ptr*/ val = *ptr; /*ใช้ตัวแปรกับข้อมูลที่ตัวแปร pointer ชี้อยู่*/ ตัวอย่าง1 int x=10, *y; y = &x;/* คือการให้ตัวแปร y ชี้ไปยังแอดเดรสของตัวแปร x */ ตัวอย่าง 2

  12. ตัวอย่างที่ 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 อันให้มีค่าเดียวกัน */

  13. ตัวอย่าง int x = 1, y = 2; int *ip, *iq; ip = &x; y = *ip; *ip = 0; y = 5; ip = &y; *ip = 3; iq = ip;

  14. 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

  15. 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

  16. 4 y = *ip; 1 1 x y 400 402 500 502 2 400 ip iq y = ค่าหรือข้อมูล ที่ addrerss นี้ point ไป นั่นคือ ip ชี้ที่ 400 ค่าที่ตำแหน่ง 400 คือ 1, y =1

  17. 5 *ip = 0; 0 1 x y 400 402 500 502 1 400 ip iq กำหนดให้ ค่า ที่ addrerss นี้ point ไป มีค่า เท่ากับ 0 นั่นคือ ip ชี้ที่ 400 ค่าที่ตำแหน่ง 400 คือ 1 จึงเปลี่ยนเป็น 0

  18. 6 y = 5; 5 0 x y 400 402 500 502 1 400 ip iq

  19. 0 x y 400 402 500 502 5 400 ip iq 7 ip = &y; 402 ให้ ipชี้ ไปที่address ของตัวแปร y ดังนั้น ที่ ip จึงเก็บ address ของ y คือ 402

  20. *ip = 3; 3 0 x y 400 402 500 502 5 402 ip iq กำหนดให้ ค่า ที่ addrerss นี้ point ไป มีค่า เท่ากับ 3 นั่นคือ ip ชี้ที่ 402 ค่าที่ตำแหน่ง 402 คือ 5 จึงเปลี่ยนเป็น 3 8

  21. iq = ip; 0 x y 400 402 500 502 3 402 ip iq 402 เป็นนำค่าaddress ที่เก็บใน ip ให้กับ iq ดังนั้น iq จึงมีค่า 402 หมายความว่า iq ชี้ ไปที่ y 9

More Related