บทท�� 9 การเขี�ยนโปรแกรมโดยใช้�ขี�อม�ล
ช้น�ดพอยท�เตอร�
พอยท�เตอร� (Pointer)
พอยท�เตอร� คื�อ ต�วแปรซึ่!�งเก#บต$าแหน&งขีองอ�กต�วแปรหน!�ง ซึ่!�งจะม�ขีนาดตามต$าแหน&ง machine และพอยท�เตอร�ต�องช้�)ไปย�ง type ขีองขี�อม�ลท��แน&ช้�ด เป+นการเขี�าถึ!งขี�อม�ลแบบ indirectly
ร�ปแบบการประกาศtype *var;
พอยท�เตอร� (Pointer) (ต&อ)
เช้&น int *iptr; //เก#บต$าแหน&งขีองต�วแปรอ��นท��เป+น integer
char *cptr //เก#บต$าแหน&งขีองต�วแปรอ��นท��เป+น character
iptr integer var
cptr char var
ต�วด$าเน�นการ
ในภาษาซึ่� ได�ม�การก$าหนดต�วด$าเน�นการ 2 ช้น�ดท��เก��ยวก�บพอยท�เตอร� ด�งน�)
* หมายถึ!ง indirect operator
เป+นการประกาศใช้�ต�วแปรพอยท�เตอร�น�)นละย�งสามารถึใช้�เพ��อเขี�าถึ!งเน�)อท��ขีองหน&วยคืวามจ$าท��ต�วแปรน�)นช้�)
& หมายถึ!ง address operator
เป+นต�วด$าเน�นการท��ใช้�เพ��อบอกต$าแหน&งขีองต�วแปร แทนท��จะเป+นคื&าท��เก#บขี�อม�ล
ต�วด$าเน�นการ (ต&อ)
ต�วอย&าง เช้&นchar *ptr = NULL;
เป+น declaration : ท$าการจองเน�)อท��ให�ต�วแปรพอยท�เตอร�ช้��อ ptr และช้�)ไปย�ง NULL
*ptr = NULL;
เป+น executable code : การให�คื&า NULL แก&หน&วยคืวามจ$าต$าแหน&งท�� ptr ช้�)ไป
ต�วอย&าง 1. โปรแกรมท��ใช้�พอยท�เตอร�
main(){
int num = 3;int *ptr;
ptr =# printf(“The value of num is %d.
Its address is %lu.”,*ptr,(long)ptr);}
ผลล�พธ์�ขีองต�วอย&าง
ผลล�พธ์�>The value of num is 3. Its address is 448925078.
หมายเหตุ� คื&าต$าแหน&งขีองต�วแปรไม&แน&นอนในแต&ละคืร�)งขีองการส��งด$าเน�นการ
คื$าอธ์�บายโปรแกรม
Declaration: int num = 3;
int *ptr;
num
int var
ptr
Executable code: ptr = #
num
ptr
3
3
ต�วอย&าง 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);}
}
ผลล�พธ์�โปรแกรมต�วอย&าง 2
ผลลพธ์ 1
2
3
4
5
6
หมายเหตุ� ถึ�าเราประกาศ int *ptr;เราสามารถึให� ptr ช้�)ไปย�งอาร�เรย�ได�ด�งน�) ptr = number;
หร�อ ptr = &number[0];
อธ์�บายโปรแกรม 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
ต�วอย&าง 3 ฟั4งก�ช้�นท��ท$าการคื$านวณบนต�วช้�)
int strlen(s)char *s;{
char *p = s;while(*p != ‘\0’)
p++;return (p-s);
}
คื$าอธ์�บายฟั4งก�ช้�นต�วอย&าง 3
เป+นฟั4งก�ช้�นท��ใช้�คื$านวณหาคืวามยาวขีอง string โดย string ท��ต�องการหาคืวามยาวได�มาจากการ
ผ&านคื&าต$าแหน&งขีอง string มาทางรายการอาร�ก�วเมนต�ขีองฟั4งก�ช้�น
A B C D E F \0S
Pส�)นส6ดคืวามยาว = P-S
อาร�เรย�ขีองพอยท�เตอร�
ในภาษาซึ่� สามารถึท��จะม�อาร�เรย�ท��เป+นพอยท�เตอร�เช้&นเด�ยวก�บม�อาร�เรย�ท��เป+นขี�อม�ลช้น�ดอ��นๆได� เช้&น int *parray[10];
parray[0]
parray[1]
parray[2]
.
.
parray[9]
int.var
int.var
int.var
int.var
ต�วอย&าง 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]);}
ผลล�พธ์�ขีองโปรแกรมต�วอย&าง 4
เป+นโปรแกรมท��ใช้�อาร�เรย�เก#บคื&าต$าแหน&งขีอง int var
จะได�ผลล�พธ์�ด�งน�)1
2
3
คื$าอธ์�บายโปรแกรม
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
อาร�เรย�ขีองพอยท�เตอร�บนต�วอ�กษร
เราสามารถึใช้�อาร�เรย�ขีองพอยท�เตอร�บนต�วอ�กษร ซึ่!�งก$าหนดคื&าเร��มต�นไปย�ง string ท��ม�คืวามยาวต&างก�นได� และแต&ละต�ว string ใช้�เน�)อท��ตามท��ต�องการเท&าน�)น
ซึ่!�งจะแสดงได�ด�งโปรแกรมต�วอย&างถึ�ดไปซึ่!�งจะร�บคื&าหมายเลขีเด�อน แล�วแสดงช้��อเด�อนน�)นทางหน�าจอ
ต�วอย&าง 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];)
}}
ผลล�พธ์�ขีองโปรแกรมต�วอย&าง 5
ผลลพธ์ Enter number of month
> 6
The name of month is June
คื$าอธ์�บายโปรแกรม
name[0]
name[1]
name[2]
name[12]
illegal month
January
February
.
.
December
Content ในSHEET
91. การก�าหนดตุวแปร Pointer 92 คณิ�ตุศาสตุร ของ Pointer 93 ความสมพนธ์ ของ Pointer และ Array 94 ความสมพนธ์ ของ Pointer และ
String9.5 Array ของ Pointer9.6 Pointer ของ Pointer9.7 Pointer กบ ข!อม"ลชน�ด Structure
9.1 การก�าหนดตุวแปร Pointer
การก$าหนดต�วแปร Pointer จะคืล�ายก�บการก$าหนดต�วแปรช้น�ดต&างๆ เพ�ยงแต&ต�องม�เคืร��องหมาย * หน�าช้��อต�วแปร ด�งน�)
int *pt;
ในท��น�)ก$าหนดให� pt เป+นต�วแปร Pointer ซึ่!�งเก#บ Address ขีองต�วแปรช้น�ดต�วเลขีจ$านวนเต#ม
เคืร��องหมายใน pointerคืวามหมายขีองเคืร��องหมาย 2 ช้น�ดใน pointer
คื�อ เคืร��องหมาย * จะให�คื&า ขีองขี�อม�ล ซึ่!�งเก#บ
อย�&ใน Address (Address น�)เก#บ อย�&ในต�วแปร Pointer ซึ่!�งอย�&หล�งเคืร��องหมาย * )
เคืร��องหมาย & จะให�คื&า Address ขีองต�วแปรซึ่!�งอย�&หล�งเคืร��องหมาย & ด�งต�วอย&าง
ขี�อระว�งในการใช้�งาน 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
9.2 คณิ�ตุศาสตุร ของ Pointer
ได�แก& +,++,- และ -- ต�วแปรหร�อคื&าคืงท�� ท��จะน$ามาบวก หร�อ ลบ ก�บต�วแปร Pointer จะเป+นช้น�ด เลขีจ$านวนเต#มเท&าน�)น เช้&น
pt = pt+60; pt --;
การเพ��มหร�อลดคื&าขีองต�วแปร Pointer ขี!)นก�บแปรช้น�ดขีองต�วแปรและ compiler จะต�คื&า byte ท��เก#บว&าเท&าใด เช้&น
9.2 คณิ�ตุศาสตุร ของ Pointer
ตย.เช้&นใน compiler ต�วหน!�ง เลขีจ$านวนเต#ม a อย�&ท�� Address 40 เม��อคื$าส��ง ptt++; เม��อถึ�กประมวล Pointer pt จะช้�)ไปท�� Address 42 (เพ��ม 2 Byte) ถึ�าต�วแปร a เป+นช้น�ดเลขีจ$านวนจร�ง Pointer pt จะช้�)ไปท�� Address 44 (เพ��ม 4 Byte)
(เพ��มเต�มด�ต�วอย&างโปรแกรมท�� -58)
9.3 ความสมพนธ์ ของ Pointer และ Array
Pointer จะช้�)ไปท��ส&วนต�นขีอง Array
(ต�วแปร Array ต�วแรก) ในต�วอย&างโปรแกรมท�� 9 คื$าส��ง pt = number จะท$าให�
Pointer pt ช้�)ไปท��ส&วนต�นขีอง Array number ในการพ�มพ�คื&าขีองต�วแปร Array แต&ละต�วท$าได�โดยเพ��มคื&า Address ในต�วแปร Pointer หร�อเล��อน Pointer ไปย�ง Address ท��ส�งขี!)น ซึ่!�งอย�&ต�ดก�น
(เพ��มเต�มด�ต�วอย&างโปรแกรมท�� 9-12)
9.4 ความสมพนธ์ ของ Pointer และ String
(เพ��มเต�มด�ต�วอย&างโปรแกรมท�� 13-17) ต�วอย&างโปแกรมท�� 13• บรรท�ดท�� 7 ม�คื$าส��ง spt = str; ท$าให� Pointer spt ช้�)ไปท��ส&วนต�นขีอง Array
String str • คื$าส��ง for ซึ่!�งใช้�สร�างล�ปในการพ�มพ�ขี�อม�ลใน
Array ม� การทดสอบเง��อนไขี โดยจะทดสอบคื&าท��ถึ�กช้�)คื&าเป+น String null
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;
ในโปรแกรมท�� 18 ก$าหนดให� pt เป+น Array ขีอง Pointer ซึ่!�งม�ต�วแปร Pointer 3 ต�ว ส$าหร�บเก#บ Address ขีองต�วแปรช้น�ดเลขีจ$านวนเต#ม ต�วแปร Pointer ต�วแปร Pointer แต&ละต�ว ถึ�กก$าหนดคื&าด�วย คื&า Address ขีองต�วแปรแต&ละต�วใน Array x จากน�)นจ!งเพ��มคื&าขีองต�วแปร Array x ท6กต�วแล�วเก#บใน ต�วแปร Array เด�ม
9.6 Pointer ของ Pointer
ร�ปประกอบท�� 1 Pointer ขีอง Pointer
ในการก$าหนด Pointer ขีอง Pointer จะต�องเพ��มเคืร��องหมาย * อ�ก 1 ต�ว หน�า Pointer เช้&น int **pt;
pt เป+นต�วแปร Pointer ซึ่!�งเก#บคื&า Address ขีองต�วแปร Pointer โดยต�วแปร Pointer ขีองต�วหล�งน�) จะเก#บ Address ขีองต�วแปรช้น�ดเลขีจ$านวนเต#ม
( เพ��มเต�มด�ต�วอย&างโปรแกรมท�� 20-21)
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 …..