Pointer
Author: Black Cat & Neighborhood's Cat
Pointer
Pointer หรือ ตัวชี้ ทำหน้าที่ชี้ ตามชื่อของมัน โดยก่อนอื่นเราต้องเข้าใจก่อนว่า ตัวแปรที่เรารู้จักทั้งหมดจากบทก่อนหน้านี้นั้น จะมีส่วนประกอบอยู่ 2 ส่วน คือ ค่าที่เก็บไว้ในตัวแปร หรือก็คือ ค่าที่เรารับค่าเข้ามา หรือกำหนดขึ้นมาแล้วนำไปใส่ไว้ในตัวแปร และ ค่าที่อยู่ ที่บ่งบอกถึงตำแหน่งที่ตัวแปรตัวนั้น ๆ อยู่ "บน RAM" โดยเราจะเข้าถึง "ที่อยู่" ที่ว่านี้ได้โดยการใส่เครื่องหมาย & หน้าชื่อตัวแปร และตัวชี้หรือ Pointer นี้ ก็คือประเภทของตัวแปรที่จะนำมาใช้เก็บ ค่าที่อยู่ นี้นั่นเอง
การประกาศตัวแปร Pointer
ทำได้เหมือนกันกับการประกาศตัวแปรทั่ว ๆ ไป โดยการพิมพ์ชนิดของตัวแปรก่อน แล้วตามด้วยชื่อของตัวแปร แต่แตกต่างที่ Pointer ไม่ได้มีชนิดของตัวแปรเป็นของตัวเอง เราจะทำการประกาศ Pointer ด้วยชนิดของตัวแปรที่ต้องการให้ Pointer นั้น ๆ ชี้ไปหา และใช้สัญลักษณ์ดอกจัน * นำหน้าชื่อ Pointer
ตัวอย่าง
การใช้งาน Pointer
เราสามารถเข้าถึง pointer ได้สองรูปแบบ คือ ค่าที่อยู่ ที่ถูกเก็บไว้ใน pointer และ ค่าที่เก็บไว้ในตัวแปรที่ถูกชี้
ในการเข้าถึงค่าที่อยู่ที่เก็บไว้ใน pointer นั้น เราจะเขียนชื่อของ pointer ได้โดยตรง
ตัวอย่าง
int integer, *pointer1;
pointer1 = &integer; // คือการตั้งค่าให้ pointer1 เก็บค่าที่อยู่ของ integer
int *pointer2;
pointer2=pointer; // ตั้งค่าให้ pointer2 ชี้ไปที่ตัวแปรเดียวกันกับ pointer1
ในส่วนของการแสดงค่าของตัวแปรที่ถูกชี้ เราจะทำได้โดยการใช้เครื่องหมาย * นำหน้าชื่อ pointer
ตัวอย่าง
int a=3, b=5, *pointer1, *pointer2;
pointer1=&a;
pointer2=&b;
int c=*pointer1+*pointer2;
cout << c;
// จะเห็นว่าโปรแกรมจะแสดงค่า 8 ซึ่งคือค่าของ a+b
Pointer and Array
ในการประกาศตัวแปรทั่ว ๆ ไป ตัวแปรที่สร้างขึ้นมาจะอยู่กระจัดกระจายกันใน RAM ทำให้ค่าที่อยู่ของตัวแปรแต่ละตัวไม่ได้เรียงต่อเนื่องกัน
ยกเว้น ตัวแปรที่ประกาศในรูปแบบของ array ที่การจองพื้นที่ข้อมูลจะอยู่ต่อเนื่องกัน ทำให้เราสามารถใช้การเพิ่มหรือลดค่าของ pointer เพื่อเข้าถึงตำแหน่งของข้อมูลได้โดยตรง
ตัวอย่าง
int a[]={1,2,3,4,5}, *pointer;
pointer=&a[0];
pointer+=3;
cout << *pointer;
// จะเห็นว่าโปรแกรมจะแสดงค่า 4 ซึ่งคือค่าของ a[3]
คำแนะนำ
- เราสามารถสร้าง pointer ของตัวแปรได้ทุกชนิด รวมถึง struct ด้วย ซึ่งเราสามารถ Access Value ของ Struct ได้โดยใช้
->แทน.เช่น - ไม่ว่าตัวแปรที่ชี้จะขนาดใหญ่แค่ไหน ขนาดของ pointer จะมีขนาดเท่ากันเสมอ ขึ้นอยู่กับระบบปฏิบัติการที่ใช้ในการ run เนื่องจากถ้าระบบปฏิบัติการใหญ่ขึ้น ค่าที่ใช้ในการแทนตำแหน่งของตัวแปรต่าง ๆ ก็จะละเอียดขึ้นด้วย
หมายเหตุ
- pointer ที่ประกาศภายใต้ชนิดตัวแปรไหน จะชี้ได้แค่ตัวแปรชนิดนั้น ไม่สามารถนำไปชี้ตัวแปรที่ชนิดไม่ตรงกันได้ เช่น
char *ptr;จะใช้ชี้ได้แค่ตัวแปร char หรือค่าใน array ที่เป็น char เท่านั้น ไม่สามารถนำไปชี้ตัวแปร int ได้