05-530-111 computer programming 1
DESCRIPTION
05-530-111 Computer Programming 1. บทที่ 6 พอยน์เตอร์ (Pointer). หัวข้อศึกษา. พอยน์เตอร์คืออะไร สัญญลักษณ์ที่ใช้กับพอยน์เตอร์ การเรียกฟังก์ชันแบบ Call-by-Reference การกระทำทางคณิตศาสตร์กับพอยน์เตอร์ การจองหน่วยความจำ อาร์เรย์ของพอยน์เตอร์. พอยน์เตอร์คืออะไร. - PowerPoint PPT PresentationTRANSCRIPT
1
05-530-111 Computer 05-530-111 Computer Programming 1Programming 1
บทท�� บทท�� 66พอยน์เตอร์ พอยน์เตอร์ (Pointer)(Pointer)
หั�วข้�อศึ�กษา พอยน์เตอร์คื�ออะไร์ สั�ญญลั�กษณ์ท��ใช้�ก�บพอยน์เตอร์ การ์เร์�ยกฟั#งกช้�น์แบบ Call-by-
Reference การ์กร์ะท&าทางคืณ์'ตศึาสัตร์ก�บพอยน์เตอร์ การ์จองหัน์)วยคืวามจ&า อาร์เร์ยข้องพอยน์เตอร์
พอยน์เตอร์คื�ออะไร์ เม��อม�การ์ปร์ะกาศึต�วแปร์ คื)าข้องต�วแปร์จะถู-กเก.บอย-)ใน์
หัน์)วยคืวามจ&า
แอดเดร์สัข้องต�วแปร์ คื�อ ต&าแหัน์)งใน์หัน์)วยคืวามจ&าท��ใช้�เก.บต�วแปร์ต�วน์�0น์ เข้�ยน์แทน์ด�วยเคืร์��องหัมาย &– เช้)น์ แอดเดร์สัข้องต�วแปร์ x เข้�ยน์แทน์ด�วย &x
560000
1055900
y
x
..
.
..
.
int x = 10;...
int y = 5;
พอยน์เตอร์คื�ออะไร์ (ต)อ) พอยน์เตอร์ คื�อ ต�วแปร์ช้น์'ดหัน์��งท��ใช้�ใน์การ์เก.บคื)า
แอดเดร์สัข้องต�วแปร์ต�วอ��น์ พอยน์เตอร์ม�หัลัายช้น์'ด(ตามช้น์'ดต�วแปร์ท��ม�อย-))–พอยน์เตอร์ข้องต�วแปร์ int–พอยน์เตอร์ข้องต�วแปร์ float–พอยน์เตอร์ข้องต�วแปร์ char– ฯลัฯ
ปร์ะโยช้น์ข้องพอยน์เตอร์– ใช้�ใน์การ์ พ�ฒน์าโคืร์งสัร์�างข้�อม-ลั (Data
Structure)– ใช้�ใน์โปร์แกร์มท��ต�องม�การ์ต'ดต)อก�บหัน์)วยคืวามจ&า
โดยตร์ง
สั�ญลั�กษณ์ท��ใช้�ก�บพอยน์เตอร์ การ์ปร์ะกาศึต�วแปร์ ใช้�เคืร์��องหัมาย * เช้)น์
– int *countPtr; countPtr เป4น์พอยน์เตอร์ข้อง int (ซึ่��งสัามาร์ถูใช้�ใน์การ์เก.บคื)าแอดเดร์สัข้องต�วแปร์ int ได�)
– char *str;
str เป4น์พอยน์เตอร์ข้อง char– float *nums;
nums เป4น์พอยน์เตอร์ข้อง float
สั�ญลั�กษณ์ท��ใช้�ก�บพอยน์เตอร์ (ต)อ) การ์ก&าหัน์ดคื)าใหั�ก�บพอยน์เตอร์– ใช้�เคืร์��องหัมาย =– คื)าท��ก&าหัน์ดใหั�ก�บพอยน์เตอร์ต�องเป4น์คื)า
แอดเดร์สัข้องต�วแปร์
int num = 6;
int *numPtr;
numPtr = #
50000numPtr
6num
6numnumPtrก&าหัน์ดใหั� numPtr ช้�0
ไปท�� num
5000040000
สั�ญลั�กษณ์ท��ใช้�ก�บพอยน์เตอร์ (ต)อ)
การ์อ�างอ'งถู�งคื)าใน์ต&าแหัน์)งท��พอยน์เตอร์ช้�0อย-)– เร์�ยกอ�กอย)างว)า “Dereferencing”– ใช้� เคืร์��องหัมาย * น์&าหัน์�าต�วแปร์– ต�วอย)างเช้)น์ cout << *numPtr;
*numPtr = 20;
6numnumPtr20
2.5a
p
5.6b
q
ต�วอย)างท�� 6-1#include <iostream.h>
int main()
{
float a = 2.5,b = 5.6;
float *p,*q;
p = &a;
q = &b;
cout << "*p = " << *p << endl;
cout << "*q = " << *q << endl;
*p = *p + 1;
*q = *q + 3;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
return 0;
}
3.5 8.6
*p = 2.5*q = 5.6a = 3.5b = 8.6
ผลัลั�พธ์
การ์เร์�ยกใช้�แบบ Call-by-Reference
การ์เร์�ยกใช้�ฟั#งกช้�น์ม� 2 แบบ คื�อ Call-by-Value แลัะ Call-by-Reference
Call-by-Value– ใช้�ว'ธ์�การ์สั)งคื)าข้องต�วแปร์ใหั�ก�บฟั#งกช้�น์– ไม)สัามาร์ถูแก�ไข้คื)าข้องอาร์ก'วเมน์ตภายใน์ฟั#งกช้�น์ได�– ใช้�ก�บฟั#งกช้�น์ท��ร์�บคื)าเข้�าเป4น์ต�วแปร์ธ์ร์ร์มดา (int, float,
char, ...) Call-by-Reference– ใช้�ว'ธ์�การ์สั)งแอดเดร์สัข้องต�วแปร์ไปใหั�ฟั#งกช้�น์– ใช้�ก�บฟั#งกช้�น์ท��ร์�บคื)าเข้�าเป4น์พอยน์เตอร์หัร์�ออาร์เร์ย
ต�วอย)างท�� 6-2#include <iostream.h>
int squareByValue(int n);
int main()
{
int number = 5;
cout << "The original value of number is " << number <<endl;
number = squareByValue(number);
cout << "The new value of number is " << number << endl;
return 0;
}
int squareByValue(int n)
{
n = n*n;
return n;
}
5number
main
squareByValue
n525
25
ต�วอย)างท�� 6-3#include <iostream.h>
void squareByReference(int *nPtr);
int main()
{
int number = 5;
cout << "The original value of number is " << number <<endl;
squareByReference(&number);
cout << "The new value of number is " << number << endl;
return 0;
}
void squareByReference(int *nPtr)
{
*nPtr = *nPtr * *nPtr;
}nPtr
5number
main
squareByReference
25
การ์ใช้�ต�วด&าเน์'น์ทางคืณ์'ตศึาสัตร์ก�บพอยน์เตอร์
ต�วด&าเน์'น์การ์ทางคืณ์'ตศึาสัตร์ท��ม�กจะใช้�ก�บพอยน์เตอร์–+, -, ++, --, +=, -=– ใช้�ใน์การ์เลั��อน์พอยน์เตอร์ไปข้�างหัน์�าหัร์�อถูอยหัลั�ง
การ์เลั��อน์พอยน์เตอร์จะเลั��อน์ท�ลัะ 1 บลั.อก เช้)น์– ถู�าเป4น์พอยน์เตอร์ข้อง int 1 บลั.อกคื�อ 4 ไบต– ถู�าเป4น์พอยน์เตอร์ข้อง char 1 บลั.อกคื�อ 1 ไบต– ถู�าเป4น์พอยน์เตอร์ข้อง float 1 บลั.อกคื�อ 4 ไบต– ฯลัฯ
ต�วอย)างการ์เลั��อน์พอยน์เตอร์
v[0]
vPtr
v[1] v[2] v[3] v[4]
3000 3004 3008 3012 3016int v[5];int *vPtr;vptr = v;//or vPtr = &v[0];
v[0]
vPtr
v[1] v[2] v[3] v[4]
3000 3004 3008 3012 3016
vPtr = vPtr + 2;
ต�วอย)างท�� 6-4#include <iostream.h>
#include <string.h>
int main()
{
char msg[10];
char *ptr;
cout << "Enter text to reverse: ";
cin >> msg;
int len = strlen(msg);
ptr = &msg[len-1];
while(ptr >= &msg[0])
{
cout << *ptr;
ptr--;
}
return 0;
}
Enter text to reverse: CoeeoC
'\0''e''o''C'
msg[3]msg[2]msg[1]msg[0]...
msg[9]
ptr
การ์ใช้�คื&าสั��ง cout ก�บ char * แลัะ อาร์เร์ยข้อง char ถู�าใช้�คื&าสั��ง cout ก�บต�วแปร์อาร์เร์ยข้อง char
สั'�งท��พ'มพออกมาคื�อ ต�วอ�กษร์ต�0งแต)อ�ลั�เมน์ตแร์กไปจน์กว)าจะเจอ ‘\0’
ถู�าใช้�คื&าสั��ง cout ก�บพอยน์เตอร์ช้น์'ด char * สั'�งท��พ'มพออกมาคื�อ ต�วอ�กษร์ต�0งแต)ต&าแหัน์)งท��พอยน์เตอร์ช้�0อย-)ไปจน์กว)าจะเจอ ‘\0’
ต�วอย)างเช้)น์char name[8] = "Somchai";
cout << name;
char *namePtr = name;
cout << namePtr;
namePtr = &name[3];
cout << namePtr;
Somchai
Somchai
chai
คืวามสั�มพ�น์ธ์ร์ะหัว)างอาร์เร์ยก�บพอยน์เตอร์
ต�วแปร์อาร์เร์ยแลัะพอยน์เตอร์สัามาร์ถูใช้�งาน์แทน์ก�น์ได�ใน์หัลัายโอกาสั
ต�วแปร์อาร์เร์ยถู�อเป4น์พอยน์เตอร์เน์��องจากคื)าใน์ต�วแปร์อาร์เร์ยคื�อแอดเดร์สัข้องอ�ลั�เมน์ตแร์ก
คืวามสั�มพ�น์ธ์ร์ะหัว)างอาร์เร์ยก�บพอยน์เตอร์ (ต)อ)
สัามาร์ถูก&าหัน์ดใหั�พอยน์เตอร์ช้�0ไปท��อาร์เร์ยได�int b[5];
int *bPtr;
bPtr = b; // ม�คืวามหัมายเหัม�อน์ก�บ bPtr = &b[0]; สัามาร์ถูใช้�สั�ญลั�กษณ์ [] ก�บพอยน์เตอร์ได� เช้)น์–bPtr[2 ] หัมายถู�ง คื)าใน์ต&าแหัน์)งท��ถู�ดจาก
bPtr ช้�0อย-) ไปอ�ก 2 บลั.อก –bPtr[0] หัมายถู�ง คื)าใน์ต&าแหัน์)งเด�ยวก�บท��
bPtr ช้�0อย-)
ต�วอย)างท�� 6-5
#include <iostream.h>
int main()
{
int b[5] = {2,7,5,4,6};
int *bPtr;
bPtr = b;
cout << "bPtr[0] = " << bPtr[0] << endl;
cout << "bPtr[1] = " << bPtr[1] << endl;
bPtr = &b[2];
bPtr[1] = 10;
cout << "b[1] = " << b[1] << endl;
cout << "b[3] = " << b[3] << endl;
return 0;
}
bPtr[0] = 2bPtr[1] = 7b[1] = 7b[3] = 10
4
b[3]
5
b[2]
7
b[1]
2
b[0]
6
b[4]
bPtr
10
การ์จองหัน์)วยคืวามจ&า (Memory Allocation) ใน์การ์ปร์ะกาศึต�วแปร์แต)ลัะคืร์�0ง คือมไพเลัอร์จะจองหัน์)วย
คืวามจ&าช้��วคืร์าว เพ��อใช้�เก.บคื)าข้องต�วแปร์ต�วน์�0น์ เช้)น์– int a; จองหัน์)วยคืวามจ&าข้น์าด 4 ไบต– char ch; จองหัน์)วยคืวามจ&าข้น์าด 1 ไบต – int nums[10]; จองหัน์)วยคืวามจ&าข้น์าด 40 ไบต
– char name[20]; จองหัน์)วยคืวามจ&าข้น์าด 20 ไบต แต)หัน์)วยคืวามจ&าเหัลั)าน์�0จะม�ข้อบเข้ตการ์ใช้�งาน์อย-)ภายใน์
เคืร์��องหัมาย {} ท��ได�ม�ปร์ะกาศึต�วแปร์ไว�เท)าน์�0น์– เช้)น์ ต�วแปร์ท��ปร์ะกาศึไว�ใน์ฟั#งกช้�น์ เม��อออกจากฟั#งกช้�น์แลั�ว
หัน์)วยคืวามจ&าสั&าหัร์�บต�วแปร์เหัลั)าน์�0น์ก.จะถู-กคื�น์ใหั�แก)ร์ะบบ
การ์จองหัน์)วยคืวามจ&า (ต)อ)
ถู�าต�องการ์หัน์)วยคืวามจ&าเพ��อใช้�ใน์การ์เก.บข้�อม-ลั โดยสัามาร์ถูท��จะคื�น์หัน์)วยคืวามจ&าสั)วน์น์�0เม��อไร์ก.ได� จะต�องจองหัน์)วยคืวามจ&าโดยใช้�คื&าสั��ง new
การ์จองหัน์)วยคืวามจ&าโดยใช้�คื&าสั��ง new ม� 2 แบบ คื�อ
– การ์จองหัน์)วยคืวามจ&าแบบหัน์��งบลั.อก– การ์จองหัน์)วยคืวามจ&าเพ��อใช้�งาน์เป4น์อาร์เร์ย
การ์จองหัน์)วยคืวามจ&าแบบหัน์��งบลั.อก
ใช้�แทน์การ์ปร์ะกาศึต�วแปร์ 1 ต�ว ร์-ปแบบ:
ต�วแปร์พอยน์เตอร์ = new ช้น์'ดต�วแปร์; เช้)น์
int *ptr;
ptr = new int; การ์คื�น์หัน์)วยคืวามจ&า
delete ptr;
ptr
การ์จองหัน์)วยคืวามจ&าเพ��อใช้�งาน์เป4น์อาร์เร์ย ร์-ปแบบ:
ต�วแปร์พอยน์เตอร์ = new ช้น์'ดต�วแปร์[ข้น์าดอาร์เร์ย];
ต�วอย)างเช้)น์int *nums;
nums = new int[5];
การ์ใช้�งาน์จะใช้�แบบอาร์เร์ยหัร์�อพอยน์เตอร์ก.ได� เช้)น์nums[1] = 10; // same as *(num+1) = 10;
การ์คื�น์หัน์)วยคืวาม ต�องม�เคืร์��องหัมาย [] หัน์�าต�วแปร์พอยน์เตอร์ด�วยdelete []nums;
10nums
ต�วอย)างท�� 6-6#include <iostream.h>
int main()
{
int num_std;
cout << "Enter number of students: ";
cin >> num_std;
float *scores = new float[num_std];
int i;
for(i=0;i<num_std;i++)
{
cout << "Enter score of student " << i+1 << ": ";
cin >> scores[i];
}
ต�วอย)างท�� - 66 (ต)อ) cout << "\nThe scores are ";
float total = 0;
for(i=0;i<num_std;i++)
{
cout << scores[i] << " ";
total = total + scores[i];
}
cout << "\nTotal scores of all students is "<< total;
delete []scores;
return 0;
}
ต�วอย)างท�� - 66 (ต)อ)
จากโปร์แกร์ม จะเหั.น์ว)าสัามาร์ถูจองหัน์)วยคืวามจ&าได�ตามท��ผ-�ใช้�ก&าหัน์ด
แต)ถู�าใช้�ต�วแปร์อาร์เร์ยธ์ร์ร์มดา จะไม)สัามาร์ถูท&าอย)างน์�0ได�เน์��องจากข้น์าดอาร์เร์ย
ต�องเป4น์คื)าคืงท�� จะก&าหัน์ดเป4น์ต�วแปร์ไม)ได�
สัตร์'ง (String) สัตร์'งม� 3 ช้น์'ด คื�อ– คื)าคืงท��ปร์ะเภทข้�อคืวาม เช้)น์ "Sanook"– อาร์เร์ยข้อง char –พอยน์เตอร์ช้น์'ด char *
สัตร์'งแบบท��ใช้�อาร์เร์ยข้อง char ต�วอย)างเช้)น์
char name[8] = "Sawat";
การ์เปลั��ยน์แปลังข้�อคืวามใน์อาร์เร์ยข้อง char– หั�ามใช้�เคืร์��องหัมาย = (เช้)น์ name =
"Sombat"; ไม)ได�)– ใช้�ฟั#งกช้�น์ strcpy เช้)น์strcpy(name,"Sombat");
name[0]
'S'
name[1]
'a'
name[2]
'w'
name[3]
'a'
name[4]
't'
name[5]
'\0'
name[6] name[7]
สัตร์'งแบบท��ใช้�พอยน์เตอร์ช้น์'ด char *
สัามาร์ถูก&าหัน์ดคื)าโดยใช้�เคืร์��องหัมาย = ได�– char *str;– str = "Hello";
‘H’
str
‘e’ ‘l’ ‘l’ ‘o’ ‘\0’
หัน์)วยคืวามจ&าช้��วคืร์าว
สัตร์'งแบบท��ใช้�พอยน์เตอร์ช้น์'ด char * (ต)อ)
สัามาร์ถูเปลั��ยน์แปลังข้�อคืวามโดยใช้�ฟั#งกช้�น์ strcpy ก.ได� แต)ต�องม�การ์จองหัน์)วยคืวามจ&าเพ��อใช้�ใน์การ์เก.บข้�อคืวามท��จะน์&ามาวางเสั�ยก)อน์
ต�วอย)างเช้)น์char *str = new char[6];
strcpy(str,"Hello");
อาร์เร์ยข้องพอยน์เตอร์ ใช้�ใน์กร์ณ์�ท��ต�องการ์ใช้�งาน์พอยน์เตอร์
หัลัายๆ ต�ว ต�วอย)างเช้)น์
char *name_arr[3];
name_arr[0] = "Somchai";
name_arr[1] = "Sombat";
name_arr[2] = "Sawat";‘S’name_arr[0] ‘o’ ‘m’ ‘c’ ‘h’ ‘\0’‘a’ ‘i’
‘S’ ‘o’ ‘m’ ‘b’ ‘a’ ‘t’ ‘\0’name_arr[1]
‘S’ ‘a’ ‘w’ ‘a’ ‘t’ ‘\0’name_arr[2]