วันพฤหัสบดีที่ 22 กันยายน พ.ศ. 2554

Array และ Pointer

สวัสดีครับ วันนี้ผมจะเขียนเรือง แนวคิดเกี่ยวกับ Array และ Pointer ครับ

         เนื่องจากมีหลายๆคนสงสัย และมองว่ามันยาก ในการจัดการเกี่ยวกับ Array แล้วก็งงกับ มันไปเกี่ยวอะไรกับ Pointer อีก

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

Pointer and Address
    โดยทั่วไปหน่วยความจำ(Memory)ของคอมพิวเตอร์ นั่นจะเป็นช่อง(ในมุมมองของ logical view)ที่ถูกระบุหมายเลขที่อยู่(Address)เอาไว้เรียงต่อกัน โดยช่องต่างๆเหล่านี้ สามารถถูกนำมาใช้อย่างเดี่ยวๆ หรือ นำมาใช้อย่างเป็นกลุ่มๆ ก็ได้ เช่น ชนิดตัวแปรอักขระ(char) สามารถแทนได้ด้วย Memory cell 1 ไบท์, ชนิดตัวแปรสั้น(short) สามารถแทนได้ด้วย Memory cell จำนวน 2 ไบท์(a pair of one-byte cell) หรือ Memory cells จำนวน 4 ไบท์ ติดกันใช้แทนชนิดข้อมูล Integer หรือ long 
    Pointer คือ กลุ่มของ Memory cells ที่ใช้เก็บ Address
    ถ้าให้ ตัวแปร c เป็น char และ ตัวแปร p เป็น Pointer ที่ชี้มายัง c แล้วเราสามารถแทนเหตุการณ์แบบนี้ด้วยรูปภาพด้านล่าง

& เป็น Unary Operator ที่ใช้ในการดึง Address ของวัตถุหนึ่ง ดังนั้น code ที่ใช้แทนเหตุการณ์ด้านบนคือ
p = &c; // assigns the address of c to the variable p ,and p is said point to c

*คือ indirection หรือ dereferencing operator เมื่อ apply operator นี้กับ pointer นั่นคือ การเข้าถึงวัตถุภายในหน่วยความจำที่ Pointer ตัวที่ถูก Apply * ชี้อยู่

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