Pointer in C

บทความนี้เขียนเพื่อช่วยอธิบายบางคนที่ยังงงในเรื่อง pointer

Pongsatorn Manusopit
2 min readMar 6, 2017

หลายครั้งที่โปรแกรมเราต้องบัคเพราะชี้ pointer มัว หรือเขียนโปรแกรมไปทั้งๆที่ยังไม่เข้าใจว่าทำไมบางครั้ง ใช้ * บางครั้ง **

จะขอข้าม pointer พื้นฐานไปนะครับจะอธิบาย pointer ที่ใช้ใน link list บทความที่แล้ว

เริ่มด้วยเราจะใช้ struct เดียวกันกับ link list ที่แล้วเลย

สมมุติว่าเรา run code ดังนี้

NODE *p,block;
p=█
p->value=10;
p->nextnode=NULL;

โดยเราให้ pointer p เราชี้ไปที่ address ของ block แล้วก็กำหนดค่าผ่าน pointer

หน้าตาโดยคร่าวๆก็จะเป็นแบบนี้ซึ่งเวลาเราต้องการแก้ไขค่าต่างๆเราสามารถทำผ่าน pointer ได้ปกติ

function(p);

การที่เรากำหนด function ให้ส่ง *p ทำให้ function เราสามารถแก้สิ่งที่อยู่ใน address ที่ส่งมาได้
แต่ใน การทำ link list ในบางครั้งเราจำเป็นต้องแก้ไขตัว pointer ที่เป็นหัวด้วย
ในกรณีนี้เราไม่สามารถไปแก้ได้เพราะเราต้องแก้ไขค่า pointer p แต่สื่งที่แก้ได้มีเพียว address ที่ p ชี้ไปเท่านั้น

function(&p);

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

Core dump

เขียน link list บน linux คงคุ้นเคยกับคำนี้ดี ไม่ core dump
ส่วนมากนั้น core dump มันเกินจากการพยายามดึงข้อมูลจาก address ที่ไม่มีอยู่
ควรตรวจสอบทุกกรณีแล้วหากรณีที่มีปัญหาออกมาแก้

ผลลัพธ์ไม่ถูกต้อง

บางครั้งทำ pointer ก็สับสนกันบางจะขอยกตัวอย่างซึ่งพึ่งเกิดต้องเขียนบทความ link list

จากที่เขียนตอนนั้นก็คิดไว้ประมาณว่าถ้าไม่มีอะไรก็ให้ node ใหม่ไปเลยถ้ามี node อยู่แล้วก็ขยับไปให้สุดแล้วเอา node ใหม่ต่อท้าย
ลองรันดู ก็เหมือนจะปกติดี

createnode(&head,10);
createnode(&head,20);

จากการ run ไปแล้ว แสดงผลก็ปกติดี (10->20) แต่พอใส่ค่าไปเยอะๆมันดันแสดงแค่สองตัวสุดท้าย
เหตุผลก็เพราะต้องที่ขยับไปตัวสุดท้ายนั้นได้ใช้ address ของ pointer head มาขยับทำให้หัวมันขยับไปตลอด

ดังนั้นจึงแก้โดยสร้างตัวแปร pointer tmp มาเก็บ pointer แล้วค่าเลื่อนจาก tmp เอาหัวจะได้ไม่ขยับ

หวังว่าจะช่วยให้หายสงสัยเรื่อง pointer ได้นะครับ

--

--

No responses yet