บทที่ 11 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์ บทที่ 11 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์
พอยท์เตอร์ (Pointer) พอยท์เตอร์ คือ ตัวแปรซึ่งเก็บตำแหน่งของอีกตัวแปรหนึ่ง ซึ่งจะมีขนาดตามตำแหน่ง machine และพอยท์เตอร์ต้องชี้ไปยัง type ของข้อมูลที่แน่ชัด เป็นการเข้าถึงข้อมูลแบบ indirectly รูปแบบการประกาศ type *var;
พอยท์เตอร์ (Pointer) (ต่อ) เช่น int *iptr; //เก็บตำแหน่งของตัวแปรอื่นที่เป็น integer char *cptr //เก็บตำแหน่งของตัวแปรอื่นที่เป็น character iptr integer var cptr char var
ตัวดำเนินการ ในภาษาซี ได้มีการกำหนดตัวดำเนินการ 2 ชนิดที่เกี่ยวกับพอยท์เตอร์ ดังนี้ * หมายถึง indirect operator เป็นการประกาศใช้ตัวแปรพอยท์เตอร์นั้นละยังสามารถใช้เพื่อเข้าถึงเนื้อที่ของหน่วยความจำที่ตัวแปรนั้นชี้ & หมายถึง address operator เป็นตัวดำเนินการที่ใช้เพื่อบอกตำแหน่งของตัวแปร แทนที่จะเป็นค่าที่เก็บข้อมูล
ตัวดำเนินการ (ต่อ) ตัวอย่าง เช่น char *ptr = NULL; เป็น declaration : ทำการจองเนื้อที่ให้ตัวแปรพอยท์เตอร์ชื่อ ptr และชี้ไปยัง NULL *ptr = NULL; เป็น executable code : การให้ค่า NULL แก่หน่วยความจำตำแหน่งที่ ptr ชี้ไป
ตัวอย่าง 11.1 โปรแกรมที่ใช้พอยท์เตอร์ main() { int num = 3; int *ptr; ptr =# printf(“The value of num is %d. Its address is %lu.”,*ptr,(long)ptr); }
ผลลัพธ์ของตัวอย่าง 11.1 ผลลัพธ์ >The value of num is 3. Its address is 448925078. หมายเหตุ ค่าตำแหน่งของตัวแปรไม่แน่นอนในแต่ละครั้งของการสั่งดำเนินการ
คำอธิบายโปรแกรม Declaration: int num = 3; int *ptr; num int var ptr Executable code: ptr = # 3 3
ตัวอย่าง 11.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); }
ผลลัพธ์โปรแกรมตัวอย่าง 11.2 3 4 5 6 หมายเหตุ ถ้าเราประกาศ int *ptr;เราสามารถให้ ptr ชี้ไปยังอาร์เรย์ได้ดังนี้ ptr = number; หรือ ptr = &number[0];
อธิบายโปรแกรม 11.2 1 2 3 4 5 6 number i = 0; ptr 1 2 i = 1; 3 i = 2; 4 1 2 3 4 5 1 2 3 4 5 6 ptr
ตัวอย่าง 11.3 ฟังก์ชันที่ทำการคำนวณบนตัวชี้ int strlen(s) char *s; { char *p = s; while(*p != ‘\0’) p++; return (p-s); }
คำอธิบายฟังก์ชันตัวอย่าง 11.3 เป็นฟังก์ชันที่ใช้คำนวณหาความยาวของ string โดย string ที่ต้องการหาความยาวได้มาจากการผ่านค่าตำแหน่งของ string มาทางรายการอาร์กิวเมนต์ของฟังก์ชัน S A B C D E F \0 P สิ้นสุดความยาว = P-S
อาร์เรย์ของพอยท์เตอร์ ในภาษาซี สามารถที่จะมีอาร์เรย์ที่เป็นพอยท์เตอร์เช่นเดียวกับมีอาร์เรย์ที่เป็นข้อมูลชนิดอื่นๆได้ เช่น int *parray[10]; parray[0] parray[1] parray[2] . parray[9] int.var
ตัวอย่าง 11.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]); }
ผลลัพธ์ของโปรแกรมตัวอย่าง 11.4 เป็นโปรแกรมที่ใช้อาร์เรย์เก็บค่าตำแหน่งของ int var จะได้ผลลัพธ์ดังนี้ 1 2 3
คำอธิบายโปรแกรม declaration int n1=1,n2=2,n3=3,*ptr, *parray[4] executable code n1 n2 n3 n1 n2 n3 1 2 3 1 2 3 parray parray [0] [1] [2] [3] ptr [0] [1] [2] [3] ptr
อาร์เรย์ของพอยท์เตอร์บนตัวอักษร เราสามารถใช้อาร์เรย์ของพอยท์เตอร์บนตัวอักษร ซึ่งกำหนดค่าเริ่มต้นไปยัง string ที่มีความยาวต่างกันได้ และแต่ละตัว string ใช้เนื้อที่ตามที่ต้องการเท่านั้น ซึ่งจะแสดงได้ดังโปรแกรมตัวอย่างถัดไปซึ่งจะรับค่าหมายเลขเดือน แล้วแสดงชื่อเดือนนั้นทางหน้าจอ
ตัวอย่าง 11.5 อาร์เรย์ของพอยท์เตอร์บนตัวอักษร 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];) } char *month(); main() { int num; puts(“Enter number of month”); scanf(“%d”,num); printf(“The name of month is %s”,month(num)); }
ผลลัพธ์ของโปรแกรมตัวอย่าง 11.5 Enter number of month > 6 The name of month is June
คำอธิบายโปรแกรม name[0] name[1] name[2] name[12] illegal month January February . December