ตัวแปรชนิดพอยเตอร์ (pointer)
TRANSCRIPT
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 ใชสำาหรบ เกบตำาแหนงทอยของตวแปร
ชนด float เทานน- char *pt_ch สรางตวแปร pointer ชนด
char ทำาให pt_ch ใชสำาหรบเกบ ตำาแหนงทอยของตวแปรชนดchar เทานน
ตวแปรพอยเตอร ( Pointer variable)
ตวแปรใดกตามทเกบตำาแหนงเลขทของตวแปรอน หรอออปเจกตอน เรยกตวแปรนนวาเปนตวแป
รพอยเตอร คอมไพเลอรตองรดวยวาตวแปรพอยน เตอรเกบ address ของตวแปรเปนขอมลชนดใด เพราะการ เพมคา pointer ไปยง address ตาง ๆ จะ
เพมตามขนาดของขอมล การประกาศตวแปรพอยน เตอร จงตองประกาศใหตรงกบชนดของตวแปรนน
ๆ ดวย
การประกาศตวแปรพอยนเตอร ใน C++ มรปแบบดงน
data_type *pointer_var ; // define a ‘ pointer to type'
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) ใชในการกำาหนดตำาแหนงทอยของตวแปรใหกบพอยเตอร โดยเมอสรางตวแปรชนดพอยเตอรมาแลววธการทจะนำาคาตำาแหนงในหนวยความจำาของ
ตวแปรใดๆ มาเกบไวในตวแปรพอยเตอรไดนน ตองใชเครองหมาย & โดยใหเขยนเครองหมาย
& นำาหนาชอตวแปรในหนวยความจำาว ธการประกาศตวแปร
pointer=&variable;
ตวด ำำเนนกำรทใช กบตวแปรพอยเตอร
PV = &V; เครองหมำย “&” หมำยถง ทอยของ V
(Address Operator)
ทอย ของ ทอย ของ VV ทอย ของ ทอย ของ VV คำของ คำของ VV คำของ คำของ VVPVPV VV
พอยเตอร (Pointer)
พอยเตอรจะเกบคำตำำแหนงหรอแอดเดรสในหนวยควำมจำำของตวแป
รอนๆ ไวปกตกำรประกำศตวแปรในกำรเกบขอมลเปนดงน
int age =23;char char = ‘a’;
กำรประกำศแบบพอยเตอรint age;age = 23;int *pointer;pointer = &
age; ตวแปรพอยเตอร
age จะไมไดเกบคำ23 แตจะเกบคำ
ตำำแหนงทขอมล 23 เกบอยแทน
พอยเตอร (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
ดงนน U จะมคำเทำกบ V
ทอย ของ ทอย ของ VV ทอย ของ ทอย ของ VV คำของ คำของ VV คำของ คำของ VVPVPV 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_5printf(“Value of x[3] = %d \n”,x[3]);
}
ตวแปรพอยเตอร กบอาร เรย
นอกจากนย งสามารถใชพอยน เตอร แทนอาร เรย การอ างถ งค าใน
อาร เรย โดยใช a[i] สามารถใช*(a+i)
เน องจากทกคร งท อ างถ ง 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 เชน *pt
pointer ทชไปยง pointer ใชดอกจนสองตว เชน int **p