Just another WordPress.com site

Pointer ใน C++

ในการการเก็บข้อมูลทุกประเภทในคอมพิวเตอร์ จะมีการจองหน่วยความจำก่อนเสมอ

เช่น ถ้าเราสั่ง

int x=10;

คอมพิวเตอร์จะจองหน่วยความจำที่ใช้เก็บข้อมูล x=10 ไว้ให้เรา

ว่าแต่ว่าไอ้ตำแหน่งของของหน่วยความจำนี้อยู่ที่ไหนล่ะ??

เราสามารถดูได้ตำแหน่งที่เก็บข้อมูล x=10 ได้โดยใช้ address operator –>& ดังตัวอย่างต่อไปนี้

เราจะเรียกชนิดของข้อมูลที่เราใช้เก็บตำแหน่ง(address) ว่า pointer

โดยทั่วไปในการใช้ pointer เรามักจะมองมันในรูปของตัวชี้ มากกว่ามองในรูปของ address ดังภาพ ซึ่งจะทำให้การมุมมองดูง่ายขึ้น

เราสามารถสร้าง pointer ขึ้นมาเองได้ โดยใช้คำสั่งดังนี้

ชนิดของข้อมูลที่ต้องการชี้ * ชื่อของ pointer

เช่นสมมติว่าเราต้องการสร้าง pointer ชื่อว่า p ให้ชี้ไปยังข้อมูลชนิด int เราจะสั่งดังนี้

int* p;

ตัว pointer p นั้นจะยังใช้งานไม่ได้ จนกว่าเราจะสั่งให้มันชี้ไปที่ตัวแปรชนิด int

สมมติว่าเราต้องการสั่งให้ p ชี้ไปที่เก็บตัวแปร x เราจะเขียนคำสั่ง

p=&x

เราอาจจะอ่านคำสั่งนี้ว่า “กำหนดให้ p ชี้ไปยัง address ของ x” ก็ได้นะครับ ซึ่งเราจะได้ผลลัพธ์ที่ว่า p กับ &x ชี้ไปที่เดียวกันดังรูป

ในการจะเรียกดูข้อมูลที่เก็บอยู่ในตำแหน่งที่ p ชี้ไป เราสามารถใช้คำสั่ง *p ดังตัวอย่างต่อไปนี้


ทีนี้เราลองมาทดสอบเล่นๆ สมมติว่าเราเปลี่ยนค่าของ x=10 เป็น x=20 ดังรูป

เราจะเห็นว่าค่า *p ก็เปลี่ยนเป็น 20 ด้วยดังนี้

ที่นี้สมมติว่าเราลองเปลี่ยนค่าจาก *p ดู โดยกำหนดค่าให้ *p=80 ดังรูป

เราจะได้ว่าค่าของ x ก็จะเปลี่ยนเป็น 80 ด้วยดังรูป

ถ้าเราฟังก์ชันที่มี input เป็น pointer ค่าที่เปลี่ยนไปของของข้อมูลที่ pointer นั้นๆชี้ไป จะส่งผลต่อการเปลี่ยนแปลงของ global variable ด้วยนะครับ

ตัวอย่างเช่น

เนื่องจาก p ชี้ไปยัง x ทำให้การเปลี่ยนแปลงค่า *p จะส่งผลต่อการเปลี่ยนแปลงของค่า x ด้วยครับ

เมื่อเรารันโปรแกรมเราจะได้ผลลัพธ์ดังรูป

สำหรับตัวอย่างสุดท้ายใน blog นี้ จะเป็นตัวอย่างการสร้างฟังกชันที่ทำการสลับค่าตัวแปร 2 ตัว โดยการรับค่า input เป็น pointer ครับ

เมื่อทำการรันเราจะได้ผลลัพธ์ดังนี้ครับ

ส่งท้าย ตัวแปร pointer นี่จะเป็นตัวแปรที่สร้างความปวดหัวให้กับโปรแกรมเมอร์มากพอสมควรเลยล่ะครับ ในภาษาระดับสูงบางภาษา เช่น ภาษา Java จะมีตัวจัดการเกี่ยวกับเรื่อง pointer ให้เราที่ชื่อว่า gabage collection ทำให้โปรแกรมเมอร์ไม่ต้องปวดเกี่ยวกับ pointer แต่มันก็ java ทำงานหนักขึ้น ทำงานช้าขึ้น เมื่อเทียบกับ C++ ด้วยครับ…. จินตนาการง่ายๆนะครับ สมมติว่าเราต้องการเอาขยะจากหลังบ้านไปทิ้งหน้าบ้าน ถ้าเป็น C++ เราจะนำไปทิ้งได้ทันที แต่ถ้าเราใช้ java เราจะต้องโทรเรียกรถเก็บขยะมาก่อนเสมอ แล้วให้รถเก็บขยะขนขยะจากหลังบ้านไปทิ้งหน้าบ้าน

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: