21
ตตตตตตตตตตตตตตต ตตต (Pointer) http:// www.renvi.src.ku.ac.th

ตัวแปรประเภทตัวชี้ (Pointer)

  • Upload
    bing

  • View
    71

  • Download
    0

Embed Size (px)

DESCRIPTION

ตัวแปรประเภทตัวชี้ (Pointer). http://www.renvi.src.ku.ac.th. ตัวแปรพอยท์เตอร์กับอาร์เรย์. พอยท์เตอร์ของพอยท์เตอร์. 4. 6. Today Agenda. pointer?. อาร์เรย์ของพอยท์เตอร์. 1. 5. 2. การประกาศตัวแปรพอยท์เตอร์. การแสดงตำแหน่ง, ค่าของข้อมูลของตัวแปรที่พอยท์เตอร์ชี้อยู่. 3. Pointer ?. - PowerPoint PPT Presentation

Citation preview

ตั�วแปรประเภทตั�วชี้� (Pointer)ตั�วแปรประเภทตั�วชี้� (Pointer)http://www.renvi.src.ku.ac.th

Today Agenda

pointer?1

การประกาศตั�วแปรพอยท�เตัอร�2

การแสดงตั�าแหน่�ง, ค่�าของข�อมู!ลของตั�วแปรท�#พอยท�เตัอร�ชี้� อย!�3

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

2

อาร�เรย�ของพอยท�เตัอร�5

พอยท�เตัอร�ของพอยท�เตัอร�6

Pointer ?

เมู%#อมู�การประกาศตั�วแปรใด ๆ ข( น่ใน่โปรแกรมู ค่อมูไพเลอร�ของ C จะจ�ดการจองพ% น่ท�#ใน่หน่�วยค่วามูจ�า ณ ตั�าแหน่�งท�#ว�างเพ%#อเป-น่ท�#เก.บข�อมู!ลของตั�วแปรน่� น่

ปกตั/ผู้!�พ�ฒน่าจะไมู�ทราบว�าตั�าแหน่�งท�#เก.บข�อมู!ลน่� น่อย!� ณ ตั�าแหน่�งใด

หากตั�องการทราบตั�าแหน่�งของข�อมู!ลใน่หน่�วยค่วามูจ�า สามูารถท�าได�โดยการใชี้� ตั�วแปรประเภทตั�วชี้� (Pointer)

3

ตั�วอย�าง:int counter = 100;char sex = ‘M’;float gpa = 3.21;

ตั�วแปรตั�าแหน่�งบน่หน่�วยค่วามู

จ�า

ค่�าของข�อมู!ล

counter 1001 100

sex 1003 ‘M’

gpa 1004 3.21

การประกาศตั�วแปรชี้น่/ด Pointer

ร!ปแบบการใชี้�งาน่

ชี้น่/ดข�อมู!ล เป็�น ชน�ดของข�อมู�ลพอยท์�เตอร์� ชี้%#อตั�วแปร เป็�น ช��อของต�วแป็ร์พอยท์�เตอร์� เช�น

• int *pt_int; ต�วแป็ร์พอยเตอร์�น��จะช��ไป็ย�งชน�ดข�อมู�ลท์��__________

• char *pt_char ต�วแป็ร์พอยท์�เตอร์�น��จะช��ไป็ย�งชน�ดข�อมู�ลท์�� ________

• float *pt_float ต�วแป็ร์พอยท์�เตอร์�น��จะช��ไป็ย�งชน�ดข�อมู�ลท์�� ________

4

ชี้น่/ดข�อมู!ล *ชี้%#อตั�วแปร;

การแสดงตั�าแหน่�งข�อมู!ลท�#พอยท�เตัอร�ชี้�

ประกาศตั�วแปรส�าหร�บเก.บข�อมู!ฃประกาศตั�วแปรพอยท�เตัอร�____________________________________

5

ตั�วแปรตั�าแหน่�งบน่หน่�วยค่วามู

จ�า

ค่�าของข�อมู!ล

ตั�วแปรพอยท�เตัอร�

counter 1001 100 pt_count

ersex 1003 ‘M’ pt_sexgpa 1004 3.21 pt_gpa

การแสดงตั�าแหน่�งข�อมู!ลท�#พอยท�เตัอร�ชี้� (ตั�อ)

1. int counter = 100;2. int *pt_counter;3. char sex = ‘M’;4. char *pt_sex;5. float gpa = 3.21;6. float *pt_gpa;

6

ตั�วแปรตั�าแหน่�งบน่หน่�วยค่วามู

จ�า

ค่�าของข�อมู!ล

ตั�วแปรพอยท�เตัอร�

counter 1001 100 pt_count

ersex 1003 ‘M’ pt_sexgpa 1004 3.21 pt_gpa

การแสดงตั�าแหน่�งข�อมู!ลท�#พอยท�เตัอร�ชี้� (ตั�อ)

1. int counter = 100;2. int *pt_counter;3. pt_counter =

&counter;

7

counter

100

1001

pt_counter

1003

_____

การแสดงตั�าแหน่�งข�อมู!ลท�#พอยท�เตัอร�ชี้� (ตั�อ)

8

ร!ปแบบการใชี้�งาน่

ตั�วแปรพอยท�เตัอร� เป-น่ ต�วแป็ร์ชน�ดพอยท์�เตอร์�ท์��สร์�างไว�

ชี้%#อตั�วแปรท�#ตั�องการทราบตั�าแหน่�ง อย�าล%มูว�า ท์��งต�วแป็ร์พอยท์�เตอร์�และต�วแป็ร์ท์��“

ต�องการ์ท์ร์าบต%าแหน�งต�องเป็�นป็ร์ะเภท์ข�อมู�ลชน�ดเด�ยวก�น”

และ เร์าใช� %p เป็�นร์ห�สท์��ใช�ในการ์แสดงข�อมู�ลป็ร์ะเภท์พอยท์�เตอร์�

ตั�วแปรพอยท�เตัอร� = &ชี้%#อตั�วแปรท�#ตั�องการทราบตั�าแหน่�ง;

การแสดงตั�าแหน่�งข�อมู!ลท�#พอยท�เตัอร�ชี้� (ตั�อ)ตั�วอย�างการใชี้�งาน่

1. int counter = 100;2. int *pt_counter;3. pt_counter = &counter;4. printf(“address of counter is: %p\n”, pt_counter);5. char sex = ‘M’;6. char *pt_sex;7. pt_sex = &sex8. printf(“address of sex is: %p\n”, pt_sex);9. float gpa = 3.21;10. float *pt_gpa;11. pt_gpa = &gpa;12. printf(“address of gpa is: %p”, pt_gpa);

9

การแสดงค่�าของข�อมู!ลท�#ตั�วแปรพอยท�เตัอร�ชี้� ร!ปแบบการใชี้�งาน่

ตั�วอย�าง1. int x = 17, y;2. int *pt_int;3. pt_int = &x;4. y = *pt_num

10

*ตั�วแปรพอยท�เตัอร�

x

17

0100

pt_int

0370

y

0876

____ ___

การแสดงค่�าของข�อมู!ลท�#ตั�วแปรพอยท�เตัอร�ชี้� (ตั�อ)1. #include "stdio.h"2. #include "conio.h"3. main()4. {5. int a = 2, b = 3;6. int *p = &a;7. printf("Pointer p is points to a at address: %p\n",

p);8. printf("Value of a is %d and value of p is %d too\

n\n", a, *p);9. p = &b;10. printf("Now pointer p is point to b at address %p\

n", p);11. printf("Value of b is %d and now value of p is %d

too\n", b, *p);12. getch();13.}11

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

เราสามูารถใชี้�พอยท�เตัอร�ชี้� ไปย�งข�อมู!ลใน่แตั�ละชี้�องของอาร�เรย�ได� โดยการก�าหน่ดให�พอยท�เตัอร�ชี้� ไปย�งตั�าแหน่�งของชี้�องท�#ตั�องการอ�างถ(ง

ว/ธี�การระบ5ให�พอยท�เตัอร�ชี้� ไปย�งชี้�องแรกของอาร�เรย�น่� น่ ท�าได�โดยก�าหน่ดชี้%#อของอาร�เรย�ให�ก�บตั�วแปรพอยท�เตัอร�โดยตัรง

ตั�วอย�างการใชี้�งาน่

12

1. char a[4] = “com”;

2. char *p;3. p = a; หร%อ p =

&a[0];

p

1001

a[0]

a[1]

a[2]

a[3]

c o m null101

102

103

104

____

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

สามูารถใชี้�การกระท�าการทางค่ณ/ตัศาสตัร� เชี้�น่ +, -, ++, -- เข�ามูาจ�ดการก�บการเล%#อน่ตั�วแปรพอยท�เตัอร�ใน่อาร�เรย�

ด�งน่� น่การเล%#อน่พอยท�เตัอร�ไป 1 ก.ค่%อ เล%#อน่ตั�าแหน่�งใน่หน่�วยค่วามูจ�าไปเท�าก�บขน่าดของชี้น่/ดตั�วแปรน่� น่ int เล��อนต%าแหน�งในหน�วยความูจ%าไป็ 2 bytes float เล��อนต%าแหน�งในหน�วยความูจ%าไป็ 4 bytes

ยกตั�วอย�างเชี้�น่

13

1. char a[4] = “com”;

2. char *p;3. p = a; หร%อ p =

&a[0];4. p = p+2;5. --p;

p

1001

a[0]

a[1]

a[2]

a[3]

c o m null101

102

103

104

101103102

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

1. main() {2. char data[9] = "Computer";3. char *p = data; 4. 5. printf("First element of data at address %p\n",

&data[0]);6. printf("and value of first element is: %c\n\n", *p);7. ++p;8. printf("p point to address %p: value %c\n", p, *p);9. --p;10. printf("p point to address %p: value %c\n", p, *p);11. p = p+5;12. printf("p point to address %p: value %c\n", p, *p);13. getch();14. }14

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

ก�อน่หน่�าน่� เห.น่ได�ว�า พอยท�เตัอร� 1 ตั�วสามูารถอ�างอ/งไปย�งตั�วแปรอ%#น่ ๆ ได� ณ เวลาใดเวลาหน่(#งเพ�ยงตั�วแปรเด�ยวเท�าน่� น่

หากเราตั�องการให�พอยท�เตัอร�สามูารถอ�างอ/งไปย�งตั�วแปรหลาย ๆ ตั�วพร�อมูก�น่ใน่เวลาเด�ยวก�น่ ท�าได�โดยการน่�าตั�วแปรพอยท�เตัอร�มูาก�าหน่ดให�อย!�ใน่ร!ปแบบของอาร�เรย�

เชี้�น่

15

1. int a = 1, b = 2;

2. int *p[2];3. p[0] = &a;4. p[1] = &b;

a

1

101

b

2

103

P[0]

P[1]

105 106

______

อาร�เรย�ของพอยท�เตัอร� (ตั�อ)

ร!ปแบบการใชี้�งาน่

เชี้�น่ int *p[3]; ค�อการ์ป็ร์ะกาศต�วแป็ร์ p เป็�นต�วแป็ร์อาร์�เร์ย�ของ

พอยท์�เตอร์�ชน�ดจ%านวนเต+มู ขนาด 3 ช�อง Char *p[10]; ค�อการ์ป็ร์ะกาศต�วแป็ร์ p เป็�นต�วแป็ร์อาร์�เร์ย�

ของพอยท์�เตอร์�ชน�ดต�วอ�กษร์ ขนาด 10 ช�อง

16

ชี้น่/ดของข�อมู!ล *ชี้%#อตั�วแปรพอยท�เตัอร�[ขน่าดของอาร�เรย�];

อาร�เรย�ของพอยท�เตัอร� (ตั�อ)

main(){ int a[5] = {1, 2, 3, 4, 5}; int *p_a[5]; int i; for(i=0; i<5; i++){ p_a[i] = &a[i]; printf("Address of a[%d]: %p\n", i,

p_a[i]); printf("Value of a[%d]: %d\n\n", i,

*p_a[i]); } getch(); }17

พอยท�เตัอร�ของพอยท�เตัอร�

เป-น่ตั�วแปรพอยท�เตัอร�ตั�วหน่(#งท(#ท�าหน่�าท�#ชี้� ไปย�งตั�วแปรพอยท�เตัอร�อ�กตั�วแทน่ท�#จะชี้� ไปย�งตั�วแปรอ%#น่โดยตัรง

18

p1

300

1. char a = ‘A’;

2. char *p1;3. p1 = &a;

a

A

200___

p1

300

1. char a = ‘A’;

2. char *p1;3. char **p2;4. p1 = &a;5. p2 = &p1;

___

a

A

200

p1

400___

พอยท�เตัอร�ของพอยท�เตัอร� (ตั�อ)

ร!ปแบบการใชี้�งาน่

เร�ยกอ�กอย�างว�า indirect pointerหากตั�องการทราบตั�าแหน่�งของพอยท�เตัอร�ของพอยท�

เตัอร�ของพอยท�เตัอร� ก.ตั�องใชี้� * จ�าน่วน่ 3 ตั�ว เป-น่เชี้�น่น่� ไปเร%#อย ๆ

19

ชี้น่/ดของข�อมู!ล **ชี้%#อตั�วแปรพอยท�เตัอร�;

พอยท�เตัอร�ของพอยท�เตัอร� (ตั�อ)

1. main() {2. int a = 10;3. int *pt_a;4. int **pt_pt_a;5. pt_a = &a;6. pt_pt_a = &pt_a;7. printf("address of a is %p and value of a

is %d\n", pt_a, *pt_a);8. printf("address of pt_a is %p and value of

a is %d", pt_pt_a, **pt_pt_a);9. getch();10.}

20

http://www.renvi.src.ku.ac.th