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

06:50
6.10  พอยน์เตอร์ทูพอยน์เตอร์  (indirect  pointer  หรือ  pointer  to  pointer)  

            indirect  pointer  คือ  ตัวแปรพอยน์เตอร์ที่เก็บตำแหน่งของตัวแปรพอยน์เตอร์อีกตัวหนึ่งเอาไว้

กล่องข้อความ:   type  **pptrname;   หรือ    type  **pptname1, **pptrname2, …;

            การประกาศตัวแปรพอยน์เตอร์ทูพอยน์เตอร์  มีรูปแบบดังนี้

โดยที่

type  คือ  ชนิดของตัวแปรพอยน์เตอร์ทูพอยน์เตอร์  ซึ่งอาจจะเป็นชนิด  int, char,  float, double  ก็ได้
pptrname  คือ  ชื่อตัวแปรพอยน์เตอร์ทูพอยน์เตอร์  ต้องใช้เครื่องหมาย  **  (double  asterisk)  นำหน้าชื่อเสมอ  หากตัวแปรพอยน์เตอร์ทูพอยน์เตอร์มากกว่า  1  ตัว  ให้คั่นด้วยเครื่องหมาย  ,  (comma)  ระหว่างชื่อตัวแปรแต่ละตัว
ตัวอย่างที่  6.4  แสดงการประกาศ  pointer  to  pointer
int  **pptrx;
float  **ppx,  **ppy,  **ppz;

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

/*             pptr1.c                   */
#include<stdio.h>                                                                              /*  บรรทัดที่  1  */
#include<conio.h>                                                                             /*  บรรทัดที่  2  */
void main(void)                                                                                    /*  บรรทัดที่  3  */
{                                                                                                        /*  บรรทัดที่  4  */
      int a=50, b=80;                                                                    /*  บรรทัดที่  5  */
      int *pa, *pb;                                                                          /*  บรรทัดที่  6  */
      int **ppa, **ppb;                                                                 /*  บรรทัดที่  7  */
      clrscr( );                                                                                 /*  บรรทัดที่  8  */
      pa=&a; pb=&b;                                                                 /*  บรรทัดที่  9  */
      ppa=&pa;   ppb=&pb;                                                      /*  บรรทัดที่  10  */
      printf("A = %d, B = %d\n", **ppa, **ppb);                      /*  บรรทัดที่  11  */
      printf("\nPress any key back to program ..."); /*  บรรทัดที่  12  */
      getch();                                                                                  /*  บรรทัดที่  13  */
}                                                                                              /*  บรรทัดที่  14  */

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

แผนผังลำดับงาน: จอภาพ: A = 50, B = 80    Press any key back to program...
คำอธิบายโปรแกรม

บรรทัดที่  6  คำสั่ง int *pa, *pb;  ประกาศตัวแปรพอยน์เตอร์ชนิด  int  ชื่อ  pa และ pb
บรรทัดที่ 7คำสั่ง int **ppa, **ppb; ประกาศตัวแปร indirect pointer ชื่อ ppa และ ppb
บรรทัดที่  9 และ 10  สามารถอธิบายการทำงานได้ดังรูปที่  6.5 
 

รูปที่  6.5  แสดงการทำงานของตัวแปร  pointer  และ  indirect  pointer
บรรทัดที่  11 พิมพ์ค่าที่ตัวแปร  ppa  และ ppb  ชี้อยู่แสดงออกจอภาพ
บรรทัดที่  12 ถึง 13  พิมพ์ข้อความให้กดคีย์ใด ๆ  เพื่อกลับเข้าสู่โปรแกรม  และหยุดรอ รับค่าใด ๆ จากคีย์บอร์ด  เช่น  กด enter จะกลับเข้าสู่โปรแกรมตามลำดับ
ข้อสังเกต  ในการพิมพ์ค่าตัวแปร  indirect  pointer  ชี้อยู่
            1) ถ้าตัวแปร    indirect  pointer    ชี้อยู่ที่ตัวแปร    int, float, char(sigle character) ต้องใช้เครื่องหมาย  **  นำหน้าชื่อ  indirect  pointer  เสมอ  จึงจะได้ค่าออกมา  เช่น  คำสั่ง  printf(“%c”,**pptr);  เมื่อ pptr เป็นตัวแปร indirect  pointer
            2) แต่ถ้า  indirect  pointer  ชี้ไปที่ตัวแปรสตริง  ให้ใช้เครื่องหมาย  *  นำหน้าชื่อก็เพียงพอแล้ว  เช่น  คำสั่ง  printf(“%s”,*pptr); 
โปรแกรมตัวอย่างที่  6.12  แสดงการใช้  pointer to pointer กับตัวแปรชนิดสตริง

/*             pptr2.c      */
#include<stdio.h>                                                                              /*  บรรทัดที่  1  */
#include<conio.h>                                                                             /*  บรรทัดที่  2  */
void main(void)                                                                                    /*  บรรทัดที่  3  */
{                                                                                                       /*  บรรทัดที่  4  */
      char str[80], *ps, **ptps;                                                    /*  บรรทัดที่  5  */
      clrscr( );                                                                                 /*  บรรทัดที่  6  */
      ps=&str[0];                                                                            /*  บรรทัดที่  7  */
      ptps=&ps;                                                                             /*  บรรทัดที่  8  */
      printf("Enter your string : ");                                                /*  บรรทัดที่  9  */
      gets(str);                                                                                /*  บรรทัดที่  10  */
      printf("%s\n", *ptps);                                                            /*  บรรทัดที่  11  */
      printf("\nPress any key back to program ..."); /*  บรรทัดที่  12  */
      getch();                                                                                  /*  บรรทัดที่  13  */
}                                                                                               /*  บรรทัดที่  14  */
ผลลัพธ์ที่ได้จากโปรแกรม

แผนผังลำดับงาน: จอภาพ: Enter your string : sakhonnakorn  Sakhonnakorn    Press any key back to program...

คำอธิบายโปรแกรม
บรรทัดที่ 5  คำสั่ง char str[80], *ps, **ptps;  ประกาศตัวแปรอะเรย์ชื่อ str, ตัวแปรพอยน์เตอร์ชื่อ  ps และตัวแปร  indirect pointer ชื่อ ptps ซึ่งทั้งหมดเป็นชนิด char
บรรทัดที่   คำสั่ง  ps=&str[0]; กำหนด  address แรกของตัวแปร str[0] ให้กับตัวแปร ps หรือใช้คำสั่ง ps = str; ก็ได้
บรรทัดที่  คำสั่ง  ptps = &ps;  ทำงานเหมือนกับคำสั่งบรรทัดที่ 10 ในโปรแกรมตัว อย่างที่  6.11 คือ ให้ ptps ชี้ไปยัง  address ของตัวแปรพอยน์เตอร์ ps
บรรทัดที่  9 และ 10  รับข้อความที่ผู้ใช้เติมมาเก็บไว้ที่ตัวแปร str
บรรทัดที่  11  แสดงข้อความ ที่ตัวแปร  ptps ชี้อยู่ออกจอภาพ
บรรทัดที่  12 และ 13  พิมพ์ข้อความให้กดคีย์ใด ๆ  เพื่อกลับเข้าสู่โปรแกรม  และหยุดรอ รับค่าใด ๆ จากคีย์บอร์ด  เช่น  กด enter จะกลับเข้าสู่โปรแกรมตามลำดับ

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

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