33
บบบบบ 9 บบบบบบบบบบบบบบบบบบบบบ บบบบบบบบบบบบบบบบบบบบ

บทที่ 9 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์

Embed Size (px)

DESCRIPTION

บทที่ 9 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์. Asst.Prof.Urachart Kokaew. พอยท์เตอร์ (Pointer). พอยท์เตอร์ คือ ตัวแปรซึ่งเก็บตำแหน่งของอีกตัวแปรหนึ่ง ซึ่งจะมีขนาดตามตำแหน่ง machine และพอยท์เตอร์ต้องชี้ไปยัง type ของข้อมูลที่แน่ชัด เป็นการเข้าถึงข้อมูลแบบ indirectly รูปแบบการประกาศ. - PowerPoint PPT Presentation

Citation preview

Page 1: บทที่  9 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์

บทท�� 9 การเขี�ยนโปรแกรมโดยใช้�ขี�อม�ล

ช้น�ดพอยท�เตอร�

Page 2: บทที่  9 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์

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

พอยท�เตอร� คื�อ ต�วแปรซึ่!�งเก#บต$าแหน&งขีองอ�กต�วแปรหน!�ง ซึ่!�งจะม�ขีนาดตามต$าแหน&ง machine และพอยท�เตอร�ต�องช้�)ไปย�ง type ขีองขี�อม�ลท��แน&ช้�ด เป+นการเขี�าถึ!งขี�อม�ลแบบ indirectly

ร�ปแบบการประกาศtype *var;

Page 3: บทที่  9 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์

พอยท�เตอร� (Pointer) (ต&อ)

เช้&น int *iptr; //เก#บต$าแหน&งขีองต�วแปรอ��นท��เป+น integer

char *cptr //เก#บต$าแหน&งขีองต�วแปรอ��นท��เป+น character

iptr integer var

cptr char var

Page 4: บทที่  9 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์

ต�วด$าเน�นการ

ในภาษาซึ่� ได�ม�การก$าหนดต�วด$าเน�นการ 2 ช้น�ดท��เก��ยวก�บพอยท�เตอร� ด�งน�)

* หมายถึ!ง indirect operator

เป+นการประกาศใช้�ต�วแปรพอยท�เตอร�น�)นละย�งสามารถึใช้�เพ��อเขี�าถึ!งเน�)อท��ขีองหน&วยคืวามจ$าท��ต�วแปรน�)นช้�)

& หมายถึ!ง address operator

เป+นต�วด$าเน�นการท��ใช้�เพ��อบอกต$าแหน&งขีองต�วแปร แทนท��จะเป+นคื&าท��เก#บขี�อม�ล

Page 5: บทที่  9 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์

ต�วด$าเน�นการ (ต&อ)

ต�วอย&าง เช้&นchar *ptr = NULL;

เป+น declaration : ท$าการจองเน�)อท��ให�ต�วแปรพอยท�เตอร�ช้��อ ptr และช้�)ไปย�ง NULL

*ptr = NULL;

เป+น executable code : การให�คื&า NULL แก&หน&วยคืวามจ$าต$าแหน&งท�� ptr ช้�)ไป

Page 6: บทที่  9 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์

ต�วอย&าง 1. โปรแกรมท��ใช้�พอยท�เตอร�

main(){

int num = 3;int *ptr;

ptr =# printf(“The value of num is %d.

Its address is %lu.”,*ptr,(long)ptr);}

Page 7: บทที่  9 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์

ผลล�พธ์�ขีองต�วอย&าง

ผลล�พธ์�>The value of num is 3. Its address is 448925078.

หมายเหตุ� คื&าต$าแหน&งขีองต�วแปรไม&แน&นอนในแต&ละคืร�)งขีองการส��งด$าเน�นการ

Page 8: บทที่  9 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์

คื$าอธ์�บายโปรแกรม

Declaration: int num = 3;

int *ptr;

num

int var

ptr

Executable code: ptr = #

num

ptr

3

3

Page 9: บทที่  9 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์

ต�วอย&าง 2 โปรแกรมท��ใช้�พอยท�เตอร�

main(){

static int number[6] = {1,2,3,4,5,6};int i,*ptr;

for(i=0;i<6;i++){ ptr = &number[i];

printf(“%d\n”,*ptr);}

}

Page 10: บทที่  9 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์

ผลล�พธ์�โปรแกรมต�วอย&าง 2

ผลลพธ์ 1

2

3

4

5

6

หมายเหตุ� ถึ�าเราประกาศ int *ptr;เราสามารถึให� ptr ช้�)ไปย�งอาร�เรย�ได�ด�งน�) ptr = number;

หร�อ ptr = &number[0];

Page 11: บทที่  9 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์

อธ์�บายโปรแกรม 2

1

2

3

4

5

6

number ptr 0

1

2

3

4

5

i = 0;

i = 1;

i = 2;

i = 3;

i = 4;

i = 5;

ptr

ptr

ptr

ptr

ptr

Page 12: บทที่  9 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์

ต�วอย&าง 3 ฟั4งก�ช้�นท��ท$าการคื$านวณบนต�วช้�)

int strlen(s)char *s;{

char *p = s;while(*p != ‘\0’)

p++;return (p-s);

}

Page 13: บทที่  9 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์

คื$าอธ์�บายฟั4งก�ช้�นต�วอย&าง 3

เป+นฟั4งก�ช้�นท��ใช้�คื$านวณหาคืวามยาวขีอง string โดย string ท��ต�องการหาคืวามยาวได�มาจากการ

ผ&านคื&าต$าแหน&งขีอง string มาทางรายการอาร�ก�วเมนต�ขีองฟั4งก�ช้�น

A B C D E F \0S

Pส�)นส6ดคืวามยาว = P-S

Page 14: บทที่  9 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์

อาร�เรย�ขีองพอยท�เตอร�

ในภาษาซึ่� สามารถึท��จะม�อาร�เรย�ท��เป+นพอยท�เตอร�เช้&นเด�ยวก�บม�อาร�เรย�ท��เป+นขี�อม�ลช้น�ดอ��นๆได� เช้&น int *parray[10];

parray[0]

parray[1]

parray[2]

.

.

parray[9]

int.var

int.var

int.var

int.var

Page 15: บทที่  9 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์

ต�วอย&าง 4 โปรแกรมอาร�เรย�ขีองพอยท�เตอร�

main(){

int j,n1=1;n2=2;n3=3;*ptr,*parray[4]; parray[1] = &n1; parray[2] = &n2; ptr = &n3; parray[3] = ptr;for(j=1;j<4;j++)

printf(“%d\n”,*parray[j]);}

Page 16: บทที่  9 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์

ผลล�พธ์�ขีองโปรแกรมต�วอย&าง 4

เป+นโปรแกรมท��ใช้�อาร�เรย�เก#บคื&าต$าแหน&งขีอง int var

จะได�ผลล�พธ์�ด�งน�)1

2

3

Page 17: บทที่  9 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์

คื$าอธ์�บายโปรแกรม

declaration

int n1=1,n2=2,n3=3,*ptr, *parray[4]

executable code

1 2 3parray

[0] [1] [2] [3] ptr

n1 n2 n3 1 2 3

n1 n2 n3

parray

[0] [1] [2] [3] ptr

Page 18: บทที่  9 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์

อาร�เรย�ขีองพอยท�เตอร�บนต�วอ�กษร

เราสามารถึใช้�อาร�เรย�ขีองพอยท�เตอร�บนต�วอ�กษร ซึ่!�งก$าหนดคื&าเร��มต�นไปย�ง string ท��ม�คืวามยาวต&างก�นได� และแต&ละต�ว string ใช้�เน�)อท��ตามท��ต�องการเท&าน�)น

ซึ่!�งจะแสดงได�ด�งโปรแกรมต�วอย&างถึ�ดไปซึ่!�งจะร�บคื&าหมายเลขีเด�อน แล�วแสดงช้��อเด�อนน�)นทางหน�าจอ

Page 19: บทที่  9 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์

ต�วอย&าง 5 อาร�เรย�ขีองพอยท�เตอร�บนต�วอ�กษร

char *month();

main()

{ int num;

puts(“Enter number of month”);

scanf(“%d”,num);

printf(“The name of month is %s”,month(num));

}

char *month(n)int n;{ static char *name []= { “illegal month”,“January”,

“February”,“March”,“April”,“May”,“June”,“July”, “August”,“September”, “October”,“November”, “December”};return((n<1 || n>12)?name[0]: name[n];)

}}

Page 20: บทที่  9 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์

ผลล�พธ์�ขีองโปรแกรมต�วอย&าง 5

ผลลพธ์ Enter number of month

> 6

The name of month is June

Page 21: บทที่  9 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์

คื$าอธ์�บายโปรแกรม

name[0]

name[1]

name[2]

name[12]

illegal month

January

February

.

.

December

Page 22: บทที่  9 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์

Content ในSHEET

91. การก�าหนดตุวแปร Pointer 92 คณิ�ตุศาสตุร ของ Pointer 93 ความสมพนธ์ ของ Pointer และ Array 94 ความสมพนธ์ ของ Pointer และ

String9.5 Array ของ Pointer9.6 Pointer ของ Pointer9.7 Pointer กบ ข!อม"ลชน�ด Structure

Page 23: บทที่  9 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์

9.1 การก�าหนดตุวแปร Pointer

การก$าหนดต�วแปร Pointer จะคืล�ายก�บการก$าหนดต�วแปรช้น�ดต&างๆ เพ�ยงแต&ต�องม�เคืร��องหมาย * หน�าช้��อต�วแปร ด�งน�)

int *pt;

ในท��น�)ก$าหนดให� pt เป+นต�วแปร Pointer ซึ่!�งเก#บ Address ขีองต�วแปรช้น�ดต�วเลขีจ$านวนเต#ม

Page 24: บทที่  9 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์

เคืร��องหมายใน pointerคืวามหมายขีองเคืร��องหมาย 2 ช้น�ดใน pointer

คื�อ เคืร��องหมาย * จะให�คื&า ขีองขี�อม�ล ซึ่!�งเก#บ

อย�&ใน Address (Address น�)เก#บ อย�&ในต�วแปร Pointer ซึ่!�งอย�&หล�งเคืร��องหมาย * )

เคืร��องหมาย & จะให�คื&า Address ขีองต�วแปรซึ่!�งอย�&หล�งเคืร��องหมาย & ด�งต�วอย&าง

Page 25: บทที่  9 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์

ขี�อระว�งในการใช้�งาน pointer

ต�วอย&างโปรแกรมท�� 2คื&าเปล��ยนไปตามท�� pointer ก$าหนดใหม&เพราะต�วช้�)

ถึ�กก$าหนดใหม& ต�วอย&างโปรแกรมท�� 3"Warning c:\prg\Prg08-03.cpp:Suspicious pointer Conversion in

function main“ [C++ Error] pointer1.cpp(28): E2034 Cannot convert 'int

*' to 'float *'

ต�วอย&างโปรแกรมท�� 4Null pointer assignment

Page 26: บทที่  9 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์

9.2 คณิ�ตุศาสตุร ของ Pointer

    ได�แก& +,++,- และ -- ต�วแปรหร�อคื&าคืงท�� ท��จะน$ามาบวก หร�อ ลบ ก�บต�วแปร Pointer จะเป+นช้น�ด เลขีจ$านวนเต#มเท&าน�)น เช้&น

pt = pt+60;       pt --;

    การเพ��มหร�อลดคื&าขีองต�วแปร Pointer ขี!)นก�บแปรช้น�ดขีองต�วแปรและ compiler จะต�คื&า byte ท��เก#บว&าเท&าใด เช้&น    

Page 27: บทที่  9 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์

9.2 คณิ�ตุศาสตุร ของ Pointer

ตย.เช้&นใน compiler ต�วหน!�ง เลขีจ$านวนเต#ม a อย�&ท�� Address 40 เม��อคื$าส��ง ptt++; เม��อถึ�กประมวล Pointer pt จะช้�)ไปท�� Address 42 (เพ��ม 2 Byte) ถึ�าต�วแปร a เป+นช้น�ดเลขีจ$านวนจร�ง Pointer pt จะช้�)ไปท�� Address 44 (เพ��ม 4 Byte)

(เพ��มเต�มด�ต�วอย&างโปรแกรมท�� -58)

Page 28: บทที่  9 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์

9.3 ความสมพนธ์ ของ Pointer และ Array

Pointer จะช้�)ไปท��ส&วนต�นขีอง Array

(ต�วแปร Array ต�วแรก) ในต�วอย&างโปรแกรมท�� 9 คื$าส��ง pt = number จะท$าให�

Pointer pt ช้�)ไปท��ส&วนต�นขีอง Array number ในการพ�มพ�คื&าขีองต�วแปร Array แต&ละต�วท$าได�โดยเพ��มคื&า Address ในต�วแปร Pointer หร�อเล��อน Pointer ไปย�ง Address ท��ส�งขี!)น ซึ่!�งอย�&ต�ดก�น

(เพ��มเต�มด�ต�วอย&างโปรแกรมท�� 9-12)

Page 29: บทที่  9 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์

9.4 ความสมพนธ์ ของ Pointer และ String

(เพ��มเต�มด�ต�วอย&างโปรแกรมท�� 13-17) ต�วอย&างโปแกรมท�� 13• บรรท�ดท�� 7 ม�คื$าส��ง spt = str; ท$าให� Pointer spt ช้�)ไปท��ส&วนต�นขีอง Array

String str • คื$าส��ง for ซึ่!�งใช้�สร�างล�ปในการพ�มพ�ขี�อม�ลใน

Array ม� การทดสอบเง��อนไขี โดยจะทดสอบคื&าท��ถึ�กช้�)คื&าเป+น String null

Page 30: บทที่  9 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์

9.5 Array ของ Pointer

(เพ��มเต�มด�ต�วอย&างโปรแกรมท�� 18-19)Array ขีอง Pointer จะเก#บ Address ขีองต�วแปร ตามช้น�ด

ขี�อม�ลต�วแปร ม�ร�ปแบบด�งน�) Data type *pointer namr[size];ต�วอย&างเช้&น int *iap[5];         Array ขีอง Pointer iap จะม�ต�วแปร Pointer 5 ต�ว

ส$าหร�บเก#บ Address ขีองต�วแปรช้น�ดต�วช้น�ดเลขีจ$านวนเต#ม ถึ�าต�องการให�ต�วแปร Pointer ต�วท�� 2 เก#บ Address ขีองต�วแปร ช้น�ดเลขีจ$านวนเต#ม x จะเขี�ยนด�งน�) iap[2] =&x;

Page 31: บทที่  9 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์

      ในโปรแกรมท�� 18 ก$าหนดให� pt เป+น Array ขีอง Pointer ซึ่!�งม�ต�วแปร Pointer 3 ต�ว ส$าหร�บเก#บ Address ขีองต�วแปรช้น�ดเลขีจ$านวนเต#ม ต�วแปร Pointer ต�วแปร Pointer แต&ละต�ว ถึ�กก$าหนดคื&าด�วย คื&า Address ขีองต�วแปรแต&ละต�วใน Array x จากน�)นจ!งเพ��มคื&าขีองต�วแปร Array x ท6กต�วแล�วเก#บใน ต�วแปร Array เด�ม

Page 32: บทที่  9 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์

9.6 Pointer ของ Pointer

 

ร�ปประกอบท�� 1 Pointer ขีอง Pointer

        ในการก$าหนด Pointer ขีอง Pointer จะต�องเพ��มเคืร��องหมาย * อ�ก 1 ต�ว หน�า Pointer เช้&น int **pt;

        pt เป+นต�วแปร Pointer ซึ่!�งเก#บคื&า Address ขีองต�วแปร Pointer โดยต�วแปร Pointer ขีองต�วหล�งน�) จะเก#บ Address ขีองต�วแปรช้น�ดเลขีจ$านวนเต#ม 

( เพ��มเต�มด�ต�วอย&างโปรแกรมท�� 20-21)

Page 33: บทที่  9 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์

9.7 Pointer กบข!อม"ลชน�ด Structure ผลล�พธ์� ต�วอย&างโปรแกรมท�� 22

Input data to structure by pointer 3 Item:Code: 121Name: AAAge: 12Code: 122Name: BBAge: 23Code: 123Name: CCAge: 14Display data from structure by use pointer ->121AA12 …..