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

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

  • Upload
    tumetr

  • View
    170

  • Download
    5

Embed Size (px)

Citation preview

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

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

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

พอยเตอร (Pointer)

พอยเตอร (Pointer) เปนตวแปรชนดพเศษ ในภาษา C ทำาหนาทเกบตำาแหนงท

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

ตวแปรพอยเตอรมลกษณะคลายตวแปรตารา งอาเรย แตทแตกตางกนคอ ตวแปรตารา

งอาเรยจะเกบเฉพาะคาตางๆ ทเปนชนดกนเดยว กบตวแปรอาเรย แตตวแปรพอยเตอรจะเกบ

เฉพาะคาตำาแหนง Address ตวแปรเทานน

Page 3: ตัวแปรชนิดพอยเตอร์ (Pointer)
Page 4: ตัวแปรชนิดพอยเตอร์ (Pointer)
Page 5: ตัวแปรชนิดพอยเตอร์ (Pointer)
Page 6: ตัวแปรชนิดพอยเตอร์ (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 เทานน

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

ตวแปรพอยเตอร ( Pointer variable)

ตวแปรใดกตามทเกบตำาแหนงเลขทของตวแปรอน หรอออปเจกตอน เรยกตวแปรนนวาเปนตวแป

รพอยเตอร คอมไพเลอรตองรดวยวาตวแปรพอยน เตอรเกบ address ของตวแปรเปนขอมลชนดใด เพราะการ เพมคา pointer ไปยง address ตาง ๆ จะ

เพมตามขนาดของขอมล การประกาศตวแปรพอยน เตอร จงตองประกาศใหตรงกบชนดของตวแปรนน

ๆ ดวย

การประกาศตวแปรพอยนเตอร ใน C++ มรปแบบดงน

data_type *pointer_var ; // define a ‘ pointer to type'

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

int *ptrint; // define a pointer to int

float *ptrx; // define a pointer to float

*ptrint และ *ptrx เปนตวแปรพอยนเตอรทเกบตำาแหนงเลขทหนวยความจำาของตวแปรทมชนด

ขอมลเปน Int และ float ตามลำาดบ เครองหมาย * มความหมายวาเปน pointer to type

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

ตวอยางตอไปนเปนการกำาหนดคา address ใหกบตวแปรพอยนเตอร

และใชประโยชนจากตวแปรพอยนเตอร ในการแสดงคา

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

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

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

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

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

& นำาหนาชอตวแปรในหนวยความจำาว ธการประกาศตวแปร

pointer=&variable;

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

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

PV = &V; เครองหมำย “&” หมำยถง ทอยของ V

(Address Operator)

ทอย ของ ทอย ของ VV ทอย ของ ทอย ของ VV คำของ คำของ VV คำของ คำของ VVPVPV VV

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

พอยเตอร (Pointer)

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

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

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

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

age; ตวแปรพอยเตอร

age จะไมไดเกบคำ23 แตจะเกบคำ

ตำำแหนงทขอมล 23 เกบอยแทน

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

พอยเตอร (Pointer)

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

แบบนคอ

int a,b,c;

a=b=10;

c=a;

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

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

พอยเตอร (Pointer)

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

int a,b;

int *c;

a=b=10;

c=&a; จะเหนไดวำ ตวแปร c เปน pointer และให c=&a

ฉะนน c จะไมไดเกบคำ 10 แต c จะเกบตำำแหนง ของตวแปร a ทอยในหนวยควำมจำำ และทำำให c

สำมำรถเขำถงขอมลในตวแปร a ได

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

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

Page 16: ตัวแปรชนิดพอยเตอร์ (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

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

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

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

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

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

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

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

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

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

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

#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);

}

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

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

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

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

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

ว ธกำรประกำศตวแปรvariable=*pointer;

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

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

PV = &V; เครองหมำย “&” หมำยถง ทอยของ V

(Address Operator)

U = *PV;ดงนนหำกเรำตองกำรอำงองคำ ของ V เรำ

ตองใชเครองหมำย “*” (Indirect Operator) ใหกบ Pointer แลวนำำคำทไดไปเกบไวใน U

ดงนน U จะมคำเทำกบ V

ทอย ของ ทอย ของ VV ทอย ของ ทอย ของ VV คำของ คำของ VV คำของ คำของ VVPVPV VV

Page 23: ตัวแปรชนิดพอยเตอร์ (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

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

พอยเตอร (Pointer)

ตวอยำงint a,b,*c;a=b=10;

printf("a=%d",a);

c=&a;

*c=21;

printf("a=%d",a);

เมอรนโปรแกรมนจะไดผลลพธอยำงไร?

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

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

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

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

Page 27: ตัวแปรชนิดพอยเตอร์ (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);

}

Page 28: ตัวแปรชนิดพอยเตอร์ (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

112

num[2]

0414

45

num[3]

0416

907

num[4]

0418

0414

pt_num

0350

0418

pt_num

0350

Page 29: ตัวแปรชนิดพอยเตอร์ (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

112

num[2]

0414

45

num[3]

0416

907

num[4]

0418

907

num[4] pt_num

0418 0230

temp

0310

Page 30: ตัวแปรชนิดพอยเตอร์ (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_5printf(“Value of x[3] = %d \n”,x[3]);

}

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

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

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

นอกจากนย งสามารถใชพอยน เตอร แทนอาร เรย การอ างถ งค าใน

อาร เรย โดยใช a[i] สามารถใช*(a+i)

เน องจากทกคร งท อ างถ ง a[i] ภาษาซจะท ำาหนาท แปลงเป น

*(a+i) เพราะฉะนนการเข ยนในร ปแบบใดกให ผลลพธ ในการทำางาน

เชนเด ยวก น

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

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

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

ในลกษณะเด ยวก นการใชงานพอยนเตอร ก สามารถใชค ำาส งในล กษณะ

อาร เรย ก ได เชน การอ างถ ง *(pa+i) สามารถเข ยนดวย pa[i] กได ผลเช น

เด ยวก น สงท แตกตางก นของอาร เรย และ

พอยนเตอร ค อ พอยนเตอร เปนต วแปรแตอาร เรยไม ใช ต วแปร

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

Page 34: ตัวแปรชนิดพอยเตอร์ (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) // 10 x[1] และก มค าเทากบ *(x + 1) // 11 x[2] และก มค าเทาก บ *(x + 2) // 12

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

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

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

ประโยชนของ Pointer มประโยชนเมอตองเขยนโปรแกรมจดการกบ

โครงสรางขอมลขนาดใหญ ทมขอมลจำานวนมาก การ จดเรยงหรอการประมวลผลตอขอมลโดยใช pointer

และ array แมจะทำาไดรวดเรว แตในกรณทมขอมล จำานวนมหาศาล การจดเรยงหรอประมวลผลหาก

กระทำาตอตวขอมลใน array โดยตรงจะยงชาเกนไป หลกเลยงการใช array เกบตวขอมล เมอตองการจด

เรยงหรอประมวลผลกบขอมล เราจะทำาทางออมโดยจด เรยงหรอประมวลผลกบคาของ pointer ทถกชซง

ทำาไดรวดเรวกวาการกระทำากบขอมลโดยตรงมากทำาใหการจดการกบขอมลในโครงสรางขอมลทมขอมล

จำานวนมาก สามารถทำาไดดวยความเรวสง

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

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

ทำาหนาทชไปยงตำาแหนงเกบขอมลในหนวยความจำา

การประกาศ pointer ตองกำาหนด data type ดวย

ใช pointer ชไปยง pointer หรอชไปยงarray หรอ array ของ pointer ได

การอางถงตำาแหนงของตวแปร ใชเครองหมาย& หนาตวแปร pointer เชน &pt

การอางถงคาในตวแปร ใชเครองหมาย * หนา ตวแปร pointer เชน *pt

pointer ทชไปยง pointer ใชดอกจนสองตว เชน int **p

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