Skip to content

Pointer

Author: Black Cat & Neighborhood's Cat


Pointer

Pointer หรือ ตัวชี้ ทำหน้าที่ชี้ ตามชื่อของมัน โดยก่อนอื่นเราต้องเข้าใจก่อนว่า ตัวแปรที่เรารู้จักทั้งหมดจากบทก่อนหน้านี้นั้น จะมีส่วนประกอบอยู่ 2 ส่วน คือ ค่าที่เก็บไว้ในตัวแปร หรือก็คือ ค่าที่เรารับค่าเข้ามา หรือกำหนดขึ้นมาแล้วนำไปใส่ไว้ในตัวแปร และ ค่าที่อยู่ ที่บ่งบอกถึงตำแหน่งที่ตัวแปรตัวนั้น ๆ อยู่ "บน RAM" โดยเราจะเข้าถึง "ที่อยู่" ที่ว่านี้ได้โดยการใส่เครื่องหมาย & หน้าชื่อตัวแปร และตัวชี้หรือ Pointer นี้ ก็คือประเภทของตัวแปรที่จะนำมาใช้เก็บ ค่าที่อยู่ นี้นั่นเอง

การประกาศตัวแปร Pointer

ทำได้เหมือนกันกับการประกาศตัวแปรทั่ว ๆ ไป โดยการพิมพ์ชนิดของตัวแปรก่อน แล้วตามด้วยชื่อของตัวแปร แต่แตกต่างที่ Pointer ไม่ได้มีชนิดของตัวแปรเป็นของตัวเอง เราจะทำการประกาศ Pointer ด้วยชนิดของตัวแปรที่ต้องการให้ Pointer นั้น ๆ ชี้ไปหา และใช้สัญลักษณ์ดอกจัน * นำหน้าชื่อ Pointer

ตัวอย่าง

int integer; // นี่คือการประกาศตัวแปร int ทั่วไป

int *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;
printf("%d",c);

// จะเห็นว่าโปรแกรมจะแสดงค่า 8 ซึ่งคือค่าของ a+b

Pointer and Array

ในการประกาศตัวแปรทั่ว ๆ ไป ตัวแปรที่สร้างขึ้นมาจะอยู่กระจัดกระจายกันใน RAM ทำให้ค่าที่อยู่ของตัวแปรแต่ละตัวไม่ได้เรียงต่อเนื่องกัน

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

ตัวอย่าง

int a[]={1,2,3,4,5}, *pointer;
pointer=&a[0];

pointer+=3;

printf("%d",*pointer);
// จะเห็นว่าโปรแกรมจะแสดงค่า 4 ซึ่งคือค่าของ a[3]

คำแนะนำ

  • เราสามารถสร้าง pointer ของตัวแปรได้ทุกชนิด รวมถึง struct ด้วย ซึ่งเราสามารถ Access Value ของ Struct ได้โดยใช้ -> แทน . เช่น
    struct struct_name A, *pointer; // ประกาศ struct ชื่อ A และ pointer
    pointer = &A; // ให้ pointer ชี้ไปที่ A
    printf("%d\n", pointer->var_1); // ส่งออกค่า var_1 ของ A
    
  • ไม่ว่าตัวแปรที่ชี้จะขนาดใหญ่แค่ไหน ขนาดของ pointer จะมีขนาดเท่ากันเสมอ ขึ้นอยู่กับระบบปฏิบัติการที่ใช้ในการ run เนื่องจากถ้าระบบปฏิบัติการใหญ่ขึ้น ค่าที่ใช้ในการแทนตำแหน่งของตัวแปรต่าง ๆ ก็จะละเอียดขึ้นด้วย

หมายเหตุ

  • pointer ที่ประกาศภายใต้ชนิดตัวแปรไหน จะชี้ได้แค่ตัวแปรชนิดนั้น ไม่สามารถนำไปชี้ตัวแปรที่ชนิดไม่ตรงกันได้ เช่น char *ptr; จะใช้ชี้ได้แค่ตัวแปร char หรือค่าใน array ที่เป็น char เท่านั้น ไม่สามารถนำไปชี้ตัวแปร int ได้