05-530-111 computer programming 1

30
1 05-530-111 Computer 05-530-111 Computer Programming 1 Programming 1 บบบบบ บบบบบ 6 6 บบบบบบบบบบ บบบบบบบบบบ (Pointer) (Pointer)

Upload: marcus

Post on 14-Jan-2016

41 views

Category:

Documents


0 download

DESCRIPTION

05-530-111 Computer Programming 1. บทที่ 6 พอยน์เตอร์ (Pointer). หัวข้อศึกษา. พอยน์เตอร์คืออะไร สัญญลักษณ์ที่ใช้กับพอยน์เตอร์ การเรียกฟังก์ชันแบบ Call-by-Reference การกระทำทางคณิตศาสตร์กับพอยน์เตอร์ การจองหน่วยความจำ อาร์เรย์ของพอยน์เตอร์. พอยน์เตอร์คืออะไร. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 05-530-111 Computer Programming 1

1

05-530-111 Computer 05-530-111 Computer Programming 1Programming 1

บทท�� บทท�� 66พอยน์เตอร์ พอยน์เตอร์ (Pointer)(Pointer)

Page 2: 05-530-111 Computer Programming 1

หั�วข้�อศึ�กษา พอยน์เตอร์คื�ออะไร์ สั�ญญลั�กษณ์ท��ใช้�ก�บพอยน์เตอร์ การ์เร์�ยกฟั#งกช้�น์แบบ Call-by-

Reference การ์กร์ะท&าทางคืณ์'ตศึาสัตร์ก�บพอยน์เตอร์ การ์จองหัน์)วยคืวามจ&า อาร์เร์ยข้องพอยน์เตอร์

Page 3: 05-530-111 Computer Programming 1

พอยน์เตอร์คื�ออะไร์ เม��อม�การ์ปร์ะกาศึต�วแปร์ คื)าข้องต�วแปร์จะถู-กเก.บอย-)ใน์

หัน์)วยคืวามจ&า

แอดเดร์สัข้องต�วแปร์ คื�อ ต&าแหัน์)งใน์หัน์)วยคืวามจ&าท��ใช้�เก.บต�วแปร์ต�วน์�0น์ เข้�ยน์แทน์ด�วยเคืร์��องหัมาย &– เช้)น์ แอดเดร์สัข้องต�วแปร์ x เข้�ยน์แทน์ด�วย &x

560000

1055900

y

x

..

.

..

.

int x = 10;...

int y = 5;

Page 4: 05-530-111 Computer Programming 1

พอยน์เตอร์คื�ออะไร์ (ต)อ) พอยน์เตอร์ คื�อ ต�วแปร์ช้น์'ดหัน์��งท��ใช้�ใน์การ์เก.บคื)า

แอดเดร์สัข้องต�วแปร์ต�วอ��น์ พอยน์เตอร์ม�หัลัายช้น์'ด(ตามช้น์'ดต�วแปร์ท��ม�อย-))–พอยน์เตอร์ข้องต�วแปร์ int–พอยน์เตอร์ข้องต�วแปร์ float–พอยน์เตอร์ข้องต�วแปร์ char– ฯลัฯ

ปร์ะโยช้น์ข้องพอยน์เตอร์– ใช้�ใน์การ์ พ�ฒน์าโคืร์งสัร์�างข้�อม-ลั (Data

Structure)– ใช้�ใน์โปร์แกร์มท��ต�องม�การ์ต'ดต)อก�บหัน์)วยคืวามจ&า

โดยตร์ง

Page 5: 05-530-111 Computer Programming 1

สั�ญลั�กษณ์ท��ใช้�ก�บพอยน์เตอร์ การ์ปร์ะกาศึต�วแปร์ ใช้�เคืร์��องหัมาย * เช้)น์

– int *countPtr; countPtr เป4น์พอยน์เตอร์ข้อง int (ซึ่��งสัามาร์ถูใช้�ใน์การ์เก.บคื)าแอดเดร์สัข้องต�วแปร์ int ได�)

– char *str;

str เป4น์พอยน์เตอร์ข้อง char– float *nums;

nums เป4น์พอยน์เตอร์ข้อง float

Page 6: 05-530-111 Computer Programming 1

สั�ญลั�กษณ์ท��ใช้�ก�บพอยน์เตอร์ (ต)อ) การ์ก&าหัน์ดคื)าใหั�ก�บพอยน์เตอร์– ใช้�เคืร์��องหัมาย =– คื)าท��ก&าหัน์ดใหั�ก�บพอยน์เตอร์ต�องเป4น์คื)า

แอดเดร์สัข้องต�วแปร์

int num = 6;

int *numPtr;

numPtr = #

50000numPtr

6num

6numnumPtrก&าหัน์ดใหั� numPtr ช้�0

ไปท�� num

5000040000

Page 7: 05-530-111 Computer Programming 1

สั�ญลั�กษณ์ท��ใช้�ก�บพอยน์เตอร์ (ต)อ)

การ์อ�างอ'งถู�งคื)าใน์ต&าแหัน์)งท��พอยน์เตอร์ช้�0อย-)– เร์�ยกอ�กอย)างว)า “Dereferencing”– ใช้� เคืร์��องหัมาย * น์&าหัน์�าต�วแปร์– ต�วอย)างเช้)น์ cout << *numPtr;

*numPtr = 20;

6numnumPtr20

Page 8: 05-530-111 Computer Programming 1

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

ผลัลั�พธ์

Page 9: 05-530-111 Computer Programming 1

การ์เร์�ยกใช้�แบบ Call-by-Reference

การ์เร์�ยกใช้�ฟั#งกช้�น์ม� 2 แบบ คื�อ Call-by-Value แลัะ Call-by-Reference

Call-by-Value– ใช้�ว'ธ์�การ์สั)งคื)าข้องต�วแปร์ใหั�ก�บฟั#งกช้�น์– ไม)สัามาร์ถูแก�ไข้คื)าข้องอาร์ก'วเมน์ตภายใน์ฟั#งกช้�น์ได�– ใช้�ก�บฟั#งกช้�น์ท��ร์�บคื)าเข้�าเป4น์ต�วแปร์ธ์ร์ร์มดา (int, float,

char, ...) Call-by-Reference– ใช้�ว'ธ์�การ์สั)งแอดเดร์สัข้องต�วแปร์ไปใหั�ฟั#งกช้�น์– ใช้�ก�บฟั#งกช้�น์ท��ร์�บคื)าเข้�าเป4น์พอยน์เตอร์หัร์�ออาร์เร์ย

Page 10: 05-530-111 Computer Programming 1

ต�วอย)างท�� 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

Page 11: 05-530-111 Computer Programming 1

ต�วอย)างท�� 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

Page 12: 05-530-111 Computer Programming 1

การ์ใช้�ต�วด&าเน์'น์ทางคืณ์'ตศึาสัตร์ก�บพอยน์เตอร์

ต�วด&าเน์'น์การ์ทางคืณ์'ตศึาสัตร์ท��ม�กจะใช้�ก�บพอยน์เตอร์–+, -, ++, --, +=, -=– ใช้�ใน์การ์เลั��อน์พอยน์เตอร์ไปข้�างหัน์�าหัร์�อถูอยหัลั�ง

การ์เลั��อน์พอยน์เตอร์จะเลั��อน์ท�ลัะ 1 บลั.อก เช้)น์– ถู�าเป4น์พอยน์เตอร์ข้อง int 1 บลั.อกคื�อ 4 ไบต– ถู�าเป4น์พอยน์เตอร์ข้อง char 1 บลั.อกคื�อ 1 ไบต– ถู�าเป4น์พอยน์เตอร์ข้อง float 1 บลั.อกคื�อ 4 ไบต– ฯลัฯ

Page 13: 05-530-111 Computer Programming 1

ต�วอย)างการ์เลั��อน์พอยน์เตอร์

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;

Page 14: 05-530-111 Computer Programming 1

ต�วอย)างท�� 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

Page 15: 05-530-111 Computer Programming 1

การ์ใช้�คื&าสั��ง 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

Page 16: 05-530-111 Computer Programming 1

คืวามสั�มพ�น์ธ์ร์ะหัว)างอาร์เร์ยก�บพอยน์เตอร์

ต�วแปร์อาร์เร์ยแลัะพอยน์เตอร์สัามาร์ถูใช้�งาน์แทน์ก�น์ได�ใน์หัลัายโอกาสั

ต�วแปร์อาร์เร์ยถู�อเป4น์พอยน์เตอร์เน์��องจากคื)าใน์ต�วแปร์อาร์เร์ยคื�อแอดเดร์สัข้องอ�ลั�เมน์ตแร์ก

Page 17: 05-530-111 Computer Programming 1

คืวามสั�มพ�น์ธ์ร์ะหัว)างอาร์เร์ยก�บพอยน์เตอร์ (ต)อ)

สัามาร์ถูก&าหัน์ดใหั�พอยน์เตอร์ช้�0ไปท��อาร์เร์ยได�int b[5];

int *bPtr;

bPtr = b; // ม�คืวามหัมายเหัม�อน์ก�บ bPtr = &b[0]; สัามาร์ถูใช้�สั�ญลั�กษณ์ [] ก�บพอยน์เตอร์ได� เช้)น์–bPtr[2 ] หัมายถู�ง คื)าใน์ต&าแหัน์)งท��ถู�ดจาก

bPtr ช้�0อย-) ไปอ�ก 2 บลั.อก –bPtr[0] หัมายถู�ง คื)าใน์ต&าแหัน์)งเด�ยวก�บท��

bPtr ช้�0อย-)

Page 18: 05-530-111 Computer Programming 1

ต�วอย)างท�� 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

Page 19: 05-530-111 Computer Programming 1

การ์จองหัน์)วยคืวามจ&า (Memory Allocation) ใน์การ์ปร์ะกาศึต�วแปร์แต)ลัะคืร์�0ง คือมไพเลัอร์จะจองหัน์)วย

คืวามจ&าช้��วคืร์าว เพ��อใช้�เก.บคื)าข้องต�วแปร์ต�วน์�0น์ เช้)น์– int a; จองหัน์)วยคืวามจ&าข้น์าด 4 ไบต– char ch; จองหัน์)วยคืวามจ&าข้น์าด 1 ไบต – int nums[10]; จองหัน์)วยคืวามจ&าข้น์าด 40 ไบต

– char name[20]; จองหัน์)วยคืวามจ&าข้น์าด 20 ไบต แต)หัน์)วยคืวามจ&าเหัลั)าน์�0จะม�ข้อบเข้ตการ์ใช้�งาน์อย-)ภายใน์

เคืร์��องหัมาย {} ท��ได�ม�ปร์ะกาศึต�วแปร์ไว�เท)าน์�0น์– เช้)น์ ต�วแปร์ท��ปร์ะกาศึไว�ใน์ฟั#งกช้�น์ เม��อออกจากฟั#งกช้�น์แลั�ว

หัน์)วยคืวามจ&าสั&าหัร์�บต�วแปร์เหัลั)าน์�0น์ก.จะถู-กคื�น์ใหั�แก)ร์ะบบ

Page 20: 05-530-111 Computer Programming 1

การ์จองหัน์)วยคืวามจ&า (ต)อ)

ถู�าต�องการ์หัน์)วยคืวามจ&าเพ��อใช้�ใน์การ์เก.บข้�อม-ลั โดยสัามาร์ถูท��จะคื�น์หัน์)วยคืวามจ&าสั)วน์น์�0เม��อไร์ก.ได� จะต�องจองหัน์)วยคืวามจ&าโดยใช้�คื&าสั��ง new

การ์จองหัน์)วยคืวามจ&าโดยใช้�คื&าสั��ง new ม� 2 แบบ คื�อ

– การ์จองหัน์)วยคืวามจ&าแบบหัน์��งบลั.อก– การ์จองหัน์)วยคืวามจ&าเพ��อใช้�งาน์เป4น์อาร์เร์ย

Page 21: 05-530-111 Computer Programming 1

การ์จองหัน์)วยคืวามจ&าแบบหัน์��งบลั.อก

ใช้�แทน์การ์ปร์ะกาศึต�วแปร์ 1 ต�ว ร์-ปแบบ:

ต�วแปร์พอยน์เตอร์ = new ช้น์'ดต�วแปร์; เช้)น์

int *ptr;

ptr = new int; การ์คื�น์หัน์)วยคืวามจ&า

delete ptr;

ptr

Page 22: 05-530-111 Computer Programming 1

การ์จองหัน์)วยคืวามจ&าเพ��อใช้�งาน์เป4น์อาร์เร์ย ร์-ปแบบ:

ต�วแปร์พอยน์เตอร์ = new ช้น์'ดต�วแปร์[ข้น์าดอาร์เร์ย];

ต�วอย)างเช้)น์int *nums;

nums = new int[5];

การ์ใช้�งาน์จะใช้�แบบอาร์เร์ยหัร์�อพอยน์เตอร์ก.ได� เช้)น์nums[1] = 10; // same as *(num+1) = 10;

การ์คื�น์หัน์)วยคืวาม ต�องม�เคืร์��องหัมาย [] หัน์�าต�วแปร์พอยน์เตอร์ด�วยdelete []nums;

10nums

Page 23: 05-530-111 Computer Programming 1

ต�วอย)างท�� 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];

}

Page 24: 05-530-111 Computer Programming 1

ต�วอย)างท�� - 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;

}

Page 25: 05-530-111 Computer Programming 1

ต�วอย)างท�� - 66 (ต)อ)

จากโปร์แกร์ม จะเหั.น์ว)าสัามาร์ถูจองหัน์)วยคืวามจ&าได�ตามท��ผ-�ใช้�ก&าหัน์ด

แต)ถู�าใช้�ต�วแปร์อาร์เร์ยธ์ร์ร์มดา จะไม)สัามาร์ถูท&าอย)างน์�0ได�เน์��องจากข้น์าดอาร์เร์ย

ต�องเป4น์คื)าคืงท�� จะก&าหัน์ดเป4น์ต�วแปร์ไม)ได�

Page 26: 05-530-111 Computer Programming 1

สัตร์'ง (String) สัตร์'งม� 3 ช้น์'ด คื�อ– คื)าคืงท��ปร์ะเภทข้�อคืวาม เช้)น์ "Sanook"– อาร์เร์ยข้อง char –พอยน์เตอร์ช้น์'ด char *

Page 27: 05-530-111 Computer Programming 1

สัตร์'งแบบท��ใช้�อาร์เร์ยข้อง 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]

Page 28: 05-530-111 Computer Programming 1

สัตร์'งแบบท��ใช้�พอยน์เตอร์ช้น์'ด char *

สัามาร์ถูก&าหัน์ดคื)าโดยใช้�เคืร์��องหัมาย = ได�– char *str;– str = "Hello";

‘H’

str

‘e’ ‘l’ ‘l’ ‘o’ ‘\0’

หัน์)วยคืวามจ&าช้��วคืร์าว

Page 29: 05-530-111 Computer Programming 1

สัตร์'งแบบท��ใช้�พอยน์เตอร์ช้น์'ด char * (ต)อ)

สัามาร์ถูเปลั��ยน์แปลังข้�อคืวามโดยใช้�ฟั#งกช้�น์ strcpy ก.ได� แต)ต�องม�การ์จองหัน์)วยคืวามจ&าเพ��อใช้�ใน์การ์เก.บข้�อคืวามท��จะน์&ามาวางเสั�ยก)อน์

ต�วอย)างเช้)น์char *str = new char[6];

strcpy(str,"Hello");

Page 30: 05-530-111 Computer Programming 1

อาร์เร์ยข้องพอยน์เตอร์ ใช้�ใน์กร์ณ์�ท��ต�องการ์ใช้�งาน์พอยน์เตอร์

หัลัายๆ ต�ว ต�วอย)างเช้)น์

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]