1 / 26

ตัวแปรแบบพอยเตอร์

ตัวแปรแบบพอยเตอร์. โดย อ.ศิริพร ศักดิ์บุญญารัตน์ โรงเรียนมหิดลวิทยานุสรณ์. บทที่ 3. เนื้อหา. ความหมายของตัวแปรแบบพอยเตอร์ การประกาศตัวแปรแบบพอยเตอร์ การอ้างอิงตำแหน่งในหน่วยความจำ ตัวแปรแบบพอยเตอร์กับตัวแปรชุด ตัวแปรแบบพอยเตอร์กับสตริง การบวกและลบตัวแปรแบบพอยเตอร์.

tangia
Download Presentation

ตัวแปรแบบพอยเตอร์

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. ตัวแปรแบบพอยเตอร์ โดย อ.ศิริพร ศักดิ์บุญญารัตน์ โรงเรียนมหิดลวิทยานุสรณ์ บทที่ 3

  2. เนื้อหา • ความหมายของตัวแปรแบบพอยเตอร์ • การประกาศตัวแปรแบบพอยเตอร์ • การอ้างอิงตำแหน่งในหน่วยความจำ • ตัวแปรแบบพอยเตอร์กับตัวแปรชุด • ตัวแปรแบบพอยเตอร์กับสตริง • การบวกและลบตัวแปรแบบพอยเตอร์

  3. ผลการเรียนรู้ที่คาดหวังผลการเรียนรู้ที่คาดหวัง • อธิบายความหมายของตัวแปรแบบพอยเตอร์ได้ • เขียนโปรแกรมประกาศตัวแปรแบบพอยเตอร์ได้ • อธิบายการอ้างอิงตำแหน่งในหน่วยความจำของตัวแปรเก็บข้อมูลชนิดพื้นฐานได้แก่ จำนวนเต็ม จำนวนทศนิยม และอักขระได้ • อธิบายการอ้างอิงตำแหน่งในหน่วยความจำของตัวแปรโดยใช้ตัวแปรแบบพอยเตอร์ได้ • เข้าใจหลักการประมวลผลทางคณิตศาสตร์ของพอยเตอร์แบบพื้นฐาน ได้แก่ การบวกและการลบ ได้ • อธิบายการอ้างอิงตำแหน่งในหน่วยความจำของตัวแปรชุดและสมาชิกของตัวแปรชุดได้ • อธิบายความสัมพันธ์ระหว่างพอยเตอร์กับตัวแปรชุดและสตริงได้

  4. ความหมายของตัวแปรแบบพอยเตอร์ความหมายของตัวแปรแบบพอยเตอร์ • ตัวแปรแบบพอยเตอร์เป็นตัวแปรชนิดหนึ่งที่ใช้สำหรับเก็บตำแหน่ง (address) ของข้อมูลภายในหน่วยความจำ ซึ่งการเก็บตำแหน่งจะเก็บเฉพาะตำแหน่งแรกเท่านั้น แบบที่ 1 แบบที่ 2

  5. ประโยชน์ของพอยเตอร์ • ใช้ในการรับค่า address จากฟังก์ชันหนึ่งไปยังอีกฟังก์ชันหนึ่ง • ใช้ในการจัดการตัวแปรชุดหรือตัวแปรสายอักขระให้มีประสิทธิภาพ โดยการอ้างอิง address ของตัวแปรชุดหรือตัวแปรสายอักขระที่ต้องการ แทนที่การอ้างอิงชื่อตัวแปรชุดหรือตัวแปรสายอักขระโดยตรง ทำให้สามารถจัดเก็บและเรียกใช้ข้อมูลที่ต้องการได้ง่าย • ใช้ในการจัดการโครงสร้างข้อมูล เช่น linked list และ binary tree เป็นต้น

  6. การประกาศตัวแปรแบบพอยเตอร์การประกาศตัวแปรแบบพอยเตอร์ • type = ชนิดของข้อมูล เช่น int , char , float , double • ptr_name = ชื่อตัวแปรแบบพอยเตอร์ และต้องมีเครื่องหมาย * (asterisk) • ptr1_name, ptr2_name = ชื่อตัวแปรแบบพอยเตอร์ตัวที่ 1 ,2 ,… ตามลำดับ และต้องมี • เครื่องหมาย * (asterisk) type *ptr_name[,*ptrname];

  7. ตัวอย่างการประกาศตัวแปรแบบพอยเตอร์ตัวอย่างการประกาศตัวแปรแบบพอยเตอร์ • int *ptr_i; //ตัวแปร ptr_iเป็นตัวแปรแบบพอยน์เตอร์ที่ชี้ไปยังชนิดข้อมูล int • char *ptr_c//ตัวแปร ptr_cเป็นตัวแปรแบบพอยน์เตอร์ที่ชี้ไปยังชนิดข้อมูล char • float *ptr_f//ตัวแปร ptr_fเป็นตัวแปรแบบพอยน์เตอร์ที่ชี้ไปยังชนิดข้อมูล float • ในที่นี้ ตามหลักไวยากรณ์ภาษาซีอนุญาตให้เครื่องหมาย * (asterisk) หรือ star ถูกวางไว้ที่ตำแหน่งใดก็ได้ระหว่างชนิดของตัวแปร (base type) และชื่อตัวแปร (variable name) เช่น • int*ptr; หรือ int * ptr; หรือ int* ptr; ก็ได้

  8. การอ้างอิงตำแหน่งในหน่วยความจำการอ้างอิงตำแหน่งในหน่วยความจำ • การอ้างอิงตำแหน่งของข้อมูลด้วย & (address operator) • การอ้างอิงถึงค่าข้อมูลด้วย *(indirect operator)

  9. การอ้างอิงตำแหน่งในหน่วยความจำการอ้างอิงตำแหน่งในหน่วยความจำ • การอ้างอิงตำแหน่งของข้อมูลด้วย & (address operator) ptr_name= &variable_name; • ptr_name = ชื่อตัวแปรแบบพอยเตอร์ • variable_name =ชื่อตัวแปรที่ต้องการกำหนดค่า address ให้กับตัวแปรแบบพอยเตอร์และจะต้องนำหน้าด้วยเครื่องหมาย & (ampersand) ยกเว้นกรณีที่เป็นตัวแปรชุด (array) หรือตัวแปรสตริง (string) ไม่ต้องใส่เครื่องหมาย & (ampersand)

  10. การอ้างอิงตำแหน่งของข้อมูลด้วย & • ตัวอย่างที่ 3.1 int x = 17; int *ptr; ptr=&x;

  11. การอ้างอิงตำแหน่งของข้อมูลด้วย & • ตัวอย่างที่ 3.2 float score; float *ptr; score = 90.5; ptr=&score;

  12. การอ้างอิงตำแหน่งของข้อมูลด้วย & • ตัวอย่างที่ 3.3 char gender; char *ptr; gender = ‘F’; ptr=&gender;

  13. การอ้างอิงตำแหน่งในหน่วยความจำการอ้างอิงตำแหน่งในหน่วยความจำ • การอ้างอิงค่าข้อมูลด้วย * (indirect operator) • เครื่องหมาย * จะใช้เพื่อหาค่าข้อมูลในตำแหน่งที่ตัวแปรแบบพอยเตอร์ชี้อยู่ โดยให้เขียนเครื่องหมาย * นำหน้าชื่อตัวแปรแบบพอยเตอร์ • ตัวอย่าง int x, *ptr; x = 5; ptr = &x; printf(“%d”, *ptr);

  14. การอ้างอิงตำแหน่งในหน่วยความจำการอ้างอิงตำแหน่งในหน่วยความจำ • ตัวอย่างที่ 3.4 int x=17; int *ptr; ptr=&x; *ptr=20; printf(“%d ”,*ptr); • printf(“%d ”,x); • printf(“%d ”,(*ptr)+5); ผลลัพธ์ที่ได้คือ 20 20 25

  15. จงอภิปรายตัวอย่างที่ 3.5 เพื่อหาผลลัพธ์ที่ได้จากโค้ดต่อไปนี้ การอ้างถึงค่าข้อมูลด้วย * • float score, *ptr; • score = 90.5; • ptr = &score; • score = 30; • printf(“%.1f \n”, *ptr); • *ptr = score + (*ptr); • printf(“%.1f \n”, *ptr); • printf(“%.1f \n”, score);

  16. จงอภิปรายตัวอย่างที่ 3.6 เพื่อหาผลลัพธ์ที่ได้จากโค้ดต่อไปนี้ • main() • { int a, b, c, *p, *q; • a = 1; b = 2; c = 3; • p = &a; • printf("p = %p\n",p); • printf("*p = %d\n",*p); • q = &b; • printf("q = %p\n",q); • printf("*q = %d\n",*q); • c = *p; • printf("c = %d\n",c); • p = q; • printf("*p = %d\n",*p); • printf("*q = %d\n",*q); • printf("p = %p\n",p); • printf("q = %p\n",q); • *p = 13; • printf("*p = %d\n",*p); • printf("*q = %d\n",*q); • }

  17. จงอภิปรายตัวอย่างที่ 3.7 เพื่อหาผลลัพธ์ที่ได้จากโค้ดต่อไปนี้ การอ้างถึงค่าข้อมูลด้วย * main() { int *px, x; px = &x; *px = 50; printf("before increasing\n"); printf("px = %p\n", px); printf("x = %d\n", x); (*px)++; printf("after increasing\n"); printf("px = %p\n", px); printf("x = %d\n", x); }

  18. ตัวแปรแบบพอยเตอร์กับตัวแปรชุดตัวแปรแบบพอยเตอร์กับตัวแปรชุด • พิจารณาตัวอย่างการประกาศให้ score เป็นตัวแปรชุดมีขนาดเท่ากับ 3 ช่อง (มีสมาชิก 3 ตัว) จะได้ว่า float score[3]; • จากตัวอย่างด้านบน score เป็นชื่อตัวแปรชุด ซึ่งอันที่จริงแล้ว ชื่อตัวแปรตำแหน่งของสมาชิกตัวแรกของตัวแปรชุดนั่นเอง จึงวาดภาพอธิบายได้ดังนี้ หรือ

  19. จงอภิปราย เพื่อหาผลลัพธ์ที่ได้จากโค้ดต่อไปนี้ • พิจารณาคำสั่ง 2 คำสั่งนี้จะแสดงผลลัพธ์เหมือนกันหรือไม่ • printf(“The array starts at address%p”, score); • printf(“The array starts at address %p”, &score[0]);

  20. ตัวแปรแบบพอยเตอร์กับตัวแปรชุดตัวแปรแบบพอยเตอร์กับตัวแปรชุด • ตัวอย่างที่ 3.8 float score[3]; printf("%p %p %p\n“,&score[0], &score[1],&score[2]); printf("%p %p %p", score, score+1, score+2); score+1 score+2 • หากต้องการเก็บข้อมูลไว้ในตัวแปรชุด score ตำแหน่งที่หนึ่ง เช่น score[1]=20; สามารถแทนด้วยคำสั่ง *(score+1)=20;ได้

  21. จงอภิปรายตัวอย่างที่ 3.9 เพื่อหาผลลัพธ์ที่ได้จากโค้ดต่อไปนี้ การอ้างถึงค่าข้อมูลด้วย * int data[6], i; for(i=0;i<6;i++) data[i] = i*2; for(i=0;i<6;i++) printf("%d ", *(data+i) ); บันทึกผลที่ใบความรู้หน้า 8 ตัวอย่างที่ 3.9

  22. ตัวแปรแบบพอยเตอร์กับสตริงตัวแปรแบบพอยเตอร์กับสตริง • ตัวอย่างที่ 3.10 char code[]="s05123"; char *name_ptr = "Somsri"; intlen; printf("%s %s \n", code, name_ptr); len = strlen(name_ptr); printf("len = %d", len); • ผลลัพธ์ที่ได้คือ s05123Somsri 6

  23. การบวกและลบตัวแปรแบบพอยเตอร์การบวกและลบตัวแปรแบบพอยเตอร์ • ตัวอย่างที่ 3.11 • inti; • float *ptr, data[]={1, 2, 3.5}; • ptr = data; • for(i=0;i<3;i++) • { printf("%.1f ", *ptr); • ptr++; • }

  24. จงอภิปรายตัวอย่างที่ 3.12 เพื่อหาผลลัพธ์ที่ได้จากโค้ดต่อไปนี้ int i, data[5]; for(i=0;i<5;i++) *(data+i) = 10 * i; for(i=0;i<5;i++) printf("%d ", *(data+i)); บันทึกผลที่ใบความรู้หน้า 11

  25. จงอภิปรายตัวอย่างที่ 3.13 เพื่อหาผลลัพธ์ที่ได้จากโค้ดต่อไปนี้ int i, *ptr, data[6]={1,2,3,4,5,6}; ptr = data; for(i=0;i<6;i++) { if((*ptr)%2 == 0) printf("%d ", *ptr); ptr++; } บันทึกผลที่ใบความรู้หน้า 11

  26. จงอภิปรายตัวอย่างที่ 3.14 เพื่อหาผลลัพธ์ที่ได้จากโค้ดต่อไปนี้ char *name = "Environment"; int i; for(i=0; name[i] != '\0' ; i++) printf("%c", name[i]); บันทึกผลที่ใบความรู้หน้า 11

More Related