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

06:48
6.6 พอยน์เตอร์กับฟังก์ชันที่เขียนขึ้นใช้งานเอง  (pointer  and  user  defined functions)

            เราสามารถใช้ตัวแปรพอยน์เตอร์มาช่วยในการรับค่าและส่งคืนค่ากลับในฟังก์ชันที่เขียนขึ้นได้ดังนี้
            6.6.1  การส่งค่าไปยังฟังก์ชัน  (passing  address  to  function)  สามารถทำได้  2  วิธี
            1) การส่งค่าข้อมูลไปยังฟังก์ชันที่ต้องการ  (passing  data  values  to  function)
การส่งค่าข้อมูล  1  ค่าหรือหลายค่าจากฟังก์ชันหนึ่งไปยังอีกฟังก์ชันหนึ่ง  คือการคัดลอกค่าข้อมูล  (duplicated  value)  จากที่หนึ่งไปยังอีกที่หนึ่ง
            2)  การส่งตำแหน่งของข้อมูลไปยังฟังก์ชัน  (passing  address  to  a  function)
การส่งตำแหน่งของข้อมูลไปยังฟังก์ชันที่ต้องการจะต้องใช้ตัวแปรพอยน์เตอร์มาช่วยในการเก็บตำแหน่งของข้อมูลที่ส่งมา
เพื่อความเข้าใจเกี่ยวกับการส่งค่าข้อมูลและตำแหน่งของข้อมูลไปยังฟังก์ชันที่ต้องการ  ให้ศึกษาโปรแกรมตัวอย่างดังต่อไปนี้
โปรแกรมตัวอย่างที่  6.3  แสดงการส่งค่าข้อมูลและตำแหน่งของข้อมูลไปยังฟังก์ชันที่ต้องการ


/*             passdata.c           */
#include<stdio.h>                                                                          /*  บรรทัดที่  1  */
#include<conio.h>                                                                         /*  บรรทัดที่  2  */
void f1(int, int);                  /* function prototype f1 */                   /*  บรรทัดที่  3  */
void f2(int*, int*);              /* function prototype f2 */                   /*  บรรทัดที่  4  */
void main(void)                                                                                /*  บรรทัดที่ 5  */
{                                                                                                           /*  บรรทัดที่  6  */
      int p=15, q=30;                                                                    /*  บรรทัดที่  7  */
      clrscr( );                                                                                 /*  บรรทัดที่  8  */
      f1(p,q);                   /* called f1() */                                      /*  บรรทัดที่  9  */
      f2(&p,&q);                             /* called f2() */                      /*  บรรทัดที่  10  */
      printf("\nPress any key back to program ...");                 /*  บรรทัดที่  11 */
      getch();                                                                                  /*  บรรทัดที่  12 */
} /* end main */                                                                                 /*  บรรทัดที่  13 */
void f1( int pp, int qq) {                                                                   /*  บรรทัดที่  14  */
      printf("P1 = %d\tQ1 = %d\n",pp,qq);                             /*  บรรทัดที่  15  */
}                                                                                                           /*  บรรทัดที่  16  */
void f2( int *pp, int *qq) {                                                               /*  บรรทัดที่  17  */
      *pp = *pp +20;                                                                   /*  บรรทัดที่ 18  */
      *qq = *qq +20;                                                                   /*  บรรทัดที่ 19  */
printf("P2 = %d\tQ2 = %d\n",*pp,*qq);                          /*  บรรทัดที่  20  */
}                                                                                                           /*  บรรทัดที่  21 */

ผลลัพธ์ที่ได้จากโปรแกรม
แผนผังลำดับงาน: จอภาพ: P1 = 15       Q1 = 30  P2 = 35       Q2 = 50    Press any key back to program…

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

 บรรทัดที่  3  คำสั่ง void f1(int, int);  เป็นการประกาศรูปแบบฟังก์ชัน  f1
บรรทัดที่  4  คำสั่ง void f2(int*, int*);  เป็นการประกาศรูปแบบฟังก์ชัน  f2
บรรทัดที่  คำสั่ง  f1(p,q);  การเรียกใช้งานฟังก์ชัน  f1  และส่งข้อมูลของตัวแปร  p  กับ  q  ไปยังฟังก์ชัน  f1( )  ซึ่งฟังก์ชัน  f1( ) อยู่คำสั่งบรรทัดที่  14  ถึง  16  
บรรทัดที่ 10 คำสั่ง  f2(&p,&q); การเรียกใช้งานฟังก์ชัน  f2  และส่งข้อมูลของตัวแปร  p  กับ  q  ไปยังฟังก์ชัน  f2( )  ซึ่งฟังก์ชัน  f2( ) อยู่คำสั่งบรรทัดที่  17  ถึง  21  
บรรทัดที่ 14 ถึง 16  เป็นฟังก์ชันที่ตัวแปรพอยน์เตอร์  pp,qq  จะรับค่าข้อมูลจากตัวแปร  p  และ  q  ที่ส่งมาให้จากจุดที่เรียกใช้งานในฟังก์ชัน  main( )  ตามลำดับ และแสดงค่าตัวแปรที่ตัวแปรพอยน์เตอร์  pp  และ  qq  รับค่ามาจากตัวแปร  p และ q  ออกที่จอภาพ
บรรทัดที่ 17 ถึง 21  เป็นฟังก์ชันที่ตัวแปรพอยน์เตอร์  pp,qq  จะรับค่าตำแหน่งของตัวแปร  p  และ  q  ที่ส่งมาให้จากจุดที่เรียกใช้งานในฟังก์ชัน  main( )  ตามลำดับ เมื่อรับค่าแล้วให้บวกเพิ่มค่าละ  20  หลังจากนั้นนำค่าที่ตัวแปรพอยน์เตอร์  pp  และ  qq  ชี้อยู่ แสดงออกจอภาพ
บรรทัดที่ 11 ถึง 12   ภายหลังจากฟังก์ชัน  f1( ) และ  f2( )  ทำงานเสร็จแล้วพิมพ์ข้อความให้กดคีย์ใด ๆ  เพื่อกลับเข้าสู่โปรแกรม  และหยุดรอรับค่าใด ๆ จากคีย์บอร์ด  เช่น  กด enter จะกลับเข้าสู่โปรแกรมตามลำดับ

            6.6.2  การคืนค่ากลับของฟังก์ชัน  (returning  data  from  functions)
                        โดยปกติการคืนค่ากลับมายังฟังก์ชันสามารถทำได้เพียง 1 ค่าเท่านั้น  แต่ในกรณีที่ต้องการให้มีการคืนค่ากลับหลายค่าต้องใช้พอยน์เตอร์มาช่วยจึงสามารถกระทำได้ โดยมีขั้นตอนดังนี้
            ขั้นตอนแรก ในโปรแกรมที่ใช้เรียกฟังก์ชัน (calling program) จะต้องใช้วิธีการส่งตำแหน่งของข้อมูลไปยังฟังก์ชัน  โดยใช้เครื่องหมาย & นำหน้าชื่อตัวแปรที่ต้องการส่งค่า  address  ไป
            ขั้นตอนที่สอง  ในฟังก์ชันที่ถูกเรียกใช้  จะต้องใช้ตัวแปรพอยน์เตอร์มารับค่า  address  ที่ส่งมาเมื่อต้องการคืนค่ากลับให้ใช้เครื่องหมาย  *  นำหน้าชื่อตัวแปรพอยน์เตอร์  เพื่อคืนค่ากลับมายังตัวแปรของฟังก์ชัน
เพื่อความเข้าใจเกี่ยวกับการคืนค่ากลับของฟังก์ชัน  ให้ศึกษาโปรแกรมตัวอย่างดังต่อไปนี้

โปรแกรมตัวอย่างที่  6.4  แสดงการคืนค่ากลับของฟังก์ชันที่มากกว่า  1  ค่า

/*             retudata.c             */
#include<stdio.h>                                                                        /*  บรรทัดที่  1  */
#include<conio.h>                                                                       /*  บรรทัดที่  2  */
void back(int* , int* );    /* function prototype back() */           /*  บรรทัดที่  3  */
void main(void)                                                                              /*  บรรทัดที่  4  */
{                                                                                                         /*  บรรทัดที่  5  */
      int a, b;                                                                                   /*  บรรทัดที่  6  */
      clrscr( );                                                                                 /*  บรรทัดที่  7  */
      back(&a,&b);        /* called back() */                                    /*  บรรทัดที่  8  */
      printf("A = %d, B = %d\n", a, b);                                        /*  บรรทัดที่  9  */
      printf("\nPress any key back to program ..."); /*  บรรทัดที่  10  */
      getch();                                                                                  /*  บรรทัดที่  11  */
} /* end main */                                                                               /*  บรรทัดที่  12  */
void back(int *aa, int *bb)                                                           /*  บรรทัดที่  13  */
{                                                                                                         /*  บรรทัดที่  14  */
      *aa=300;               /* assigned 300 passthru aa to a *//*  บรรทัดที่  15  */
      *bb=500;              /* assigned 500 passthru bb to b *//*  บรรทัดที่  16 */
}                                                                                                         /*  บรรทัดที่  17  */
ผลลัพธ์ที่ได้จากโปรแกรม

แผนผังลำดับงาน: จอภาพ: A = 300, B = 500    Press any key back to program…
คำอธิบายโปรแกรม 
            จากโปรแกรมตัวอย่างที่  6.4  สามารถอธิบายการทำงานของโปรแกรมที่สำคัญ ๆ  ได้ดังนี้

บรรทัดที่  3  คำสั่ง  void back(int*,int*);  เป็นการประกาศรูปแบบฟังก์ชัน  back
บรรทัดที่  8  ในฟังก์ชัน main( ) มีการเรียกใช้ฟังก์ชัน back(&a,&b); หมายถึงมีการส่งค่า  address  ของตัวแปร  a  และ  b  ไปยังตัวแปรพอยน์เตอร์  aa  และ  bb  ของฟังก์ชัน  back( )  ตามลำดับ ซึ่งฟังก์ชัน back( )  แสดงอยู่คำสั่งบรรทัดที่  13 ถึง 16  ซึ่งมีการใช้เครื่องหมาย  *  อยู่หน้าตัวแปรพอยน์เตอร์  aa  และ  bb  เพื่อบอกให้กำหนดค่าตัวเลข  300  และ  500  ให้กับตัวแปร  a  และ  b  เนื่องจากภายในตัวแปรพอยน์เตอร์ทั้งสองตัวได้เก็บค่า  address  แรกของตัวแปร  a  และ  b  ไว้แล้ว  จึงเหมือนกับการส่งค่ากลับ  2  ค่า  พร้อมกัน
บรรทัดที่  10 และ 11 ภายหลังจากทำงานฟังก์ชัน  back( )  เสร็จแล้ว
พิมพ์ข้อความให้กดคีย์ใด ๆ  เพื่อกลับเข้าสู่โปรแกรม  และหยุดรอรับค่าใด ๆ จากคีย์บอร์ด  เช่น  กด enter จะกลับเข้าสู่โปรแกรมตามลำดับ

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

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