วันพุธที่ 17 กันยายน พ.ศ. 2557

06:48
6.7 พอยน์เตอร์กับตัวแปรชุด  (pointers  and  arrays)

            พอยน์เตอร์สามารถนำมาช่วยในการจัดการข้อมูลที่เก็บอยู่ในตัวแปรชุดได้ ซึ่งจะช่วยทำให้การจัดเก็บและการเรียกใช้ข้อมูลในตัวแปรชุดมีประสิทธิภาพมากขึ้น
            เพื่อความเข้าใจเกี่ยวกับการใช้งานพอยน์เตอร์กับตัวแปรชุด  ให้ศึกษาโปรแกรมตัวอย่าง  6.5  และ  6.6  ดังต่อไปนี้
โปรแกรมตัวอย่างที่  6.5  แสดงการใช้พอยน์เตอร์กับตัวแปรชุด

/*             ptrarr1.c                */
#include<stdio.h>                                                                              /*  บรรทัดที่  1  */
#include<conio.h>                                                                             /*  บรรทัดที่  2  */
void main (void)                                                                                   /*  บรรทัดที่  3  */
{                                                                                                         /*  บรรทัดที่  4  */
      int num[10] = {10,20,30,40,50,60,70,80,90,100};         /*  บรรทัดที่  5  */
      int *ptr;   /* declaration pointer ptr */                                /*  บรรทัดที่  6  */
      int i;                                                                                         /*  บรรทัดที่  7  */
      clrscr( );                                                                                 /*  บรรทัดที่  8  */
      ptr=&num[0];                                                                       /*  บรรทัดที่  9  */
      for (i=0; i<=9; i++)                                                               /*  บรรทัดที่  10  */
            printf( "%5d",*(ptr+i) );                                                     /*  บรรทัดที่  11  */
      printf("\n\nPress any key back to program ...");              /*  บรรทัดที่  12  */
      getch();                                                                                  /*  บรรทัดที่  13  */
}                                                                                                    /*  บรรทัดที่  14  */
ผลลัพธ์ที่ได้จากโปรแกรม

แผนผังลำดับงาน: จอภาพ: 10 20  30  40  50  60  70  80  90  100    Press any key back to program…

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

บรรทัดที่ 6   คำสั่ง  int *ptr;  การประกาศตัวแปรพอยเตอร์ชื่อ  ptr  ชนิด  int
บรรทัดที่ 9   คำสั่ง  ptr=&num[0];  เป็นการกำหนด  address  แรกของตัวแปร  num[0] ให้กับตัวแปร  ptr  หรือใช้คำสั่ง  ptr=num;  ก็ได้
บรรทัดที่ 10 คำสั่ง  for  เพื่อช่วยวนลูปนำค่าที่ตัวแปรอะเรย์ชี้อยู่ออกมาแสดง
บรรทัดที่ 11 คำสั่ง printf(“%5d”,*(ptr+i)); เป็นการพิมพ์ค่าในตัวแปรอะเรย์ num โดยใช้ตัวแปรพอยน์เตอร์ซึ่งนิพจน์ *(ptr+i) หมายถึงการพิมพ์ค่าที่ตัวแปรพอยน์เตอร์ชี้อยู่คือ num[i]
บรรทัดที่ 12 และ 13   พิมพ์ข้อความให้กดคีย์ใด ๆ  เพื่อกลับเข้าสู่โปรแกรม  และหยุดรอ  รับค่าใด ๆ จากคีย์บอร์ด  เช่น  กด enter จะกลับเข้าสู่โปรแกรมตามลำดับ
โปรแกรมตัวอย่างที่  6.6  แสดงการใช้พอยน์เตอร์กับตัวแปรชุดควบคู่กับการเรียกใช้ฟังก์ชันที่มีการส่งตำแหน่งข้อมูล

/*             ptrarr2.c     */
#include<stdio.h>                                                                              /*  บรรทัดที่  1  */
#include<conio.h>                                                                             /*  บรรทัดที่  2  */
void add(int*);          /* function prototype add() */                        /*  บรรทัดที่  3  */
void main(void)                                                                                    /*  บรรทัดที่  4  */
{                                                                                                   /*  บรรทัดที่  5  */
      int array[10] = {2,4,6,8,10,12,14,16,18,20};                    /*  บรรทัดที่  6  */
      int i;                                                                                         /*  บรรทัดที่  7  */
      clrscr();                                                                                  /*  บรรทัดที่  8  */
      for(i=0; i<=9; i++)                                                                /*  บรรทัดที่  9  */
            printf( "%5d", array[i] );                                                    /*  บรรทัดที่  10  */
      add(array);                                                                            /*  บรรทัดที่  11  */
      for(i=0; i<=9; i++)                                                                /*  บรรทัดที่  12  */
            printf( "\n%25d", *(array+i) );                                          /*  บรรทัดที่  13  */
      printf("\n\nPress any key back to program ...");              /*  บรรทัดที่  14  */
      getch();                                                                                  /*  บรรทัดที่  15  */
} /* end main */                                                                    /*  บรรทัดที่  16  */
/**** add function ****/                                                       /*  บรรทัดที่  17  */
void add(int *ptr)                                                                 /*  บรรทัดที่  18  */
{                                                                                               /*  บรรทัดที่  19  */
      int j;                                                                         /*  บรรทัดที่  20  */
      for(j=0; j<=9; j++)                                                /*  บรรทัดที่  21  */
            *(ptr+j) = *(ptr+j) + 20;                                    /*  บรรทัดที่  22  */
}                                                                                               /*  บรรทัดที่  23  */

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

แผนผังลำดับงาน: จอภาพ: 2   4   6   8   10   12   14   16   18   20         22         24         26         28         30         32         34         36         38         40        Press any key back to program…       

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

บรรทัดที่  3  คำสั่ง  void add(int*);  ประกาศรูปแบบฟังก์ชันชื่อ  add( )
บรรทัดที่  9 และ 10   คำสั่ง  for(i=0;  i<=9;  i++)    printf(“%5d”,array[i]);  เป็นคำสั่งวนลูปให้พิมพ์ค่าจากตัวแปร  array[0],  array[1],  array[2],  array[3],  array[4]  ถึง  array[9]  ตามลำดับ
บรรทัดที่  11   คำสั่ง  add(array);  เป็นคำสั่งเรียกใช้ฟังก์ชัน  add  โดยส่งค่า  address  แรกของตัวแปร  array[0]  ไปให้ตัวแปรพอยน์เตอร์  ptr  ในฟังก์ชัน  add( )
บรรทัดที่ 12 และ 13   คำสั่ง  for(i=0;  i<=9;i++)  printf(“\n%25d”,*(array+i));  ทำงานเหมือนบรรทัดที่  9  และ  10  
บรรทัดที่ 14 และ 15   พิมพ์ข้อความให้กดคีย์ใด ๆ  เพื่อกลับเข้าสู่โปรแกรม  และหยุดรอรับค่าใด ๆ จากคีย์บอร์ด  เช่น  กด enter จะกลับเข้าสู่โปรแกรมตามลำดับ
บรรทัดที่  21 และ 22   คำสั่ง   for(j=0;  j<=9;  j++)    *(ptr+j)  =  *(ptr+j)  +  20;  เป็นคำสั่งที่เหมือนกับคำสั่ง  array[j]=array[j]+20;  ดังนั้นเมื่อใช้คำสั่ง  for  มาช่วย  จึงทำให้สมาชิกทุกตัวของตัวแปรชุด  ได้แก่  array[0],  array[1],  array[2],  array[3],  array[4]  ถึง  array[9]  ถูกเพิ่มค่าเข้าไปตัวละ  20  จึงได้ผลลัพธ์ตามที่ได้แสดงมาแล้วข้างต้น

ดังนั้น
*(ptr+0)  หมายถึง  ค่าตัวแปร  array[0]  หรือ  *(array+0)
*(ptr+1)  หมายถึง  ค่าตัวแปร  array[1]  หรือ  *(array+1)
 *(ptr+2)  หมายถึง  ค่าตัวแปร  array[2]  หรือ  *(array+2)
  *(ptr+3)  หมายถึง  ค่าตัวแปร  array[3]  หรือ  *(array+3)
*(ptr+4)  หมายถึง  ค่าตัวแปร  array[4]  หรือ  *(array+4)
*(ptr+5)  หมายถึง  ค่าตัวแปร  array[5]  หรือ  *(array+5)
*(ptr+6)  หมายถึง  ค่าตัวแปร  array[6]  หรือ  *(array+6)
*(ptr+7)  หมายถึง  ค่าตัวแปร  array[7]  หรือ  *(array+7)
*(ptr+8)  หมายถึง  ค่าตัวแปร  array[8]  หรือ  *(array+8)
*(ptr+9)  หมายถึง  ค่าตัวแปร  array[9]  หรือ  *(array+9)

0 ความคิดเห็น:

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