260 likes | 334 Views
ตัวแปรแบบพอยเตอร์. โดย อ.ศิริพร ศักดิ์บุญญารัตน์ โรงเรียนมหิดลวิทยานุสรณ์. บทที่ 3. เนื้อหา. ความหมายของตัวแปรแบบพอยเตอร์ การประกาศตัวแปรแบบพอยเตอร์ การอ้างอิงตำแหน่งในหน่วยความจำ ตัวแปรแบบพอยเตอร์กับตัวแปรชุด ตัวแปรแบบพอยเตอร์กับสตริง การบวกและลบตัวแปรแบบพอยเตอร์.
E N D
ตัวแปรแบบพอยเตอร์ โดย อ.ศิริพร ศักดิ์บุญญารัตน์ โรงเรียนมหิดลวิทยานุสรณ์ บทที่ 3
เนื้อหา • ความหมายของตัวแปรแบบพอยเตอร์ • การประกาศตัวแปรแบบพอยเตอร์ • การอ้างอิงตำแหน่งในหน่วยความจำ • ตัวแปรแบบพอยเตอร์กับตัวแปรชุด • ตัวแปรแบบพอยเตอร์กับสตริง • การบวกและลบตัวแปรแบบพอยเตอร์
ผลการเรียนรู้ที่คาดหวังผลการเรียนรู้ที่คาดหวัง • อธิบายความหมายของตัวแปรแบบพอยเตอร์ได้ • เขียนโปรแกรมประกาศตัวแปรแบบพอยเตอร์ได้ • อธิบายการอ้างอิงตำแหน่งในหน่วยความจำของตัวแปรเก็บข้อมูลชนิดพื้นฐานได้แก่ จำนวนเต็ม จำนวนทศนิยม และอักขระได้ • อธิบายการอ้างอิงตำแหน่งในหน่วยความจำของตัวแปรโดยใช้ตัวแปรแบบพอยเตอร์ได้ • เข้าใจหลักการประมวลผลทางคณิตศาสตร์ของพอยเตอร์แบบพื้นฐาน ได้แก่ การบวกและการลบ ได้ • อธิบายการอ้างอิงตำแหน่งในหน่วยความจำของตัวแปรชุดและสมาชิกของตัวแปรชุดได้ • อธิบายความสัมพันธ์ระหว่างพอยเตอร์กับตัวแปรชุดและสตริงได้
ความหมายของตัวแปรแบบพอยเตอร์ความหมายของตัวแปรแบบพอยเตอร์ • ตัวแปรแบบพอยเตอร์เป็นตัวแปรชนิดหนึ่งที่ใช้สำหรับเก็บตำแหน่ง (address) ของข้อมูลภายในหน่วยความจำ ซึ่งการเก็บตำแหน่งจะเก็บเฉพาะตำแหน่งแรกเท่านั้น แบบที่ 1 แบบที่ 2
ประโยชน์ของพอยเตอร์ • ใช้ในการรับค่า address จากฟังก์ชันหนึ่งไปยังอีกฟังก์ชันหนึ่ง • ใช้ในการจัดการตัวแปรชุดหรือตัวแปรสายอักขระให้มีประสิทธิภาพ โดยการอ้างอิง address ของตัวแปรชุดหรือตัวแปรสายอักขระที่ต้องการ แทนที่การอ้างอิงชื่อตัวแปรชุดหรือตัวแปรสายอักขระโดยตรง ทำให้สามารถจัดเก็บและเรียกใช้ข้อมูลที่ต้องการได้ง่าย • ใช้ในการจัดการโครงสร้างข้อมูล เช่น linked list และ binary tree เป็นต้น
การประกาศตัวแปรแบบพอยเตอร์การประกาศตัวแปรแบบพอยเตอร์ • type = ชนิดของข้อมูล เช่น int , char , float , double • ptr_name = ชื่อตัวแปรแบบพอยเตอร์ และต้องมีเครื่องหมาย * (asterisk) • ptr1_name, ptr2_name = ชื่อตัวแปรแบบพอยเตอร์ตัวที่ 1 ,2 ,… ตามลำดับ และต้องมี • เครื่องหมาย * (asterisk) type *ptr_name[,*ptrname];
ตัวอย่างการประกาศตัวแปรแบบพอยเตอร์ตัวอย่างการประกาศตัวแปรแบบพอยเตอร์ • 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; ก็ได้
การอ้างอิงตำแหน่งในหน่วยความจำการอ้างอิงตำแหน่งในหน่วยความจำ • การอ้างอิงตำแหน่งของข้อมูลด้วย & (address operator) • การอ้างอิงถึงค่าข้อมูลด้วย *(indirect operator)
การอ้างอิงตำแหน่งในหน่วยความจำการอ้างอิงตำแหน่งในหน่วยความจำ • การอ้างอิงตำแหน่งของข้อมูลด้วย & (address operator) ptr_name= &variable_name; • ptr_name = ชื่อตัวแปรแบบพอยเตอร์ • variable_name =ชื่อตัวแปรที่ต้องการกำหนดค่า address ให้กับตัวแปรแบบพอยเตอร์และจะต้องนำหน้าด้วยเครื่องหมาย & (ampersand) ยกเว้นกรณีที่เป็นตัวแปรชุด (array) หรือตัวแปรสตริง (string) ไม่ต้องใส่เครื่องหมาย & (ampersand)
การอ้างอิงตำแหน่งของข้อมูลด้วย & • ตัวอย่างที่ 3.1 int x = 17; int *ptr; ptr=&x;
การอ้างอิงตำแหน่งของข้อมูลด้วย & • ตัวอย่างที่ 3.2 float score; float *ptr; score = 90.5; ptr=&score;
การอ้างอิงตำแหน่งของข้อมูลด้วย & • ตัวอย่างที่ 3.3 char gender; char *ptr; gender = ‘F’; ptr=&gender;
การอ้างอิงตำแหน่งในหน่วยความจำการอ้างอิงตำแหน่งในหน่วยความจำ • การอ้างอิงค่าข้อมูลด้วย * (indirect operator) • เครื่องหมาย * จะใช้เพื่อหาค่าข้อมูลในตำแหน่งที่ตัวแปรแบบพอยเตอร์ชี้อยู่ โดยให้เขียนเครื่องหมาย * นำหน้าชื่อตัวแปรแบบพอยเตอร์ • ตัวอย่าง int x, *ptr; x = 5; ptr = &x; printf(“%d”, *ptr);
การอ้างอิงตำแหน่งในหน่วยความจำการอ้างอิงตำแหน่งในหน่วยความจำ • ตัวอย่างที่ 3.4 int x=17; int *ptr; ptr=&x; *ptr=20; printf(“%d ”,*ptr); • printf(“%d ”,x); • printf(“%d ”,(*ptr)+5); ผลลัพธ์ที่ได้คือ 20 20 25
จงอภิปรายตัวอย่างที่ 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);
จงอภิปรายตัวอย่างที่ 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); • }
จงอภิปรายตัวอย่างที่ 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); }
ตัวแปรแบบพอยเตอร์กับตัวแปรชุดตัวแปรแบบพอยเตอร์กับตัวแปรชุด • พิจารณาตัวอย่างการประกาศให้ score เป็นตัวแปรชุดมีขนาดเท่ากับ 3 ช่อง (มีสมาชิก 3 ตัว) จะได้ว่า float score[3]; • จากตัวอย่างด้านบน score เป็นชื่อตัวแปรชุด ซึ่งอันที่จริงแล้ว ชื่อตัวแปรตำแหน่งของสมาชิกตัวแรกของตัวแปรชุดนั่นเอง จึงวาดภาพอธิบายได้ดังนี้ หรือ
จงอภิปราย เพื่อหาผลลัพธ์ที่ได้จากโค้ดต่อไปนี้ • พิจารณาคำสั่ง 2 คำสั่งนี้จะแสดงผลลัพธ์เหมือนกันหรือไม่ • printf(“The array starts at address%p”, score); • printf(“The array starts at address %p”, &score[0]);
ตัวแปรแบบพอยเตอร์กับตัวแปรชุดตัวแปรแบบพอยเตอร์กับตัวแปรชุด • ตัวอย่างที่ 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;ได้
จงอภิปรายตัวอย่างที่ 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
ตัวแปรแบบพอยเตอร์กับสตริงตัวแปรแบบพอยเตอร์กับสตริง • ตัวอย่างที่ 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
การบวกและลบตัวแปรแบบพอยเตอร์การบวกและลบตัวแปรแบบพอยเตอร์ • ตัวอย่างที่ 3.11 • inti; • float *ptr, data[]={1, 2, 3.5}; • ptr = data; • for(i=0;i<3;i++) • { printf("%.1f ", *ptr); • ptr++; • }
จงอภิปรายตัวอย่างที่ 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
จงอภิปรายตัวอย่างที่ 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
จงอภิปรายตัวอย่างที่ 3.14 เพื่อหาผลลัพธ์ที่ได้จากโค้ดต่อไปนี้ char *name = "Environment"; int i; for(i=0; name[i] != '\0' ; i++) printf("%c", name[i]); บันทึกผลที่ใบความรู้หน้า 11