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