Download - ตัวแปรประเภทตัวชี้ (Pointer)
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