ประโยชน์ของตัวแปรพอยเตอร์ (Pointer) และการประยุกต์ใช้งาน
     ก่อนอื่นมาทำความเข้าใจเกี่ยวกับตัวแปรพอยเตอร์กันก่อนนะครับ ว่าตัวแปรพอยเตอร์ทำหน้าที่อะไรต่างจากตัวแปรที่เราเขียนทั่วไปยังไง ซึ่งสำ หรับโปรแกรมเมอร์มือใหม่แล้ว อาจยังไม่คุ้นเคยการนำตัวแปรประเภทนี้ไปใช้งาน

     ตัวแปรพอยเตอร์ (POINTER) เป็นตัวแปร ที่ทำหน้าที่เก็บที่อยู่ (Address) ของตัวแปรชนิดอื่นๆ ซึ่งแตกต่างจากตัวแปรทั่วไปที่เราจะสร้างตัวแปรนั้น ให้เก็บข้อมูลที่เราต้องการ เช่น สร้างตัวแปร time สำหรับเก็บเวลา เป็นต้น แต่สำหรับตัวแปรพอยเตอร์นั้น จะทำหน้าที่เก็บที่อยู่ของตัวแปรนั้นๆ แทน เช่น ตัวแปร time ถูกสร้างขึ้นและอยู่ที่ตำแหน่งของแรมแอดเดรส 0x0013 เราจะใช้ตัวแปรพอยเตอร์เก็บแอดเดรสของตัวแปร time นี้ไว้

การใช้งานตัวแปรพอยเตอร์

     Type                    *Variable name;  

     Types                   หมายถึง ชนิดของข้อมูล
     Variable name      หมายถึง ชื่อของตัวแปรพอยเตอร์ โดยจะมีเครื่องหมาย * นำหน้าตัวแปร  

ตัวอย่าง
            Int        *num;   สร้างตัวแปร pointer ชนิด int ทำให้ num ใช้สำหรับเก็บตำแหน่งที่อยู่ของตัวแปรชนิด int เท่านั้น
            float      *num;   สร้างตัวแปร pointer ชนิด float ทำให้ num ใช้สำหรับเก็บตำแหน่งที่อยู่ของตัวแปรชนิด float เท่านั้น

ตัวดำเนินการที่ใช้กับตัวแปรพอยเตอร์
     1.เครื่องหมาย & (Ampersand) จะอยู่หน้าตัวแปรใดๆ สำหรับนำค่าตำแหน่ง (Address) ที่อยู่ของตัวแปรนั้น มาเก็บลงในตัวแปรพอยเตอร์ ตัวอย่าง เช่น
                     int *p;
                     int   n;
                     p = &n; // ส่งแอสเดรสของ n ไปยังตัวแปรพอยเตอร์ p

     ตอนนี้ผมหวังว่าคงเข้าใจกันบ้างแล้ว ว่าพอยเตอร์คืออะไร และสามารถประกาศใช้งานได้อย่างไร ต่อไปผมจะขอยกตัวอย่างโปรแกรมในเห็นนะ
ครับว่าระหว่างเราใช้งานตัวแปรพอยเตอร์ กับการไม่ใช้ตัวแปรพอยเตอร์ต่างกันอย่างไร โดยจะยกตัวอย่างหลายๆ แบบ ให้่เป็นขอเปรียบเทียบและเห็น
ควมแตกต่างของการใช้งาน

ตัวอย่างที่ 1
     การทำงานโปรแกรมคือ สร้างตัวแปร a, b, และ c ซึ่งเป็นตัวแปรอาเรย์ โดยตัวแปรแต่ละตัวมีสมาชิก 5 ตัว สมมุติให้ตัวแปร a มีค่า 1 ทั้ง5 ตัว ตัวแปร
ฺb มีค่า 2 ทั้ง 5 ตัว และ c มีค่า 3 ทั้ง 5 ตัว และเราได้สร้างฟังก์ชั่น add() เพื่อทำการบวกค่าในสมาชิกของตัวแปรทั้ง 3 ตัวนี้ โดยใช้่เพียงฟังก์ชั่นเดียว
ฟังก์ชั่น add() ที่สร้่างขึ้นมีการรับค่าแบบพอยเตอร์ แทนที่เราจะส่งข้อมูลไปยังฟังก์ชั่น add() เราจะส่งที่อยู่ของตัวแปรนั้นไปแทน

[กลับหน้าบทความ]

#include <16F877A.h>
#device adc=8
#FUSES NOWDT      //No Watch Dog Timer
#FUSES HS         //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT      //No Power Up Timer
#FUSES PROTECT    //Code protected from reads
#FUSES NODEBUG    //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP      //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD      //No EE protection
#FUSES NOWRT      //Program memory not write protected
#use delay(clock=20000000)
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7)

 

long add(int *num);

 

void main (void)
{

int a[5] = {1,1,1,1,1};
int b[5] = {2,2,2,2,2};
int c[5] = {3,3,3,3,3};

long sum_a;
long sum_b;
long sum_c;

     sum_a = add(a); // ปกติต้องมีเครื่องหมาย & อยู่ด้านหน้าตัวแปรแต่บางเวอร์ชั่นของ CCS ไม่ต้องใส่ก็ได้
     sum_b = add(b); // เนื่องจากผมลองใส่แล้ว มันฟ้อง eeror แต่บางเวอร์ชั่นไม่ฟ้อง error นะครับ
     sum_c = add(c);

     putc('\f');
     printf("sum a : %lu \n\r",sum_a);
     printf("sum b : %lu \n\r",sum_b);
     printf("sum c : %lu \n\r",sum_c); 

     while(true){
     ;
     }

}

long add(int *num)
{
int i;
long sum = 0;

     for(i=0;i<5;i++){
          sum = sum + num[i];
     }

     return(sum);
}

#include <16F877A.h>
#device adc=8
#FUSES NOWDT                  //No Watch Dog Timer
#FUSES HS                     //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT                  //No Power Up Timer
#FUSES PROTECT                //Code protected from reads
#FUSES NODEBUG                //No Debug mode for ICD
#FUSES NOBROWNOUT             //No brownout reset
#FUSES NOLVP                  //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                  //No EE protection
#FUSES NOWRT                  //Program memory not write protected
#use delay(clock=20000000)
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7)

 

long add(int n1,int n2,int n3,int n4,int n5);

 

void main (void)
{

int a[5] = {1,1,1,1,1};
int b[5] = {2,2,2,2,2};
int c[5] = {3,3,3,3,3};

long sum_a;
long sum_b;
long sum_c;

     sum_a = add(a[0],a[1],a[2],a[3],a[4]);
     sum_b = add(b[0],b[1],b[2],b[3],b[4]);
     sum_c = add(c[0],c[1],c[2],c[3],c[4]);

     putc('\f');
     printf("sum a : %lu \n\r",sum_a);
     printf("sum b : %lu \n\r",sum_b);
     printf("sum c : %lu \n\r",sum_c);

     while(true){
     ;
     }

}

long add(int n1,int n2,int n3,int n4,int n5)
{
long sum = 0;

     sum = n1+n2+n3+n4+n5;

return(sum);
}

     ผลที่ได้ของโปรแกรมทั้งสองคือเหมือนกัน แต่ต่างกันที่ลักษณะการเขียน ซึ่งถ้าไม่ได้ใช้วิธีพอยเตอร์แล้ว เราต้องสร้างฟังก์ชั่นมารับค่าตัวแปรเท่า
กับตัวแปรที่ส่งมาให้ฟังก์ชั่น ถ้าหากมีการส่งค่ามาจำนวนเป็นหลายร้่อยค่า วิธีพอยเตอร์ก็จะช่วยให้ท่านเขียนโปรแกรมได้ง่ายขึ้น และประัหยัดหน่วย
ความจำแรมได้
     แต่ถ้าเราไม่ใช้วิธีพอยเตอร์ เราจะต้องสร้างฟังก์ชั่น add() ที่สามารถรับค่าที่จะส่งเ่ท่ากับจำนวนสมาชิกที่ส่งมาให้กับฟังก์ชั่น add() มาแทน เดี๋ยวผมจะยกตัวอย่างโปรแกรมให้ดูด้านล่างนะครับ