Week 4. ตัวแปรชนิด
พอยเตอร์ (Pointer)
พอยเตอร์ (Pointer)
 พอยเตอร์ (Pointer) เป็นตัวแปรชนิดพิเศษ
ในภาษา C ทำาหน้าที่เก็บตำาแหน่งที่
อยู่(Address) ของตัวแปรชนิดอื่นๆ ที่อยู่ใน
หน่วยความจำา แทนที่จะเก็บข้อมูลเหมือนกันตัว
แปรพื้นฐานชนิดอื่นๆ
 ตัวแปรพอยเตอร์มีลักษณะคล้ายตัวแปรตารา
งอาเรย์ แต่ที่แตกต่างกันคือ ตัวแปรตารา
งอาเรย์จะเก็บเฉพาะค่าต่างๆ ที่เป็นชนิดกันเดียว
กับตัวแปรอาเรย์ แต่ตัวแปรพอยเตอร์จะเก็บ
เฉพาะค่าตำาแหน่ง Address ตัวแปรเท่านั้น
การใช้งานพอยเตอร์ (Pointer)
ตัวอย่างการเขียนคำาสั่งเพื่อประกาศตัวแปร
pointer
- int x; สร้างตัวแปรชนิด int ชื่อ x สำาหรับ
เก็บค่าจำานวนเต็ม
- int *pt_x สร้างตัวแปร pointer ชนิด int
ทำาให้ pt_x ใช้สำาหรับเก็บ
ตำาแหน่งที่อยู่ของตัวแปรชนิด int
เท่านั้น
- float *pt_num สร้างตัวแปร pointer ชนิด
float ทำาให้ pt_num ใช้สำาหรับ
ตัวแปรพอยเตอร์ ( Pointer
variable)
ตัวแปรใดก็ตามที่เก็บตำาแหน่งเลขที่ของตัวแปรอื่น
หรือออปเจกต์อื่น เรียกตัวแปรนั้นว่าเป็นตัวแป
รพอยเตอร์ คอมไพเลอร์ต้องรู้ด้วยว่าตัวแปรพอยน์
เตอร์เก็บ address ของตัวแปรเป็นข้อมูลชนิดใด
เพราะการ เพิ่มค่า pointer ไปยัง address ต่าง ๆ จะ
เพิ่มตามขนาดของข้อมูล การประกาศตัวแปรพอยน์
เตอร์ จึงต้องประกาศให้ตรงกับชนิดของตัวแปรนั้น
ๆ ด้วย
การประกาศตัวแปรพอยน์เตอร์ ใน C++ มีรูปแบบ
ดังนี้
int *ptrint; // define a pointer to int
float *ptrx; // define a pointer to float
*ptrint และ *ptrx เป็นตัวแปรพอยน์เตอร์ที่เก็บ
ตำาแหน่งเลขที่หน่วยความจำาของตัวแปรที่มีชนิด
ข้อมูลเป็น Int และ float ตามลำาดับ เครื่องหมาย *
มีความหมายว่าเป็น pointer to type
ตัวอย่างต่อไปนี้เป็นการกำาหนดค่า address ให้กับตัว
แปรพอยน์เตอร์
และใช้ประโยชน์จากตัวแปรพอยน์เตอร์ ในการแสดง
ค่า
ตัวดำาเนินการที่ใช้กับตัวแป
รพอยเตอร์
1. แสดงตำาแหน่งข้อมูลด้วย & (address
operation)
 เครื่องหมาย & (Ampersand) ใช้ในการ
กำาหนดตำาแหน่งที่อยู่ของตัวแปรให้กับพอย
เตอร์ โดยเมื่อสร้างตัวแปรชนิดพอยเตอร์มาแล้ว
วิธีการที่จะนำาค่าตำาแหน่งในหน่วยความจำาของ
ตัวแปรใดๆ มาเก็บไว้ในตัวแปรพอยเตอร์ได้นั้น
ต้องใช้เครื่องหมาย & โดยให้เขียนเครื่องหมาย
& นำาหน้าชื่อตัวแปรในหน่วยความจำา
วิธีการประกาศตัวแปร
ตัวดำำเนินกำรที่ใช้กับตัวแป
รพอยเตอร์
PV = &V;
เครื่องหมำย “&” หมำยถึง ที่อยู่ของ V
(Address Operator)
ที่อยู่ของที่อยู่ของ VVที่อยู่ของที่อยู่ของ VV ค่ำของค่ำของ VVค่ำของค่ำของ VV
PVPV VV
พอยเตอร์ (Pointer)
 พอยเตอร์จะเก็บค่ำ
ตำำแหน่งหรือ
แอดเดรสในหน่วย
ควำมจำำของตัวแป
รอื่นๆ ไว้
 ปกติกำรประกำศ
ตัวแปรในกำรเก็บ
ข้อมูลเป็นดังนี้
int age =23;

 กำรประกำศแบบพอย
เตอร์
int age;
age = 23;
int *pointer;
pointer = &
age;
 ตัวแปรพอยเตอร์
age จะไม่ได้เก็บค่ำ
พอยเตอร์ (Pointer)
 Pointer เป็นตัวแปรประเภทหนึ่งในภำษำ C ที่ต่ำง
จำกตัวแปรทั่ว ๆ ไปคือ ตัวแปรทั่ว ๆ ไปจะประกำศ
แบบนี้คือ
int a,b,c;
a=b=10;
c=a;
โดย c จะเก็บค่ำ 10
พอยเตอร์ (Pointer)
 แต่ถ้ำประกำศดังนี้
int a,b;
int *c;
a=b=10;
c=&a;
จะเห็นได้ว่ำ ตัวแปร c เป็น pointer และให้ c=&a
ฉะนั้น c จะไม่ได้เก็บค่ำ 10 แต่ c จะเก็บตำำแหน่ง
ของตัวแปร a ที่อยู่ในหน่วยควำมจำำ และทำำให้ c
สำมำรถเข้ำถึงข้อมูลในตัวแปร a ได้
แสดงตำำแหน่งข้อมูลด้วย &
(address operation)
แสดงตำำแหน่งข้อมูลด้วย &
(address operation)
 ตัวอย่ำงกำรใช้เครื่องหมำย &
int x=17;
int *pt_x;
pt_x=&x;
float salary=1200.00;
float *pt_sala;
pt_sala=&salary;
17 0100
x pt_x
0100 0370
salary pt_sala
0210 0600
กำรแสดงตำำแหน่งผลใน
โปรแกรมโดยใช้ pointer
 กำรเขียนโปรแกรมเพื่อให้แสดงตำำแหน่งใน
หน่วยควำมจำำที่เก็บไว้ในตัวแปร์พอยเตอร์ออก
ทำงหน้ำจอนั้น จะใช้คำำสั่ง printf ตำมปกติ แต่
จะใช้รูปแบบกำรแสดงผลเป็น “%p” ซึ่งใช้
สำำหรับกำรแสดงตำำแหน่งหน่วยควำมจำำในตัว
แปรพอยเตอร์โดยเฉพำะ
ตัวอย่ำงโปรแกรม
ผลลัพธ์ของโปรแกรม
ตัวอย่ำงโปรแกรมโดยใช้
เครื่องหมำย & กับตัวแปรพอยเตอร์
#include<stdio.h>
void main()
{
int x=17;
float salary=1200.00;
char letter='w';
int *pt_x;
float *pt_salary;
char *pt_letter;
pt_x=&x;
pt_salary=&salary;
pt_letter=&letter;
printf("Address of x = %p n",pt_x);
printf("Address of salary = %p n",pt_salary);
printf("Address of letter = %p n",pt_letter);
}
ตัวดำำเนินกำรที่ใช้กับตัวแป
รพอยเตอร์
2. แสดงค่ำข้อมูลด้วย * (indirect
operation)
 เครื่องหมำย * อ้ำงถึงข้อมูลหรือค่ำที่เก็บ
ไว้ในหน่วยควำมจำำตำำแหน่งที่ชี้ โดย
สำมำรถหำค่ำข้อมูลจำกตำำแหน่งในหน่วยควำม
จำำที่เก็บไว้ในตัวแปรพอยเตอร์ โดยกำรเขียน
เครื่องหมำย * นำำหน้ำชื่อตัวแปรพอยเตอร์
วิธีกำรประกำศตัวแปร
variable=*pointer;
ตัวดำำเนินกำรที่ใช้กับตัวแป
รพอยเตอร์
PV = &V;
เครื่องหมำย “&” หมำยถึง ที่อยู่ของ V
(Address Operator)
U = *PV;
ดังนั้นหำกเรำต้องกำรอ้ำงอิงค่ำของ V เรำ
ต้องใช้เครื่องหมำย “*” (Indirect Operator)
ให้กับ Pointer แล้วนำำค่ำที่ได้ไปเก็บไว้ใน U
ที่อยู่ของที่อยู่ของ VVที่อยู่ของที่อยู่ของ VV ค่ำของค่ำของ VVค่ำของค่ำของ VV
PVPV VV
แสดงค่ำข้อมูลด้วย *
(indirect operation)
 ตัวอย่ำงกำรใช้เครื่องหมำย *
int num1=113,num2;
int *pt_num;
pt_num=&num1;
num2=*pt_num;
float price1=4.85,price2;
float *pt_price;
pt_price=&price1;
price2=*pt_price;
113 0100
num1 pt_num
0100 0230
113
num2
0310
price1 pt_price
0150 0430
price2
0510
พอยเตอร์ (Pointer)
 ตัวอย่ำง
int a,b,*c;
a=b=10;
printf("a=%d",a);
c=&a;
*c=21;
printf("a=%d",a);
เมื่อรันโปรแกรมนี้จะได้ผลลัพธ์อย่ำงไร?
ตัวอย่ำงโปรแกรม
ผลลัพธ์ของโปรแกรม
ตัวอย่ำงโปรแกรมโดยใช้
เครื่องหมำย * กับตัวแปรพอยเตอร์
#include<stdio.h>
void main()
{ int num1=113,num2;
float price=4.85;
char hint1='a',hint2;
int *pt_num;
float *pt_price;
char *pt_hint1;
pt_num=&num1;
pt_price=&price;
pt_hint1=&hint1;
num2=*pt_num;
hint2=*pt_hint1;
printf("Variable of num2 = %d n",*pt_num);
printf("Variabie of Price = %p n",&pt_price);
printf("Variabie of hint2 = %c n",hint2);
}
ตัวแปรพอยเตอร์กับอำร์เรย์
 กรณีของตัวแปรอำร์เรย์สำมำรถใช้ตัวแปรพอย
เตอร์เพื่อหำตำำแหน่งในหน่วยควำมจำำของตัวแปร
แต่ละตัวในตัวแปรอำร์เรย์ได้เช่นเดียวกัน คือ
 int num[5]={12,34,112,45,907};
int *pt_num;
pt_num=&num[2];
pt_num=&num[4];
12 34
num[0] num[1]
0410 0412
112
num[2]
0414
45
num[3]
0416
907
num[4]
0418
0414
pt_num
0350
0418
pt_num
0350
ตัวแปรพอยเตอร์กับอำร์เรย์
 int num[5]={12,34,112,45,907};
int *pt_num;
int temp;
pt_num=&num[4];
temp=*pt_num;
ค่ำของ temp จะมีค่ำเท่ำใด?
12 34
num[0] num[1]
0410 0412
112
num[2]
0414
45
num[3]
0416
907
num[4]
0418
907
num[4] pt_num
0418 0230
temp
0310
ตัวอย่ำงโปรแกรมตัวแปรพอยเตอร์
กับอำร์เรย์
#include<stdio.h>
int x[5]={11,43,523,789,101};
int *pt_1,*pt_2,*pt_3,*pt_4,*pt_5;
void main()
{ pt_1=&x[0];
pt_2=&x[1];
pt_3=&x[2];
pt_4=&x[3];
pt_5=&x[4];
printf(“Address of x[0] = %p n”,pt_1);
printf(“Address of x[1] = %p n”,pt_2);
printf(“Value of x[2] = %d n”,*pt_3);
printf(“Value of x[3] = %d n”,*pt_4);
printf(“Value of x[4] = %d n”,*pt_5);
x[3]=*pt_5; // กำำหนดค่ำของตัวแปรอำร์เรย์ x[3] ใหม่ด้วยข้อมูลที่เก็บไว้
ในตัวแปรพอยเตอร์ pt_5
printf(“Value of x[3] = %d n”,x[3]);
ตัวแปรพอยเตอร์กับอาร์เรย์
 นอกจากนี้ยังสามารถใช้พอยน์
เตอร์แทนอาร์เรย์ การอ้างถึงค่าใน
อาร์เรย์โดยใช้ a[i] สามารถใช้
*(a+i)
 เนื่องจากทุกครั้งที่อ้างถึง a[i]
ภาษาซีจะทำาหน้าที่แปลงเป็น
*(a+i) เพราะฉะนั้นการเขียนในรูป
แบบใดก็ให้ผลลัพธ์ในการทำางาน
างถึงตำาแหน่งในอาร์เรย์ผ่านตัวชี้
 ในลักษณะเดียวกันการใช้งานพอยน์
เตอร์ก็สามารถใช้คำาสั่งในลักษณะ
อาร์เรย์ก็ได้ เช่น การอ้างถึง *(pa+i)
สามารถเขียนด้วย pa[i] ก็ได้ผลเช่น
เดียวกัน
 สิ่งที่แตกต่างกันของอาร์เรย์และ
พอยน์เตอร์ คือ พอยน์เตอร์เป็นตัวแปร
แต่อาร์เรย์ไม่ใช่ตัวแปร
างถึงตำาแหน่งในอาร์เรย์ผ่านตัวชี้
การใช้งาน Pointer กับอาร์เรย์
1 มิติ
 ตัวอย่าง
int x[3] = {10, 11, 12};
// Address ของอาร์เรย์ตัวที่ 0 ไม่ได้มีค่า
เท่ากับ 10 แต่อาจมีค่าเป็น FFF5 ขึ้นอยู่กับการ
จองหน่วยความจำา ณ ขณะนั้น
&x[0] และก็มีค่าเท่ากับ x + 0 // FFF5
&x[1] และก็มีค่าเท่ากับ x + 1 // FFF7
&x[2] และก็มีค่าเท่ากับ x + 2 // FFF9
x[0] และก็มีค่าเท่ากับ *(x + 0) // 10
x[1] และก็มีค่าเท่ากับ *(x + 1) // 11
x[2] และก็มีค่าเท่ากับ *(x + 2) // 12
ผลลัพธ์ของโปรแกรม
ประโยชน์ของ Pointer
 มีประโยชน์เมื่อต้องเขียนโปรแกรมจัดการกับ
โครงสร้างข้อมูลขนาดใหญ่ ที่มีข้อมูลจำานวนมาก การ
จัดเรียงหรือการประมวลผลต่อข้อมูลโดยใช้ pointer
และ array แม้จะทำาได้รวดเร็ว แต่ในกรณีที่มีข้อมูล
จำานวนมหาศาล การจัดเรียงหรือประมวลผลหาก
กระทำาต่อตัวข้อมูลใน array โดยตรงจะยังช้าเกินไป
 หลีกเลี่ยงการใช้ array เก็บตัวข้อมูล เมื่อต้องการจัด
เรียงหรือประมวลผลกับข้อมูล เราจะทำาทางอ้อมโดยจัด
เรียงหรือประมวลผลกับค่าของ pointer ที่ถูกชี้ซึ่ง
ทำาได้รวดเร็วกว่าการกระทำากับข้อมูลโดยตรงมาก
ทำาให้การจัดการกับข้อมูลในโครงสร้างข้อมูลที่มีข้อมูล
จำานวนมาก สามารถทำาได้ด้วยความเร็วสูง
ประโยชน์ของของ Pointer
 ข้อสรุปเรื่อง Pointer
 ทำาหน้าที่ชี้ไปยังตำาแหน่งเก็บข้อมูลในหน่วย
ความจำา
 การประกาศ pointer ต้องกำาหนด data type
ด้วย
 ใช้ pointer ชี้ไปยัง pointer หรือชี้ไปยัง
array หรือ array ของ pointer ได้
 การอ้างถึงตำาแหน่งของตัวแปร ใช้เครื่องหมาย
& หน้าตัวแปร pointer เช่น &pt
ตัวแปรชนิดพอยเตอร์ (Pointer)

ตัวแปรชนิดพอยเตอร์ (Pointer)