สวัสดีครับ มาในบทที่ 4 มาในบทนี้เรามาเริ่ม Pointer แบบจริงจังซะที ! ในบทนี้เราจะมาทำความเข้าใจกับ & (Ampersand) Address Operator และ * (Asterisk) Dereferencing Operator กันครับ
Copy Source Code
#include <stdio.h>
int main()
{
int a = 1;
int *ptr_a = &a;
printf("Data in Variable a : %d",a);
printf("Size of Variable a : %zu",sizeof(a));
printf("Size of Variable int : %zu",sizeof(int));
printf("Address of Variable a : %p", &a);
printf("");
printf("Data in Variable ptr_a : %p",ptr_a);
printf("Data in Variable ptr_a : %d",*ptr_a);
printf("Size of Variable ptr_a : %zu",sizeof(ptr_a));
printf("Address of Variable ptr_a : %p", &ptr_a);
printf("");
return 0;
}
ผลการ Run ด้วย Dev-C++ ในคอม
การสร้างตัวแปรชนิด Pointer
ชนิดข้อมูล *ชื่อตัวแปร;
ตัวอย่าง
int *ptr_a;
การ ประกาศตัวแปร (Variable Declaration) ชนิด Pointer ต้องมี * (Asterisk) หน้าชื่อของตัวแปร เมื่อใส่แล้วตัวแปรนั้นจะกลายเป็นตัวแปรชนิด Pointer สามารถเก็บ Address ของตัวแปรที่มีข้อมูลชนิดเดียวกันได้
อย่างในตัวอย่าง int *ptr_a; คือการสร้างตัวแปรชื่อ ptr_a สามารถเก็บ Address ของตัวแปรอื่นที่เป็นชนิดข้อมูล int (จำนวนเต็ม) ได้ นั่นเอง
การดึง Address ของตัวแปร เอามาใส่ในตัวแปรชนิด Pointer ด้วย & (Ampersand) Address Operator
ชนิดข้อมูล *ชื่อตัวแปร = &ชื่อตัวแปร;
ตัวอย่าง
int a = 1;
int *ptr_a = &a;
เมื่อตัวแปรชนิด Pointer สามารถเก็บข้อมูลที่เป็นชนิด Address ได้ คุณจึงสามารถดึง Address ของตัวแปรอื่นด้วย & (Ampersand) Address Operator แล้วนำ Address นั้นมาเก็บในตัวแปรชนิด Pointer ได้ !
ซึ่งถ้าแปลคำว่า Pointer มันแปลว่าตัวชี้ เพราะฉะนั้นตัวแปร Pointer จึงเปรียบเสมือนว่าเก็บตัวชี้ไปยัง Address ตรงไหนนั่นเอง !
อธิบาย Source Code เพิ่มเติม
printf("Data in Variable ptr_a : %p",ptr_a);
//แสดงผลค่าในตัวแปร ptr_a ซึ่งจะเก็บ Address ของ a เอาไว้ ใช้ %p ในการแสดงผล
printf("Data in Variable ptr_a : %d",*ptr_a);
//แสดงผลค่าที่ตัวแปร ptr_a ชี้อยู่ ซึ่งชี้ไปยังตำแหน่ของ a ใช้ %d ในการแสดงผลค่าในตัวแปร a
printf("Size of Variable ptr_a : %zu",sizeof(ptr_a));
// Function sizeof(ตัวแปร) ใช้สำหรับ หาขนาดของตัวแปรว่าตัวแปรนั้นกี่ Bytes ใช้ %zu ในการแสดงผล
printf("Address of Variable ptr_a : %p", &ptr_a);
// & Ampersand Operator ถ้าใส่หน้าตัวแปร จะเป็นการดึง Address ของตัวแปรนั้นออกมา ! ใช้ %p ในการแสดงผล
* (Asterisk) Dereferencing Operator คืออะไร ?
* (Asterisk) Dereferencing Operator คือตัวดำเนินการหนึ่งที่เขียนไว้ หน้าตัวแปร (คนละอันกับตอนประกาศตัวแปร Pointer นะครับ แค่ใช้เครื่องหมายเดียวกัน ถ้าใช้ * ตอนประกาศจะเป็นการสร้างตัวแปร Pointer) ซึ่งตัวดำเนินการนี้ การทำงานของมันให้คุณนึกถึงการ [ ไปเอาค่าที่ถูกชี้มาใช้ ] หรือผมนึกได้อีกคำหนึ่งคือ [ ปลดการอ้างอิง ] ลองดูตัวอย่างในรูปครับ
อธิบาย Source Code เพิ่มเติม
เรียบร้อยครับ ! บทนี้ค่อนข้างอธิบายยาวนิดนึง ! เพราะเป็นพื้นฐานสำคัญของการใช้งาน Pointer เลย ก็ว่าได้ ! ถ้าไม่เข้าใจตรงไหนก็ลองเข้ามาสอบถามใน Page https://www.facebook.com/tutortongpage ได้เลยครับ
ส่วนถ้าใครสนใจเรียนเขียนโปรแกรม ภาษา C , C++ , Python หรืออื่นๆ ทั้งแบบออนไลน์คลิป และ ออนไลน์สด จะเรียนพื้นฐาน หรือ ติวสอบ สามารถสอบถามเข้ามาใน Page ได้เช่นกันครับ
เขียนโปรแกรม ไม่ยาก ถ้าเข้าใจหลักการทำงาน !