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

36
ตตตตตตตตตตตตตตตตตต (Pointer)

Upload: margo

Post on 04-Jan-2016

57 views

Category:

Documents


0 download

DESCRIPTION

ตัวแปรชนิดพอยเตอร์ (Pointer). พอยเตอร์ (Pointer). พอยเตอร์ (Pointer) เป็นตัวแปรชนิดพิเศษในภาษา C ทำหน้าที่เก็บตำแหน่งที่อยู่ (Address) ของตัวแปรชนิดอื่นๆ ที่อยู่ในหน่วยความจำ แทนที่จะเก็บข้อมูลเหมือนกันตัวแปรพื้นฐานชนิดอื่นๆ - PowerPoint PPT Presentation

TRANSCRIPT

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

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

ตั�วด�าเนินิการที่��ใช�ก�บตั�วแปรพอยเตัอร�

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

เคร#�องหมายู่ & (Ampersand) ใช�ในก็ารก็�าหนดตั�าแหน�งทำ��อยู่!�ของตั�วแป็รให�ก็�บพิอยู่เตัอร, โดยู่เม#�อสั่ร�างตั�วแป็รชน�ดพิอยู่เตัอร,มาแล�ว ว�ธี�ก็ารทำ��จำะน�าค�าตั�าแหน�งในหน�วยู่ความจำ�าของตั�วแป็รใดๆ มาเก็�บไว�ในตั�วแป็รพิอยู่เตัอร,ได�น�*น ตั�องใช�เคร#�องหมายู่ & โดยู่ให�เข�ยู่นเคร#�องหมายู่ & น�าหน�าช#�อตั�วแป็รในหน�วยู่ความจำ�า

วธี�การประกาศตั�วแปรpointer=&variable;

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

ตั�วด�าเนินิการที่��ใช�ก�บตั�วแปรพอยเตัอร�

PV = &V;เคร#�องหมายู่ “&” หมายู่ถึ4ง ทำ��อยู่!�ของ V

(Address Operator)

ที่��อย �ข้อง ที่��อย �ข้อง VVที่��อย �ข้อง ที่��อย �ข้อง VV ค่�าข้อง ค่�าข้อง VVค่�าข้อง ค่�าข้อง VVPVPV VV

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

พอยเตัอร� (Pointer)พิอยู่เตัอร,จำะเก็�บค�า

ตั�าแหน�งหร#อแอดเดรสั่ในหน�วยู่ความจำ�าของตั�วแป็รอ#�นๆ ไว�

ป็ก็ตั�ก็ารป็ระก็าศตั�วแป็รในก็ารเก็�บข�อม!ลเป็�นด�งน�*

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

ก็ารป็ระก็าศแบบพิอยู่เตัอร,int age;age = 23;int *pointer;pointer = & age;

ตั�วแป็รพิอยู่เตัอร, age จำะไม�ได�เก็�บค�า 23 แตั�จำะเก็�บค�าตั�าแหน�งทำ��ข�อม!ล

23 เก็�บอยู่!�แทำน

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

พอยเตัอร� (Pointer)

Pointer เป็�นตั�วแป็รป็ระเภทำหน4�งในภาษา C ทำ��ตั�างจำาก็ตั�วแป็รทำ��ว ๆ ไป็ค#อ ตั�วแป็รทำ��ว ๆ ไป็จำะป็ระก็าศแบบน�*ค#อint a,b,c;a=b=10;c=a;โดยู่ c จำะเก็�บค�า 10

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

พอยเตัอร� (Pointer)

แตั�ถึ�าป็ระก็าศด�งน�*int a,b; int *c;a=b=10;c=&a; จำะเห�นได�ว�า ตั�วแป็ร c เป็�น pointer และให� c=&a ฉะน�*น c จำะไม�ได�เก็�บค�า 10 แตั� c จำะเก็�บตั�าแหน�งของตั�วแป็ร a ทำ��อยู่!�ในหน�วยู่ความจำ�า และทำ�าให� c สั่ามารถึเข�าถึ4งข�อม!ลในตั�วแป็ร a ได�

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

แสดงตั�าแหนิ�งข้�อมู ลด�วย & (address operation)

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

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

ก็ารเข�ยู่นโป็รแก็รมเพิ#�อให�แสั่ดงตั�าแหน�งในหน�วยู่ความจำ�าทำ��เก็�บไว�ในตั�วแป็ร,พิอยู่เตัอร,ออก็ทำางหน�าจำอน�*น จำะใช�ค�าสั่��ง printf ตัามป็ก็ตั� แตั�จำะใช�ร!ป็แบบก็ารแสั่ดงผลเป็�น “%p” ซึ่4�งใช�สั่�าหร�บก็ารแสั่ดงตั�าแหน�งหน�วยู่ความจำ�าในตั�วแป็รพิอยู่เตัอร,โดยู่เฉพิาะ

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

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

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

ผลล�พธี�ข้องโปรแกรมู

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

ตั�วด�าเนินิการที่��ใช�ก�บตั�วแปรพอยเตัอร�

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

เค่ร(�องหมูาย * อ�างถึ*งข้�อมู ลหร(อค่�าที่��เก+บไว�ในิหนิ�วยค่วามูจำ�าตั�าแหนิ�งที่��ช�. โดยู่สั่ามารถึหาค�าข�อม!ลจำาก็ตั�าแหน�งในหน�วยู่ความจำ�าทำ��เก็�บไว�ในตั�วแป็รพิอยู่เตัอร, โดยู่ก็ารเข�ยู่นเคร#�องหมายู่ * น�าหน�าช#�อตั�วแป็รพิอยู่เตัอร,

วธี�การประกาศตั�วแปรvariable=*pointer;

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

ตั�วด�าเนินิการที่��ใช�ก�บตั�วแปรพอยเตัอร�

PV = &V;เคร#�องหมายู่ “&” หมายู่ถึ4ง ทำ��อยู่!�ของ V (Address

Operator)

U = *PV;ด�งน�*นหาก็เราตั�องก็ารอ�างอ�งค�าของ V เราตั�องใช�

เคร#�องหมายู่ “*” (Indirect Operator) ให�ก็�บ Pointer แล�วน�าค�าทำ��ได�ไป็เก็�บไว�ใน U

ด�งน�*น U จำะม�ค�าเทำ�าก็�บ V

ที่��อย �ข้อง ที่��อย �ข้อง VVที่��อย �ข้อง ที่��อย �ข้อง VV ค่�าข้อง ค่�าข้อง VVค่�าข้อง ค่�าข้อง VVPVPV VV

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

30

price2

05

10

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

พอยเตัอร� (Pointer)

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

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

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

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

ผลล�พธี�ข้องโปรแกรมู

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

11

2

num[2]

0414

45

num[3]

0416

90

7

num[4]

04

18

0414

pt_num

0350

0418

pt_num

0350

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

ตั�วแปรพอยเตัอร�ก�บอาร�เรย� int num[5]={12,34,112,45,907};

int *pt_num;

int temp;temp=*pt_num[4];

ค่�าข้อง temp จำะมู�ค่�าเที่�าใด?

12 34

num[0] num[1]

0410 0412

11

2

num[2]

0414

45

num[3]

0416

90

7

num[4]

04

18

907

num[4] pt_num

0418 0230

temp

0310

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

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

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

นิอกจำากนิ�.ย�งสามูารถึใช�พอยนิ�เตัอร�แที่นิอาร�เรย� การอ�างถึ*งค่�าในิอาร�เรย�โดยใช� a[i] สามูารถึใช� *(a+i)

เนิ(�องจำากที่/กค่ร�.งที่��อ�างถึ*ง a[i] ภาษาซี�จำะที่�าหนิ�าที่��แปลงเป3นิ *(a+i) เพราะฉะนิ�.นิการเข้�ยนิในิร ปแบบใดก+ให�ผลล�พธี�ในิการที่�างานิเช�นิเด�ยวก�นิ การอ�างถึ*งแอดเดรส เช�นิ &a[i] จำะมู�ผลเที่�าก�บการใช� a+i

การอ�างถึ*งตั�าแหนิ�งในิอาร�เรย�ผ�านิตั�วช�.

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

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

การอ�างถึ*งตั�าแหนิ�งในิอาร�เรย�ผ�านิตั�วช�.

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

การใช�งานิ Pointer ก�บอาร�เรย� 1มูตั ตั�วอย�าง

int x[3] = {10, 11, 12};

// Address ข้องอาร�เรย�ตั�วที่�� 0 ไมู�ได�มู�ค่�าเที่�าก�บ 10 แตั�อาจำมู�ค่�าเป3นิ 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 33: ตัวแปรชนิดพอยเตอร์  (Pointer)
Page 34: ตัวแปรชนิดพอยเตอร์  (Pointer)

ผลล�พธี�ข้องโปรแกรมู

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

ประโยชนิ�ข้องข้อง Pointer ม�ป็ระโยู่ชน,เม#�อตั�องเข�ยู่นโป็รแก็รมจำ�ดก็ารก็�บโครงสั่ร�างข�อม!ล

ขนาดใหญ่� ทำ��ม�ข�อม!ลจำ�านวนมาก็ ก็ารจำ�ดเร�ยู่งหร#อก็ารป็ระมวลผลตั�อข�อม!ลโดยู่ใช� pointer และ array แม�จำะทำ�าได�รวดเร�ว แตั�ในก็รณ�ทำ��ม�ข�อม!ลจำ�านวนมหาศาล ก็ารจำ�ดเร�ยู่งหร#อป็ระมวลผลหาก็ก็ระทำ�าตั�อตั�วข�อม!ลใน array โดยู่ตัรงจำะยู่�งช�าเก็�นไป็

หล�ก็เล��ยู่งก็ารใช� array เก็�บตั�วข�อม!ล เม#�อตั�องก็ารจำ�ดเร�ยู่งหร#อป็ระมวลผลก็�บข�อม!ล เราจำะทำ�าทำางอ�อมโดยู่จำ�ดเร�ยู่งหร#อป็ระมวลผลก็�บค�าของ pointer ทำ��ถึ!ก็ช�*ซึ่4�งทำ�าได�รวดเร�วก็ว�าก็ารก็ระทำ�าก็�บข�อม!ลโดยู่ตัรงมาก็ ทำ�าให�ก็ารจำ�ดก็ารก็�บข�อม!ลในโครงสั่ร�างข�อม!ลทำ��ม�ข�อม!ลจำ�านวนมาก็ สั่ามารถึทำ�าได�ด�วยู่ความเร�วสั่!ง

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

ประโยชนิ�ข้องข้อง Pointer ข้�อสร/ปเร(�อง Pointer

ทำ�าหน�าทำ��ช�*ไป็ยู่�งตั�าแหน�งเก็�บข�อม!ลในหน�วยู่ความจำ�า ก็ารป็ระก็าศ pointer ตั�องก็�าหนด data type ด�วยู่ ใช� pointer ช�*ไป็ยู่�ง pointer หร#อช�*ไป็ยู่�ง array หร#อ array ของ

pointer ได� ก็ารอ�างถึ4งตั�าแหน�งของตั�วแป็ร ใช�เคร#�องหมายู่ & หน�าตั�วแป็ร

pointer เช�น &pt ก็ารอ�างถึ4งค�าในตั�วแป็ร ใช�เคร#�องหมายู่ * หน�าตั�วแป็ร pointer เช�น

*pt pointer ทำ��ช�*ไป็ยู่�ง pointer ใช�ดอก็จำ�นสั่องตั�ว เช�น int **p