Using Pointer การใช้งานของ POINTER

Pointer คือตัวแปรแบบหนึ่งในภาษา C โดยใช้เป็นตัวอ้างอิงตำแหน่งให้กับตัวแปรปกติ หรือ
มองอีกนัยหนึ่ง ก็เป็นอ้างอิงตำแหน่งไปยังหน่วยความจำของระบบด้วย พื้นฐานของการใช้ Pointers
เพื่อการอ้างอิง สามารถอธิบายได้จากตัวอย่างต่อไปนี้

unsigned char *ptr;
unsigned char table[10];

ptr = &table[5];
*ptr = 123;

กำหนดให้ตัวแปร ptr เป็น Pointers (กำหนด * นำหน้าแสดงความเป็น Pointers)
โดยจะใช้อ้างอิงตำแหน่งหรือชี้ไปยังตัวแปรที่เป็น char และกำหนดให้ตัวแปร table เป็น array
ของ char จำนวน 10 Byte เมื่อจะกำหนดตำแหน่งให้ ptr ก็ทำได้ด้วยคำสั่ง ptr = &table[5];
เครื่องหมาย & คือให้ชี้ไปยัง table ตำแหน่งที่ 5 จากนั้นคำสั่ง *ptr = 123; ก็คือการใส่ข้อมูลค่า 123
ไปไว้ที่ที่ ptr ชี้อยู่ ซึ่งในที่นี้ก็คือ table[5] นั่นเอง

Pointers ในภาษา C สำหรับ MCS-51 นั้น จะแบ่งได้เป็น 2 แบบดังนี้

1. Generic Pointers
เป็น Pointers แบบเดียวกับที่ใช้ในภาษา C ทั่ว ๆ ไป ซึ่งจะใช้พื้นที่หน่วยความจำในการเก็บ
3 Byte โดย Byte แรกจะเก็บลักษณะของหน่าวความจำที่ใช้ ส่วน 2 Byte ต่อไปจะเก็บ
ตำแหน่งของ Pointers … การประกาศตัวแปรจะทำได้เหมือนดังตัวอย่างแรกที่แสดงไว้
Pointers แบบนี้จะทำงานได้ไม่เร็วนัก และค่อนข้างจะเปลืองพื้นที่ในการเก็บ แต่ก็ใช้งานได้ง่าย
และรูปแบบภาษาก็เป็นมาตรฐานทั่วไป

2. Memory-specific Pointers
เป็น Pointers ที่กำหนดแบบของหน่วยความจำให้ชัดเจนไปด้วย ว่าจะให้ชี้ไปยังตัวแปรที่
หน่วยความจำใด ซึ่งจะทำให้ตัวแปลภาษา C สามารถใช้รูปแบบตายตัวไปได้เลย และจะทำ
ประหยัดพื้นที่ในการเก็บ Pointers คือจะใช้เพียง 1 Byte สำหรับ Pointers ที่ชี้ไปยังพื้นที่
idata, data, bdata, pdata และใช้ 2 Byte สำหรับ Pointers ที่ชี้ไปยังพื้นที่ code,
xdata ตัวอย่างเช่น

char data *str;
คือ Pointers ที่ชี้ไปยังตัวแปร string (หรือ array ของ char) ในพื้นที่ data

int xdata *numtab;
คือ Pointers ที่ชี้ไปยังตัวแปร int ในพื้นที่ xdata

Pointers แบบนี้จะทำงานได้เร็วกว่า Generic Pointers และมีความเหมาะสมกับงาน
ทางด้านไมโครคอนโทรลเลอร์เป็นอย่างดี แต่ขณะเดียวกับตัวโปรแกรมที่เขียน ก็มีความ
เฉพาะเจาะจงสำหรับ MCS-51 เช่นกัน รวมทั้งต้องระวังไม่ให้สับสนในการใช้งานด้วย
เน้น … พื้นที่ที่เรากำหนดลงไปนั้น เป็นพื้นที่ที่ตัว Pointers จะชี้ไป ไม่ใช่พื้นที่ในการเก็บ
Pointers แต่ขณะเดียวกัน เราก็สามารถกำหนดพื้นที่ที่เก็บ Pointers ได้ด้วย ตัวอย่างเช่น

char data *xdata str;
คือ Pointers ที่ชี้ไปยังตัวแปร string ในพื้นที่ data โดยที่ตัว Pointers เก็บอยู่ที่ xdata

long code *idata powtab;
คือ Pointers ที่ชี้ไปยังตัวแปร long ในพื้นที่ code โดยที่ตัว Pointers เก็บอยู่ที่ idata

ตัวอย่างการใช้งาน …

char xdata *px;
char a;
ประกาศให้ px คือ Pointers ที่ชี้ไปยังตัวแปร char ในพื้นที่ xdata
และประกาศให้ a เป็นตัวแปรแบบ char

px = 0x8003;
กำหนดให้ px มีค่าเป็น 0x8003 (สังเกตุว่าไม่ได้ใส่เครื่องหมาย *) และค่าที่กำหนด
สามารถใส่ข้อมูลขนาด 16 บิทได้ ตามลักษณะของพื้นที่ xdata

a = *px;
อ่านค่าจาก xdata ตำแหน่ง 0x8003 มาไว้ที่ a

*px = 0xa5;
เขียนค่า 0xa5 ลงไปยัง xdata ตำแหน่ง 0x8003

px++;
เพิ่มค่าใน px ซึ่งชี้ตำแหน่ง 0x8003 อีก 1 โดยจะมีค่าเป็น 0x8004

(*px)++;
เพิ่มค่าใน xdata ตำแหน่ง 0x8004 อีก 1

การใช้งาน Pointers นอกจากจะใช้อ้างอิงตำแหน่งของตัวแปรต่าง ๆ แล้ว ยังประยุกต์ใช้กับการเข้าถึง
หน่วยความจำของแต่ละส่วนได้อย่างสะดวก เช่น การอ่านและเขียนค่าในหน่วยความจำ Data memory
ซึ่งอาจจะเป็น Input/Output ที่จัดไว้ในรูปแบบ Memory map ก็ได้ หรือการอ่านค่าจากหน่วยความจำ
Code memory

นอกจากการใช้งาน Pointers ทั้ง 2 แบบดังกล่าวแล้ว ยังมีการใช้งานในรูปแบบ Abstract Pointers
อีกด้วย ซึ่งช่วยให้การเขียนโปรแกรมเป็นไปอย่างสะดวกยิ่งขึ้น แต่ก็เป็นเรื่องที่เข้าใจได้ยาก และซับซ้อน
พอควร ลองทำความเข้าใจจากตัวอย่างต่อไปนี้ …

int x;
ประกาศให้ x เป็นตัวแปรแบบ interger (คือข้อมูลขนาด 16 บิท)

x = (int code *) main;
กำหนดให้ x มีค่าเท่ากับตำแหน่งของ main function ในโปรแกรม ซึ่งอยู่ในพื้นที่ code

x = *((int code *) main);
กำหนดให้ x มีค่าเท่ากับข้อมูลที่ตำแหน่งของ main function ในโปรแกรม ซึ่งอยู่ในพื้นที่ code

char a;
ประกาศให้ a เป็นตัวแปรแบบ char (คือข้อมูลขนาด 8 บิท)

a = *((char xdata *) 0x2000);
กำหนดให้ a มีค่าเท่ากับข้อมูลจากตำแหน่ง 0x2000 ซึ่งอยู่ในพื้นที่ xdata

x = 0x8000;
กำหนดให้ x มีค่าเป็น 0x8000

a = *((char xdata *) x);
กำหนดให้ a มีค่าเท่ากับข้อมูลจากตำแหน่ง 0x8000 ซึ่งอยู่ในพื้นที่ xdata

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

ขอขอบคุณข้อมูลจาก : http://www.sumtech.co.th/

นายธนภพ วิสุปฐมวงศ์ 1570900736
นายเรวัตร ยั่งยืน 1570900611
นายศักดิโชติ จอนกิ่ง 1570900629

Thanaphop Visupathomvong
at GlurGeek.Com
นักศึกษาคณะวิศวกรรมศาสตร์ มหาวิทยาลัยกรุงเทพ ชั้นปีที่ 2

3 Comments

Leave a Reply

Copyright © 2021 GlurGeek.Com. All Rights Reserved.