pointer เป็นชนิดข้อมูลประเภทหนึ่งที่สร้างจากชนิดข้อมูลแบบพื้นฐานทั่วไป โดยชนิดข้อมูลแบบ pointer จะแตกต่างกับชนิดข้อมูลพื้นฐานตรงที่ชนิดข้อมูลแบบพื้นฐานจะเก็บและดึงข้อมูลจากตัวแปรโดยตรง แต่ชนิดข้อมูลแบบ pointer จะเก็บค่าที่อยู่(Address) ของตัวแปรอื่น และใช้ค่าที่อยู่นี้อ้างอิงไปยังข้อมูลที่เก็บอยู่ในตัวแปรนั้นอีกที เพื่อทําการเก็บและดึงข้อมูลจากตัวแปรนั้นอีกที
pointer เป็นตัวแปรชนิดหนึ่งดังนั้น มันจึงมีที่อยู่ในหนวยความจํา(Memory) เหมือนกับตัวแปรอื่นๆทั่วไป โดยตัวของ pointer นั้นหน้าที่หลักของมันคือ ชี้ไปยัง address ใดๆ เพื่อจัดการกับข้อมูลที่เก็บอยู่ใน address นั้นๆ ถ้าประกาศตัวแปร int a = 3; จะหมายถึง สร้างตัวแปรชนิด integer ชื่อว่า a และเก็บจํานวนเต็ม 3 ไว้ในตัวมัน แต่หากประกาศตัวแปร pointer ขึ้นมาใช้งาน จะกําหนดค่าเลขจํานวนเต็ม 3 ให้กับตัวแปรโดยตรงไม่ได้ เพราะอย่างที่กล่าวมาข้างต้นตัวแปร pointer เป็นเพียงแค่ตัวชี้ ดังนั้นเราจึงต้องกําหนด pointer ชี้ไปยังตัวแปร a ก่อน pointer จึงจะมีข้อมูลเท่ากับ 3
การประกาศตัวแปร pointer ขึ้นใช้งาน
รูปแบบการประกาศตัวแปร pointer คือ
ชนิดข้อมูล *ชื่อตัวแปรpointer
- ชนิดข้อมูล คือ ชนิดของข้อมูลที่ pointer จะชี้ หรืออ้างอิง
- ชื่อตัวแปรpointer คือ ชื่อของตัวแปร pointer ที่ต้องการ
ตัวอย่าง
int *p; //คือประกาศตัวแปร p เป็น pointer มีชนิดข้อมูลเป็นจํานวนเต็ม
char *p1; //คือประกาศตัวแปร p1 เป็น pointer มีชนิดข้อมูลเป็นตัวอักษร
float *p2; //คือประกาศตัวแปร p2 เป็น pointer มีชนิดข้อมูลเป็นเลขจํานวนเต็ม
หากประกาศตัวแปร pointer เป็นชนิดข้อมูลประเภทใดแล้ว ตัวแปร pointer จะต้องชี้ไปยังข้อมูลประเภทนั้น เช่น
int a = 100;
int *p1;
char b = 'Q'
char *p2;
p1 = &a;
p2 = &b;
การกําหนดค่าเริ่มต้นให้กับตัวแปร pointer
การประกาศตัวแปรขึ้นใช้งานนั้น ไม่ว่าจะเป็นการประกาศตัวแปรแบบพื้นฐาน ตัวแปรประเภทอาร์เรย์หรือตัวแปร pointer ก็ตาม ถ้าไม่ทําการกําหนดค่าเริ่มต้นให้กับตัวแปรเหล่านี้ ค่าที่ตัวแปรเก็บไว้ก็จะเก็บเป็นค่าขยะ ซึ่งไม่สามารถคาดเดาได้ว่าเป็นค่าอะไร เช่นถ้าประกาศ int *p; โดยไม่กําหนดค่าเริ่มต้นให้กับตัวมัน จะพบว่า p เก็บค่า address อะไรสักอย่างที่ไม่มีความหมาย คือเป็นค่าขยะนั่นเอง ดังนั้นเมื่อประกาศใช้งานตัวแปร pointer แล้วจําเป็นจะต้องกําหนดค่าเริ่มต้นให้กับมันด้วย หรือให้มันชี้ไปยัง address 0, NULL เช่น
int a = 20;
int *p1 = &a;
int *p2 = 0;
int *p3 = NULL;
สัญลักษณ์ที่ทําคัญในการทํางานกับ pointer
pointer มีสัญลักษณ์สําคัญอยู่ 2 ตัวคือ
- สัญลักษณ์ & หมายถึง ดึงเอาค่า address ของตัวแปรใดๆออกมา เช่นถ้าต้องการจะดึงค่า address ของตัวแปร a ออกมาสามารถเขียนได้ดังนี้ &a
- สัญลักษณ์ * หมายถึง ดึงเอาค่าข้อมูลที่แท้จริงที่ pointer นั้นๆชี้ไป
ตัวอย่างการใช้งาน pointer
#include <stdio.h>
int main () {
int a = 20; //ประกาศตัวแปร int แล้วกําหนดค่า 20
int *p; //สร้างตัวแปร pointer ประเภท int
p = &a; //กําหนดให้ pointer p ชี้ไปยัง address ของตัวแปร a
//แสดงผล address ของตัวแปร a
printf("Address of a variable: %x\n", &a );
//แสดงผล address ที่ pointer ชี้ไป ซึ่งก็คือ address ของตัวแปร a
printf("Address stored in p variable: %x\n", p);
//แสดงผลข้อมูลที่ pointer ชี้ไป
printf("Value of *p variable: %d\n", *p);
return 0;
}