1 / 33

บทที่ 9 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์

บทที่ 9 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์. Asst.Prof.Urachart Kokaew. พอยท์เตอร์ (Pointer). พอยท์เตอร์ คือ ตัวแปรซึ่งเก็บตำแหน่งของอีกตัวแปรหนึ่ง ซึ่งจะมีขนาดตามตำแหน่ง machine และพอยท์เตอร์ต้องชี้ไปยัง type ของข้อมูลที่แน่ชัด เป็นการเข้าถึงข้อมูลแบบ indirectly รูปแบบการประกาศ.

Download Presentation

บทที่ 9 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์

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. บทที่ 9การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์ Asst.Prof.Urachart Kokaew

  2. พอยท์เตอร์ (Pointer) พอยท์เตอร์ คือ ตัวแปรซึ่งเก็บตำแหน่งของอีกตัวแปรหนึ่ง ซึ่งจะมีขนาดตามตำแหน่ง machineและพอยท์เตอร์ต้องชี้ไปยังtypeของข้อมูลที่แน่ชัด เป็นการเข้าถึงข้อมูลแบบ indirectly • รูปแบบการประกาศ type *var;

  3. พอยท์เตอร์ (Pointer) (ต่อ) เช่น int *iptr;//เก็บตำแหน่งของตัวแปรอื่นที่เป็นinteger char *cptr //เก็บตำแหน่งของตัวแปรอื่นที่เป็น character iptr integer var cptr char var

  4. ตัวดำเนินการ ในภาษาซี ได้มีการกำหนดตัวดำเนินการ 2 ชนิดที่เกี่ยวกับพอยท์เตอร์ ดังนี้ • * หมายถึง indirect operator เป็นการประกาศใช้ตัวแปรพอยท์เตอร์นั้นละยังสามารถใช้เพื่อเข้าถึงเนื้อที่ของหน่วยความจำที่ตัวแปรนั้นชี้ • & หมายถึง address operator เป็นตัวดำเนินการที่ใช้เพื่อบอกตำแหน่งของตัวแปร แทนที่จะเป็นค่าที่เก็บข้อมูล

  5. ตัวดำเนินการ (ต่อ) ตัวอย่าง เช่น char *ptr = NULL; เป็น declaration :ทำการจองเนื้อที่ให้ตัวแปรพอยท์เตอร์ชื่อ ptrและชี้ไปยัง NULL *ptr = NULL; เป็น executable code :การให้ค่า NULLแก่หน่วยความจำตำแหน่งที่ ptrชี้ไป

  6. ตัวอย่าง 1. โปรแกรมที่ใช้พอยท์เตอร์ main() { int num = 3; int *ptr; ptr =# printf(“The value of num is %d. Its address is %lu.”,*ptr,(long)ptr); }

  7. ผลลัพธ์ของตัวอย่าง • ผลลัพธ์ >The value of num is 3. Its address is 448925078. • หมายเหตุ ค่าตำแหน่งของตัวแปรไม่แน่นอนในแต่ละครั้งของการสั่งดำเนินการ

  8. คำอธิบายโปรแกรม

  9. ตัวอย่าง 2โปรแกรมที่ใช้พอยท์เตอร์ main() { static int number[6] = {1,2,3,4,5,6}; int i,*ptr; for(i=0;i<6;i++) { ptr = &number[i]; printf(“%d\n”,*ptr); } }

  10. ผลลัพธ์โปรแกรมตัวอย่าง 2 ผลลัพธ์ 1 2 3 4 5 6 หมายเหตุ ถ้าเราประกาศ int *ptr;เราสามารถให้ ptrชี้ไปยังอาร์เรย์ได้ดังนี้ptr = number; หรือ ptr = &number[0];

  11. อธิบายโปรแกรม2 number i = 0; i = 1; i = 2; i = 3; i = 4; i = 5; ptr 0 1 2 3 4 5 ptr ptr ptr ptr ptr

  12. ตัวอย่าง 3 ฟังก์ชันที่ทำการคำนวณบนตัวชี้ int strlen(s) char *s; { char *p = s; while(*p != ‘\0’) p++; return (p-s); }

  13. คำอธิบายฟังก์ชันตัวอย่าง3 • เป็นฟังก์ชันที่ใช้คำนวณหาความยาวของstring • โดยstringที่ต้องการหาความยาวได้มาจากการผ่านค่าตำแหน่งของ stringมาทางรายการอาร์กิวเมนต์ของฟังก์ชัน S P สิ้นสุดความยาว= P-S

  14. อาร์เรย์ของพอยท์เตอร์อาร์เรย์ของพอยท์เตอร์ ในภาษาซี สามารถที่จะมีอาร์เรย์ที่เป็นพอยท์เตอร์เช่นเดียวกับมีอาร์เรย์ที่เป็นข้อมูลชนิดอื่นๆได้ เช่น int *parray[10];

  15. ตัวอย่าง 4โปรแกรมอาร์เรย์ของพอยท์เตอร์ main() { int j,n1=1;n2=2;n3=3;*ptr,*parray[4]; parray[1] = &n1; parray[2] = &n2; ptr = &n3; parray[3] = ptr; for(j=1;j<4;j++) printf(“%d\n”,*parray[j]); }

  16. ผลลัพธ์ของโปรแกรมตัวอย่าง4ผลลัพธ์ของโปรแกรมตัวอย่าง4 • เป็นโปรแกรมที่ใช้อาร์เรย์เก็บค่าตำแหน่งของ int var • จะได้ผลลัพธ์ดังนี้ 1 2 3

  17. declaration int n1=1,n2=2,n3=3,*ptr, *parray[4] executable code คำอธิบายโปรแกรม n1 n2 n3 n1 n2 n3 parray parray [0] [1] [2] [3] ptr [0] [1] [2] [3] ptr

  18. อาร์เรย์ของพอยท์เตอร์บนตัวอักษรอาร์เรย์ของพอยท์เตอร์บนตัวอักษร • เราสามารถใช้อาร์เรย์ของพอยท์เตอร์บนตัวอักษร ซึ่งกำหนดค่าเริ่มต้นไปยัง stringที่มีความยาวต่างกันได้ และแต่ละตัว stringใช้เนื้อที่ตามที่ต้องการเท่านั้น • ซึ่งจะแสดงได้ดังโปรแกรมตัวอย่างถัดไปซึ่งจะรับค่าหมายเลขเดือน แล้วแสดงชื่อเดือนนั้นทางหน้าจอ

  19. char *month(); main() { int num; puts(“Enter number of month”); scanf(“%d”,num); printf(“The name of month is %s”,month(num)); } char *month(n) int n; { static char *name []= { “illegal month”,“January”, “February”,“March”,“April”,“May”,“June”,“July”, “August”,“September”, “October”,“November”, “December”}; return((n<1 || n>12)?name[0]: name[n];) } } ตัวอย่าง 5อาร์เรย์ของพอยท์เตอร์บนตัวอักษร

  20. ผลลัพธ์ของโปรแกรมตัวอย่าง 5 ผลลัพธ์ Enter number of month > 6 The name of month is June

  21. คำอธิบายโปรแกรม

  22. Content ในSHEET 9.1 การกำหนดตัวแปร Pointer 9.2 คณิตศาสตร์ของ Pointer 9.3 ความสัมพันธ์ของ Pointer และ Array 9.4 ความสัมพันธ์ของ Pointer และ String 9.5 Array ของ Pointer 9.6 Pointer ของ Pointer 9.7 Pointer กับ ข้อมูลชนิด Structure

  23. 9.1 การกำหนดตัวแปร Pointer • การกำหนดตัวแปร Pointer จะคล้ายกับการกำหนดตัวแปรชนิดต่างๆ เพียงแต่ต้องมีเครื่องหมาย * หน้าชื่อตัวแปร ดังนี้ int *pt; • ในที่นี้กำหนดให้ pt เป็นตัวแปร Pointer ซึ่งเก็บ Address ของตัวแปรชนิดตัวเลขจำนวนเต็ม

  24. เครื่องหมายใน pointer ความหมายของเครื่องหมาย 2 ชนิดใน pointer คือ • เครื่องหมาย * จะให้ค่า ของข้อมูล ซึ่งเก็บอยู่ใน Address (Address นี้เก็บ อยู่ในตัวแปร Pointer ซึ่งอยู่หลังเครื่องหมาย * ) • เครื่องหมาย & จะให้ค่า Address ของตัวแปรซึ่งอยู่หลังเครื่องหมาย & ดังตัวอย่าง

  25. ข้อระวังในการใช้งาน pointer • ตัวอย่างโปรแกรมที่ 2 ค่าเปลี่ยนไปตามที่ pointer กำหนดใหม่เพราะตัวชี้ถูกกำหนดใหม่ • ตัวอย่างโปรแกรมที่ 3 "Warning c:\prg\Prg08-03.cpp:Suspicious pointer Conversion in function main“ [C++ Error] pointer1.cpp(28): E2034 Cannot convert 'int *' to 'float *' • ตัวอย่างโปรแกรมที่ 4 Null pointer assignment

  26. 9.2 คณิตศาสตร์ของ Pointer ได้แก่ +,++,- และ -- ตัวแปรหรือค่าคงที่ ที่จะนำมาบวก หรือ ลบ กับตัวแปร Pointer จะเป็นชนิด เลขจำนวนเต็มเท่านั้น เช่น pt = pt+60;        pt --; การเพิ่มหรือลดค่าของตัวแปร Pointer ขึ้นกับแปรชนิดของตัวแปรและ compiler จะตีค่า byte ที่เก็บว่าเท่าใด เช่น

  27. 9.2 คณิตศาสตร์ของ Pointer ตย.เช่นใน compiler ตัวหนึ่ง เลขจำนวนเต็ม aอยู่ที่ Address 40 เมื่อคำสั่ง ptt++; เมื่อถูกประมวล Pointer pt จะชี้ไปที่ Address 42 (เพิ่ม 2 Byte) ถ้าตัวแปร a เป็นชนิดเลขจำนวนจริงPointer pt จะชี้ไปที่ Address 44 (เพิ่ม 4 Byte) (เพิ่มเติมดูตัวอย่างโปรแกรมที่5-8)

  28. 9.3 ความสัมพันธ์ของ Pointer และ Array • Pointer จะชี้ไปที่ส่วนต้นของ Array (ตัวแปร Array ตัวแรก) • ในตัวอย่างโปรแกรมที่ 9 คำสั่ง pt = numberจะทำให้ Pointer pt ชี้ไปที่ส่วนต้นของ Array number ในการพิมพ์ค่าของตัวแปร Array แต่ละตัวทำได้โดยเพิ่มค่า Address ในตัวแปร Pointer หรือเลื่อน Pointer ไปยัง Address ที่สูงขึ้น ซึ่งอยู่ติดกัน • (เพิ่มเติมดูตัวอย่างโปรแกรมที่ 9-12)

  29. 9.4 ความสัมพันธ์ของ Pointer และ String (เพิ่มเติมดูตัวอย่างโปรแกรมที่ 13-17) ตัวอย่างโปแกรมที่ 13 • บรรทัดที่ 7 มีคำสั่ง spt = str; ทำให้ Pointer sptชี้ไปที่ส่วนต้นของ Array String str • คำสั่ง for ซึ่งใช้สร้างลูปในการพิมพ์ข้อมูลใน Array มี การทดสอบเงื่อนไข โดยจะทดสอบค่าที่ถูกชี้ค่าเป็น String null

  30. 9.5 Array ของ Pointer (เพิ่มเติมดูตัวอย่างโปรแกรมที่ 18-19) Array ของ Pointer จะเก็บ Address ของตัวแปร ตามชนิดข้อมูลตัวแปร มีรูปแบบดังนี้ Data type *pointer namr[size]; ตัวอย่างเช่น int *iap[5];         Array ของ Pointer iap จะมีตัวแปร Pointer 5 ตัวสำหรับเก็บ Address ของตัวแปรชนิดตัวชนิดเลขจำนวนเต็ม ถ้าต้องการให้ตัวแปร Pointer ตัวที่ 2 เก็บ Address ของตัวแปร ชนิดเลขจำนวนเต็ม x จะเขียนดังนี้ iap[2] =&x;

  31. ในโปรแกรมที่ 18 กำหนดให้ pt เป็น Array ของ Pointer ซึ่งมีตัวแปร Pointer 3 ตัว สำหรับเก็บ Address ของตัวแปรชนิดเลขจำนวนเต็ม ตัวแปร Pointer ตัวแปร Pointer แต่ละตัว ถูกกำหนดค่าด้วย ค่า Address ของตัวแปรแต่ละตัวใน Array x จากนั้นจึงเพิ่มค่าของตัวแปร Array x ทุกตัวแล้วเก็บใน ตัวแปร Array เดิม

  32. 9.6 Pointer ของ Pointer รูปประกอบที่ 1 Pointer ของ Pointer ในการกำหนด Pointer ของ Pointer จะต้องเพิ่มเครื่องหมาย * อีก 1 ตัว หน้า Pointer เช่น int **pt;         pt เป็นตัวแปร Pointer ซึ่งเก็บค่า Address ของตัวแปร Pointer โดยตัวแปร Pointer ของตัวหลังนี้ จะเก็บ Address ของตัวแปรชนิดเลขจำนวนเต็ม (เพิ่มเติมดูตัวอย่างโปรแกรมที่ 20-21)

  33. 9.7 Pointer กับข้อมูลชนิด Structure ผลลัพธ์ ตัวอย่างโปรแกรมที่ 22 Input data to structure by pointer 3 Item: Code: 121 Name: AA Age: 12 Code: 122 Name: BB Age: 23 Code: 123 Name: CC Age: 14 Display data from structure by use pointer -> 121 AA 12 …..

More Related