ตัวแปรชนิดพอยเตอร์ (pointer) - apipong pingyod's...

36
ตัวแปรชนิดพอยเตอร์ (Pointer) สธ 113 การออกแบบโปรแกรมทางธุรกิจเบื ้องต ้น

Upload: others

Post on 31-Mar-2020

16 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: ตัวแปรชนิดพอยเตอร์ (Pointer) - Apipong Pingyod's Site...พอยเตอร (Pointer)พอยเตอร (Pointer) เป นต วแปรชน

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

สธ 113 การออกแบบโปรแกรมทางธรกจเบองตน

Page 2: ตัวแปรชนิดพอยเตอร์ (Pointer) - Apipong Pingyod's Site...พอยเตอร (Pointer)พอยเตอร (Pointer) เป นต วแปรชน

พอยเตอร (Pointer)

พอยเตอร (Pointer) เปนตวแปรชนดพเศษในภาษา C ท าหนาทเกบต าแหนงทอย(Address) ของตวแปรชนดอนๆ ทอยในหนวยความจ า แทนทจะเกบขอมลเหมอนกนตวแปรพนฐานชนดอนๆ

ตวแปรพอยเตอรมลกษณะคลายตวแปรตารางอาเรย แตทแตกตางกนคอ ตวแปรตารางอาเรยจะเกบเฉพาะคาตางๆ ทเปนชนดกนเดยวกบตวแปรอาเรย แตตวแปรพอยเตอรจะเกบเฉพาะคาต าแหนง Address ตวแปรเทานน

2

Page 3: ตัวแปรชนิดพอยเตอร์ (Pointer) - Apipong Pingyod's Site...พอยเตอร (Pointer)พอยเตอร (Pointer) เป นต วแปรชน

3

Page 4: ตัวแปรชนิดพอยเตอร์ (Pointer) - Apipong Pingyod's Site...พอยเตอร (Pointer)พอยเตอร (Pointer) เป นต วแปรชน

4

Page 5: ตัวแปรชนิดพอยเตอร์ (Pointer) - Apipong Pingyod's Site...พอยเตอร (Pointer)พอยเตอร (Pointer) เป นต วแปรชน

5

Page 6: ตัวแปรชนิดพอยเตอร์ (Pointer) - Apipong Pingyod's Site...พอยเตอร (Pointer)พอยเตอร (Pointer) เป นต วแปรชน

การใชงานพอยเตอร (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 เทานน

6

Page 7: ตัวแปรชนิดพอยเตอร์ (Pointer) - Apipong Pingyod's Site...พอยเตอร (Pointer)พอยเตอร (Pointer) เป นต วแปรชน

7

Page 8: ตัวแปรชนิดพอยเตอร์ (Pointer) - Apipong Pingyod's Site...พอยเตอร (Pointer)พอยเตอร (Pointer) เป นต วแปรชน

ตวด าเนนการทใชกบตวแปรพอยเตอร

1. แสดงต าแหนงขอมลดวย & (address operation)

เครองหมาย & (Ampersand) ใชในการก าหนดต าแหนงทอยของตวแปรใหกบพอยเตอรโดยเมอสรางตวแปรชนดพอยเตอรมาแลว วธการทจะน าคาต าแหนงในหนวยความจ าของตวแปรใดๆ มาเกบไวในตวแปรพอยเตอรไดนน ตองใชเครองหมาย & โดยใหเขยนเครองหมาย & น าหนาชอตวแปรในหนวยความจ า

วธการประกาศตวแปร

pointer=&variable;

8

Page 9: ตัวแปรชนิดพอยเตอร์ (Pointer) - Apipong Pingyod's Site...พอยเตอร (Pointer)พอยเตอร (Pointer) เป นต วแปรชน

ตวด าเนนการทใชกบตวแปรพอยเตอร

PV = &V;เครองหมาย “&” หมายถง ทอยของ V (Address Operator)

ทอยของ V คาของ VPV V

9

Page 10: ตัวแปรชนิดพอยเตอร์ (Pointer) - Apipong Pingyod's Site...พอยเตอร (Pointer)พอยเตอร (Pointer) เป นต วแปรชน

พอยเตอร (Pointer)

พอยเตอรจะเกบคาต าแหนงหรอแอดเดรสในหนวยความจ าของตวแปรอนๆ ไว

ปกตการประกาศตวแปรในการเกบขอมลเปนดงน

int age =23;char char = ‘a’;

การประกาศแบบพอยเตอรint age;age = 23;int *pointer;pointer = & age;

ตวแปรพอยเตอร age จะไมไดเกบคา 23 แตจะเกบคาต าแหนงทขอมล 23 เกบอยแทน

10

Page 11: ตัวแปรชนิดพอยเตอร์ (Pointer) - Apipong Pingyod's Site...พอยเตอร (Pointer)พอยเตอร (Pointer) เป นต วแปรชน

พอยเตอร (Pointer)

Pointer เปนตวแปรประเภทหนงในภาษา C ทตางจากตวแปรทว ๆ ไปคอ ตวแปรทว ๆ ไปจะประกาศแบบนคอ

int a,b,c;

a=b=10;

c=a;

โดย c จะเกบคา 10

11

Page 12: ตัวแปรชนิดพอยเตอร์ (Pointer) - Apipong Pingyod's Site...พอยเตอร (Pointer)พอยเตอร (Pointer) เป นต วแปรชน

พอยเตอร (Pointer)

แตถาประกาศดงน

int a,b;

int *c;

a=b=10;

c=&a; จะเหนไดวา ตวแปร c เปน pointer และให c=&a ฉะนน c จะไมไดเกบคา 10 แต c จะเกบตาแหนงของตวแปร a ทอยในหนวยความจา และทาให c สามารถเขาถงขอมลในตวแปร a ได

12

Page 13: ตัวแปรชนิดพอยเตอร์ (Pointer) - Apipong Pingyod's Site...พอยเตอร (Pointer)พอยเตอร (Pointer) เป นต วแปรชน

แสดงต าแหนงขอมลดวย & (address operation)

13

Page 14: ตัวแปรชนิดพอยเตอร์ (Pointer) - Apipong Pingyod's Site...พอยเตอร (Pointer)พอยเตอร (Pointer) เป นต วแปรชน

แสดงต าแหนงขอมลดวย & (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

14

Page 15: ตัวแปรชนิดพอยเตอร์ (Pointer) - Apipong Pingyod's Site...พอยเตอร (Pointer)พอยเตอร (Pointer) เป นต วแปรชน

การแสดงต าแหนงผลในโปรแกรมโดยใช pointer

การเขยนโปรแกรมเพอใหแสดงต าแหนงในหนวยความจ าทเกบไวในตวแปรพอยเตอรออกทางหนาจอนน จะใชค าสง printf ตามปกต แตจะใชรปแบบการแสดงผลเปน “%p”ซงใชส าหรบการแสดงต าแหนงหนวยความจ าในตวแปรพอยเตอรโดยเฉพาะ

15

Page 16: ตัวแปรชนิดพอยเตอร์ (Pointer) - Apipong Pingyod's Site...พอยเตอร (Pointer)พอยเตอร (Pointer) เป นต วแปรชน

ตวอยางโปรแกรม

16

Page 17: ตัวแปรชนิดพอยเตอร์ (Pointer) - Apipong Pingyod's Site...พอยเตอร (Pointer)พอยเตอร (Pointer) เป นต วแปรชน

ผลลพธของโปรแกรม

17

Page 18: ตัวแปรชนิดพอยเตอร์ (Pointer) - Apipong Pingyod's Site...พอยเตอร (Pointer)พอยเตอร (Pointer) เป นต วแปรชน

ตวอยางโปรแกรมโดยใชเครองหมาย & กบตวแปรพอยเตอร

18

Page 19: ตัวแปรชนิดพอยเตอร์ (Pointer) - Apipong Pingyod's Site...พอยเตอร (Pointer)พอยเตอร (Pointer) เป นต วแปรชน

ตวด าเนนการทใชกบตวแปรพอยเตอร

2. แสดงคาขอมลดวย * (indirect operation)

เครองหมาย * อางถงขอมลหรอคาทเกบไวในหนวยความจ าต าแหนงทช โดยสามารถหาคาขอมลจากต าแหนงในหนวยความจ าทเกบไวในตวแปรพอยเตอร โดยการเขยนเครองหมาย * น าหนาชอตวแปรพอยเตอร

วธการประกาศตวแปร

variable= *pointer;

19

Page 20: ตัวแปรชนิดพอยเตอร์ (Pointer) - Apipong Pingyod's Site...พอยเตอร (Pointer)พอยเตอร (Pointer) เป นต วแปรชน

ตวด าเนนการทใชกบตวแปรพอยเตอร

PV = &V;เครองหมาย “&” หมายถง ทอยของ V (Address Operator)

U = *PV;ดงนนหากเราตองการอางองคาของ V เราตองใชเครองหมาย “*”

(Indirect Operator) ใหกบ Pointer แลวนาคาทไดไปเกบไวใน Uดงนน U จะมคาเทากบ V

ทอยของ V คาของ VPV V

20

Page 21: ตัวแปรชนิดพอยเตอร์ (Pointer) - Apipong Pingyod's Site...พอยเตอร (Pointer)พอยเตอร (Pointer) เป นต วแปรชน

แสดงคาขอมลดวย * (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

21

Page 22: ตัวแปรชนิดพอยเตอร์ (Pointer) - Apipong Pingyod's Site...พอยเตอร (Pointer)พอยเตอร (Pointer) เป นต วแปรชน

พอยเตอร (Pointer)

ตวอยางint a,b,*c;a=b=10; printf("a=%d",a); c=&a; *c=21; printf("a=%d",a);เมอรนโปรแกรมนจะไดผลลพธอยางไร?

22

Page 23: ตัวแปรชนิดพอยเตอร์ (Pointer) - Apipong Pingyod's Site...พอยเตอร (Pointer)พอยเตอร (Pointer) เป นต วแปรชน

ตวอยางโปรแกรม

23

Page 24: ตัวแปรชนิดพอยเตอร์ (Pointer) - Apipong Pingyod's Site...พอยเตอร (Pointer)พอยเตอร (Pointer) เป นต วแปรชน

ผลลพธของโปรแกรม

24

Page 25: ตัวแปรชนิดพอยเตอร์ (Pointer) - Apipong Pingyod's Site...พอยเตอร (Pointer)พอยเตอร (Pointer) เป นต วแปรชน

ตวอยางโปรแกรมโดยใชเครองหมาย * กบตวแปรพอยเตอร#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);

}25

Page 26: ตัวแปรชนิดพอยเตอร์ (Pointer) - Apipong Pingyod's Site...พอยเตอร (Pointer)พอยเตอร (Pointer) เป นต วแปรชน

ตวแปรพอยเตอรกบอารเรย

กรณของตวแปรอารเรยสามารถใชตวแปรพอยเตอรเพอหาต าแหนงในหนวยความจ าของตวแปรแตละตวในตวแปรอารเรยไดเชนเดยวกน คอ

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

112num[2]

0414

45

num[3]

0416

907num[4]

0418

0414

pt_num

0350

0418

pt_num

035026

Page 27: ตัวแปรชนิดพอยเตอร์ (Pointer) - Apipong Pingyod's Site...พอยเตอร (Pointer)พอยเตอร (Pointer) เป นต วแปรชน

ตวแปรพอยเตอรกบอารเรย 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

112num[2]

0414

45

num[3]

0416

907num[4]

0418

907

num[4] pt_num

0418 0230

temp

0310

27

Page 28: ตัวแปรชนิดพอยเตอร์ (Pointer) - Apipong Pingyod's Site...พอยเตอร (Pointer)พอยเตอร (Pointer) เป นต วแปรชน

ตวอยางโปรแกรมตวแปรพอยเตอรกบอารเรย#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]);}

28

Page 29: ตัวแปรชนิดพอยเตอร์ (Pointer) - Apipong Pingyod's Site...พอยเตอร (Pointer)พอยเตอร (Pointer) เป นต วแปรชน

ตวแปรพอยเตอรกบอารเรย

29

Page 30: ตัวแปรชนิดพอยเตอร์ (Pointer) - Apipong Pingyod's Site...พอยเตอร (Pointer)พอยเตอร (Pointer) เป นต วแปรชน

นอกจากนยงสามารถใชพอยนเตอรแทนอารเรย การอางถงคาในอารเรยโดยใช a[i] สามารถใช *(a+i)

เนองจากทกครงทอางถง a[i] ภาษาซจะท าหนาทแปลงเปน *(a+i) เพราะฉะนนการเขยนในรปแบบใดกใหผลลพธในการท างานเชนเดยวกน

การอางถงแอดเดรส เชน &a[i] จะมผลเทากบการใช a+i

การอางถงต าแหนงในอารเรยผานตวช

30

Page 31: ตัวแปรชนิดพอยเตอร์ (Pointer) - Apipong Pingyod's Site...พอยเตอร (Pointer)พอยเตอร (Pointer) เป นต วแปรชน

ในลกษณะเดยวกนการใชงานพอยนเตอรกสามารถใชค าสงในลกษณะอารเรยกได เชน การอางถง *(pa+i) สามารถเขยนดวย pa[i] กไดผลเชนเดยวกน สงทแตกตางกนของอารเรยและพอยนเตอร คอ พอยนเตอรเปนตวแปร แตอารเรยไมใชตวแปร

การอางถงต าแหนงในอารเรยผานตวช

31

Page 32: ตัวแปรชนิดพอยเตอร์ (Pointer) - Apipong Pingyod's Site...พอยเตอร (Pointer)พอยเตอร (Pointer) เป นต วแปรชน

การใชงาน 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) // 10x[1] และกมคาเทากบ *(x + 1) // 11x[2] และกมคาเทากบ *(x + 2) // 12

32

Page 33: ตัวแปรชนิดพอยเตอร์ (Pointer) - Apipong Pingyod's Site...พอยเตอร (Pointer)พอยเตอร (Pointer) เป นต วแปรชน

33

Page 34: ตัวแปรชนิดพอยเตอร์ (Pointer) - Apipong Pingyod's Site...พอยเตอร (Pointer)พอยเตอร (Pointer) เป นต วแปรชน

ผลลพธของโปรแกรม

34

Page 35: ตัวแปรชนิดพอยเตอร์ (Pointer) - Apipong Pingyod's Site...พอยเตอร (Pointer)พอยเตอร (Pointer) เป นต วแปรชน

ประโยชนของ Pointer

มประโยชนเมอตองเขยนโปรแกรมจดการกบโครงสรางขอมลขนาดใหญ ทมขอมลจานวนมาก การจดเรยงหรอการประมวลผลตอขอมลโดยใช pointer และ array แมจะทาไดรวดเรว แตในกรณทมขอมลจานวนมหาศาล การจดเรยงหรอประมวลผลหากกระทาตอตวขอมลใน array โดยตรงจะยงชาเกนไป

หลกเลยงการใช array เกบตวขอมล เมอตองการจดเรยงหรอประมวลผลกบขอมล เราจะทาทางออมโดยจดเรยงหรอประมวลผลกบคาของ pointer ทถกชซงทาไดรวดเรวกวาการกระทากบขอมลโดยตรงมาก ทาใหการจดการกบขอมลในโครงสรางขอมลทมขอมลจานวนมาก สามารถทาไดดวยความเรวสง

35

Page 36: ตัวแปรชนิดพอยเตอร์ (Pointer) - Apipong Pingyod's Site...พอยเตอร (Pointer)พอยเตอร (Pointer) เป นต วแปรชน

ประโยชนของของ Pointer

ขอสรปเรอง Pointer

ทาหนาทชไปยงตาแหนงเกบขอมลในหนวยความจา การประกาศ pointer ตองกาหนด data type ดวย ใช pointer ชไปยง pointer หรอชไปยง array หรอ array ของ pointer ได การอางถงตาแหนงของตวแปร ใชเครองหมาย & หนาตวแปร pointer

เชน &pt การอางถงคาในตวแปร ใชเครองหมาย * หนาตวแปร pointer เชน *pt pointer ทชไปยง pointer ใชดอกจนสองตว เชน int **p

36