วันพุธที่ 9 กรกฎาคม พ.ศ. 2557

6.9 อะเรย์ของพอยน์เตอร์ (array of pointer)

6.9  อะเรย์ของพอยน์เตอร์  (array  of  pointer)
            ในกรณีที่เรามีความต้องการใช้ตัวแปรพอยน์เตอร์เหมือนกับตัวแปรชุดก็สามารถกำหนดได้ตามรูปแบบดังนี้
            รูปแบบการประกาศ  array  แบบ  pointers

กล่องข้อความ: 		type *ptrname[SIZE];  	หรือ  		type *ptrname[SIZE] = { vaiuelist }
         
โดยที่

type  คือ  ชนิดของข้อมูลซึ่งอาจจะเป็น  int, float, double หรือ  char  ก็ได้  ในกรณีที่เป็น  char  ค่าที่เก็บจะต้องเป็นค่าคงที่ชนิดสตริง
valuelist  คือ  ค่าตัวเลข  หรือค่าคงที่ชนิดสตริงขึ้นอยู่กับว่า  type  เป็น  int, float, double หรือ  char ถ้า  type  เป็น  char  จะทำให้  valuelist  เป็นค่าคงที่ชนิดสตริง  ซึ่งต้องเขียนอยู่ภายใต้เครื่องหมาย “ “  (double  quotation)
ptrname  คือ  ชื่อตัวแปรพอยน์เตอร์  ต้องใช้เครื่องหมาย  *  (asterisk)  นำหน้าชื่อเสมอ
SIZE  คือ  ขนาดของตัวแปรชุดพอยน์เตอร์มีค่าตั้งแต่  0,  1,  2,  …,  SIZE-1
ตัวอย่างที่  6.3  แสดงการประกาศตัวแปรชุดแบบพอยน์เตอร์
เช่น  int  *px[10];
ภายในหน่วยความจำจะมีลักษณะดังนี้

รูปที่  6.4  แสดงการประกาศตัวแปรชุดแบบพอยน์เตอร์ในหน่วยความจำ

            เพื่อความเข้าใจเกี่ยวกับการใช้อะเรย์ของพอยน์เตอร์  ให้ศึกษาโปรแกรมตัวอย่าง  6.9  และ  6.10  ดังต่อไปนี้
โปรแกรมตัวอย่างที่  6.9  แสดงการใช้อะเรย์แบบพอยน์เตอร์กับตัวแปรจำนวนเต็ม


 

 
/*             arrptr1.c                */
#include<stdio.h>                                                                              /*  บรรทัดที่  1  */
#include<conio.h>                                                                             /*  บรรทัดที่  2  */
void main(void)                                                                                    /*  บรรทัดที่  3  */
{                                                                                                        /*  บรรทัดที่  4  */
      int  j;                                                                                        /*  บรรทัดที่  5  */
      int *ptr[10];            /* declaration array of pointer ptr */ /*  บรรทัดที่  6  */
      int y[10] = {10,20,30,40,50,60,70,80,90,100};               /*  บรรทัดที่  7  */
      clrscr( );                                                                                 /*  บรรทัดที่  8  */
      for(j=0; j<=9; j++)                                                                /*  บรรทัดที่  9  */
            ptr[j] = &y[j];                                                                      /*  บรรทัดที่  10  */
      for(j=0; j<=9; j++) {                                                             /*  บรรทัดที่  11  */
            *ptr[j] = *ptr[j]+30;                                                          /*  บรรทัดที่  12  */
            printf("y[%d] = %d\n",j,*ptr[j]);                                       /*  บรรทัดที่  13  */
}                                                                                               /*  บรรทัดที่  14  */
      printf("\nPress any key back to program ..."); /*  บรรทัดที่  15  */
      getch();                                                                                  /*  บรรทัดที่  16  */
}                                                                                                /*  บรรทัดที่  17  */
 
 

ผลลัพธ์ที่ได้จากโปรแกรม
แผนผังลำดับงาน: จอภาพ: Y[0] = 40  Y[1] = 50  Y[2] = 60  Y[3] = 70  Y[4] = 80  Y[5] = 90  Y[6] = 100  Y[7] = 110  Y[8] = 120  Y[9] = 130    Press any key back to program...

คำอธิบายโปรแกรม
            จากโปรแกรมตัวอย่างที่  6.9  สามารถอธิบายการทำงานของโปรแกรมที่สำคัญ ๆ  ได้ดังนี้

บรรทัดที่  6  คำสั่ง int *ptr[10];  ประกาศตัวแปรอะเรย์แบบพอยน์เตอร์ชื่อ  ptr  ชนิด int
บรรทัดที่  9 และ 10  คำ สั่ง  for(j=0; j<=9; j++)  ptr[j] = &y[j]; เป็นคำสั่งที่กำหนดค่า  address ของตัวแปรชุด  y[j] ให้กับตัวแปรชุดของพอยน์เตอร์  ptr[j] ดังนั้นจากคำสั่งนี้จะได้ว่า

                           
 รอบที่ 1 j=0 ทำงานคำสั่ง  ptr[0]=&y[0];
รอบที่ 2 j=1 ทำงานคำสั่ง  ptr[1]=&y[1];
รอบที่ 3 j=2 ทำงานคำสั่ง  ptr[2]=&y[2];
รอบที่ 4 j=3 ทำงานคำสั่ง  ptr[3]=&y[3];
รอบที่ 5 j=4 ทำงานคำสั่ง  ptr[4]=&y[4];
รอบที่ 6 j=5 ทำงานคำสั่ง  ptr[5]=&y[5];
รอบที่ 7 j=6 ทำงานคำสั่ง  ptr[6]=&y[6];
รอบที่ 8 j=7 ทำงานคำสั่ง  ptr[7]=&y[7];
รอบที่ 9 j=8 ทำงานคำสั่ง  ptr[8]=&y[8];
รอบที่ 10 j=9 ทำงานคำสั่ง  ptr[9]=&y9];

บรรทัดที่ 11ถึง 14  คำ สั่ง  for (j=0; j<=9; j++){*ptr[j] = *ptr[j]+30; printf("y[%d]=%d\n",j,*ptr[j]); } เป็นคำสั่งที่คำนวณค่าของตัวแปรชุด y[j] โดยบวกเพิ่มตัวละ  30  ผ่านทางตัวแปรชุดของพอยน์เตอร์ ptr[j] จากนั้นก็ใช้คำสั่ง   printf( )  พิมพ์ค่าออกทางจอภาพ
บรรทัดที่ 15 และ 16 พิมพ์ ข้อความให้กดคีย์ใด ๆ  เพื่อกลับเข้าสู่โปรแกรม  และหยุดรอ รับค่าใด ๆ จากคีย์บอร์ด  เช่น  กด enter จะกลับเข้าสู่โปรแกรมตามลำดับ

โปรแกรมตัวอย่างที่  6.10  แสดงการใช้อะเรย์แบบพอยเตอร์กับตัวแปรตัวอักษร


 

 
/*             arrptr2.c                */
#include<stdio.h>                                                                              /*  บรรทัดที่  1  */
#include<conio.h>                                                                             /*  บรรทัดที่  2  */
void main(void)                                                                                    /*  บรรทัดที่  3  */
{                                                                                                        /*  บรรทัดที่  4  */
      int i;                                                                                         /*  บรรทัดที่  5  */
      static char *ptr[4] = {                                                          /*  บรรทัดที่  6  */
      "NAKHONPHANOM",         /*  บรรทัดที่  7  */
      "SAKON NAKHON",            /*  บรรทัดที่  8  */
      "MOOKDAHAN",                  /*  บรรทัดที่  9  */
      "NONGKHAI"      };               /*  บรรทัดที่  10 */
      clrscr();                                                                                  /*  บรรทัดที่  11  */
      for(i=3; i>=0; i--)                                                                  /*  บรรทัดที่  12 */
            printf("%s\n", ptr[i]);                                             /*  บรรทัดที่  13 */
            printf("\nPress any key back to program ..."); /*  บรรทัดที่  14  */
      getch();                                                                                  /*  บรรทัดที่  15  */
}                                                                                               /*  บรรทัดที่  16  */
 
 


ผลลัพธ์ที่ได้จากโปรแกรม

แผนผังลำดับงาน: จอภาพ: NONGKHAI  MOOKDAHAN  SAKON NAKHON  NAKHONPHANOM    Press any key back to program...
คำอธิบายโปรแกรม
            จากโปรแกรมตัวอย่างที่ 6.10 สามารถอธิบายการทำงานของโปรแกรมที่สำคัญ ๆ  ได้ดังนี้
            บรรทัดที่  6 ถึง 10 คำสั่ง static char *ptr[4] = {

"NAKHONPHANOM",
"SAKON NAKHON",
"MOOKDAHAN",
"NONGKHAI"      };

ประกาศตัวแปรอะเรย์แบบพอยน์เตอร์ ให้เป็นแบบ  static ชื่อ  ptr มีขนาด  4 ตัว  เก็บชื่อจังหวัด 4 จังหวัด  คือตัวที่  0 ถึง ตัวที่ 3
บรรทัดที่ 12 และ 13  คำ สั่ง for(i=3; i>=0; i--)   printf("%s\n", ptr[i]);   คำสั่ง for  เพื่อช่วยวนลูปนำชื่อจังหวัดออกมาแสดง โดยแสดงจังหวัดสุดท้ายย้อนกลับมาจังหวัดแรก และแต่ละจังหวัดแสดงแล้วขึ้นบรรทัดใหม่ด้วย
บรรทัดที่ 14 และ 15 พิมพ์ ข้อความให้กดคีย์ใด ๆ  เพื่อกลับเข้าสู่โปรแกรม  และหยุดรอ รับค่าใด ๆ จากคีย์บอร์ด  เช่น  กด enter จะกลับเข้าสู่โปรแกรมตามลำดับ

ไม่มีความคิดเห็น:

แสดงความคิดเห็น