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

Post on 31-Mar-2020

16 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

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

พอยเตอร (Pointer)

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

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

2

3

4

5

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

7

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

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

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

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

pointer=&variable;

8

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

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

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

9

พอยเตอร (Pointer)

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

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

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

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

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

10

พอยเตอร (Pointer)

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

int a,b,c;

a=b=10;

c=a;

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

11

พอยเตอร (Pointer)

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

int a,b;

int *c;

a=b=10;

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

12

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

13

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

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

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

15

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

16

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

17

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

18

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

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

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

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

variable= *pointer;

19

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

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

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

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

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

20

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

พอยเตอร (Pointer)

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

22

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

23

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

24

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

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

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

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

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

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

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

29

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

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

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

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

30

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

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

31

การใชงาน 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

33

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

34

ประโยชนของ Pointer

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

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

35

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

ขอสรปเรอง Pointer

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

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

36

top related