pointer (ตัวชี้)
DESCRIPTION
pointer (ตัวชี้). เนื้อหาที่สอนในวันนี้. ขั้นตอนการประกาศตัวแปรในภาษาซี ตัวแปรชนิด pointer การกำหนดค่าให้กับตัวแปร pointer การใช้งานตัวแปร pointer pointer กับนิพจน์ทางคณิตศาสตร์ สิ่งที่ต้องระวังในการใช้งาน pointer pointer กับตัวแปร array. ขั้นตอนการประกาศตัวแปรในภาษาซี. - PowerPoint PPT PresentationTRANSCRIPT
pointer (ตั�วชี้��)
#07 pointer 2
เนื้�อหาที่��สอนื้ในื้ว�นื้นื้�� ขั้��นื้ตัอนื้การประกาศตั�วแปรในื้ภาษาซี� ตั�วแปรชี้นื้�ด pointer การก�าหนื้ดค่ าให!ก�บตั�วแปร pointer การใชี้!งานื้ตั�วแปร pointer pointer ก�บนื้�พจนื้&ที่างค่ณิ�ตัศาสตัร& ส��งที่��ตั!องระว�งในื้การใชี้!งานื้ pointer pointer ก�บตั�วแปร array
#07 pointer 3
ขั้��นื้ตัอนื้การประกาศตั�วแปรในื้ภาษาซี�การประกาศตั�วแปรในื้โปรแกรม -> การ
ก�าหนื้ดพ�นื้ที่��ในื้หนื้ วยค่วามจ�าเพ�อใชี้!ในื้การเก+บค่ าขั้องตั�วแปรนื้��นื้ๆ
int x = 25; -> การก�าหนื้ดพ�นื้ที่��ในื้หนื้ วยค่วามจ�าส�าหร�บตั�วแปรชี้�อ x ที่��ม�ค่ าขั้!อม-ลชี้นื้�ดจ�านื้วนื้เตั+ม โดยก�าหนื้ดค่ าเร��มตั!นื้ไว!ในื้พ�นื้ที่��หนื้ วยค่วามจ�า ณิ ตั�าแหนื้ งด�งกล าวเป0นื้ 25
ด�งนื้��นื้ ค่ า 25 จะถู-กจ�ดเก+บในื้หนื้ วยค่วามจ�า ณิ ตั�าแหนื้ งหนื้2�งในื้หนื้ วยค่วามจ�า โดยม�ตั�วแปร x เพ�อใชี้!ในื้การอ!างถู2งตั�าแหนื้ งนื้��นื้
#07 pointer 4
สมม3ตั�ตั�าแหนื้ งในื้หนื้ วยค่วามจ�าด�งกล าวค่อ ตั�าแหนื้ ง FFF216 ( address ที่�� FFF216 )
0xFFF4
0xFFF0int x 0xFFF2x 25x = 25 x
0xFFF4
0xFFF00xFFF2
เม�อเราอ!างถู2งตั�วแปร x ก+ค่อการอ!างถู2งขั้!อม-ลที่��เก+บอย- ในื้หนื้ วยค่วามจ�าตั�าแหนื้ ง FFF216 นื้��งเอง เชี้ นื้ x = x + 10;
#07 pointer 5
ตั�วแปรชี้นื้�ด pointerนื้อกจากตั�วแปรธรรมดา (int, long, float, double, short, char) แล!วภาษาซี�ย�งม�ตั�วแปรชี้นื้�ดพ�เศษซี2�งใชี้!เก+บตั�าแหนื้ ง (address) ในื้หนื้ วยค่วามจ�าขั้องตั�วแปรชี้นื้�ดอ�นื้ๆ ได! ซี2�งจะเร�ยกว า ตั�วแปรชี้นื้�ด pointer (ตั�วชี้��)
0xFFF4
0xFFF00xFFF2
0xFFEE
25
0xFFF2px
x
x เป0นื้ตั�วแปร ชี้นื้�ด int
px เป0นื้ตั�วแปร ชี้นื้�ด
pointer ที่��ชี้�� ไปย�ง int
#07 pointer 6
การประกาศตั�วแปรชี้นื้�ด Pointer
Type : ชี้นื้�ดขั้องตั�วแปร * : เป0นื้เค่ร�องหมายที่��แสดง
ว าตั�วแปรที่�� ตัามหล�งเค่ร�องหมายนื้��เป0นื้ตั�วแปร ชี้นื้�ด pointer
Variable_Name : เป0นื้ชี้�อตั�วแปรที่��ตั!องการประกาศว า เป0นื้ตั�วแปรชี้นื้�ด pointer โดยม�กฎการ ตั��งชี้�อเหมอนื้ตั�วแปรที่��วไป
Type * Variable_Name;
#07 pointer 7
ขั้!อค่วรจ�า เม�อเราตั!องการประกาศตั�วแปร pointer เพ�อชี้�� (เก+บค่ า address) ไปย�งตั�วแปรชี้นื้�ดใด เราจ�าเป0นื้ตั!องประกาศตั�วแปร pointer ให!ม�ชี้นื้�ดขั้!อม-ลเป0นื้ชี้นื้�ดเด�ยวก�บตั�วแปรนื้��นื้ด!วย
ตั�วอย างint *pt_i ; หมายค่วามว า pt_i เป0นื้ตั�วแปร pointer ที่��ชี้��
ไปย�งขั้!อม-ลชี้นื้�ด integer
float *pt_f ; หมายค่วามว า pt_f เป0นื้ตั�วแปร pointer ที่��ชี้��
ไปย�งขั้!อม-ลชี้นื้�ด float
#07 pointer 8
การก�าหนื้ดค่ าให!ตั�วแปร pointerfloat a = 3.5; float *pa ;
จากตั�วอย าง เป0นื้การก�าหนื้ดให! a เป0นื้ตั�วแปรชี้นื้�ด float เก+บค่ า 3.5 และ pa เป0นื้ตั�วแปร poiter ที่��จะชี้��ไปย�ง a
เม�อก�าหนื้ดตั�วแปรชี้นื้�ด pointer แล!ว ในื้ตัอนื้ตั!นื้ ตั�วแปร pointer ที่��ได!จะเก+บค่ า address ขั้ยะ (เราไม สามารถูที่ราบได!ว าเป0นื้ address ตั�าแหนื้ งใด)
ด�งนื้��นื้ เราตั!องก�าหนื้ดให!ตั�วแปร pointer เก+บค่ า address ขั้องตั�วแปรที่��เราตั!องการ
#07 pointer 9
การก�าหนื้ดให!ตั�วแปร pointer เก+บค่ า address ขั้องตั�วแปรอ�นื้ ก�าหนื้ดได!โดยอาศ�ยเค่ร�องหมาย & (address operator)
pa = &a ;หมายถู2ง ให!นื้�าค่ า address ขั้อง
ตั�วแปร a ไปจ�ดเก+บไว!ในื้ตั�วแปร pointer pa ( หรออาจกล าวได!อ�กอย างว า เป0นื้การก�าหนื้ดให! pointer pa ชี้��ไปย�งตั�วแปร a )
เม�อม�เค่ร�องหมาย & อย- หนื้!าตั�วแปรใด จะหมายถู2ง address ขั้องตั�วแปรนื้��นื้ (ยกเว!นื้ตั�วแปร pointer)
#07 pointer 10
ตั�วแปรชี้นื้�ด pointer เป0นื้ตั�วแปรที่��เก+บค่ า address
สามารถูม�ตั�วแปร pointer สองตั�วที่��ชี้��ไปย�งตั�วแปรตั�วเด�ยวก�นื้ (เก+บค่ า address ตั�าแหนื้ งเด�ยวก�นื้)
float a = 3.5 , *pa1 , *pa2 ;
pa1 = pa2 = &a ;0xFFFA
0xFFF20xFFF6
0xFFEE
3.5
0xFFF60xFFF6
pa1
apa2
#07 pointer 11
การใชี้!งานื้ตั�วแปร pointer เราสามารถูเขั้!าถู2งค่ าที่��จ�ดเก+บอย- ในื้ address ตั�าแหนื้ งที่��ตั�วแปร pointer ชี้��อย- ได! โดยอาศ�ย * (star operator) เพ�อเขั้!าถู2งค่ านื้��นื้ๆ
float a = 3.5 , b;
float *pa ;pa = &a ;b = *pa ;
ตั�วแปร b จะม�ค่ าเที่ าก�บ 3.5 เนื้�องจากเป0นื้การนื้�าค่ าที่��เก+บอย- ในื้ address ที่��ตั�วแปร pa เก+บไว!ไปใส (ตั�าแหนื้ งเด�ยวก�บตั�วแปร a )
#07 pointer 12
ถู!าเราตั!องการอ!างถู2ง address ขั้องตั�วแปร pointer ใดๆอ�กตั อหนื้2�ง เราสามารถูอ!างถู2งโดยใชี้!ตั�วแปรนื้��นื้โดยตัรง
float a = 3.5 , b; float *pa , *ptr;pa = &a ;b = *pa ;ptr = pa ;Name of
variableType of variable Content of
variableAddress of
variablea 32 bit float a &a
pa Address of float *pa pa
paptr
a 3.50xFF
F40xFFF4
0xFFF00xFFF40xFFF83.5b 0xFFFC
#07 pointer 13
0xFFF0
1 1 6 5 5a 0xFFF2
3 1 1 1 5b 0xFFF4
0xFFF0
0xFFF0
0xFFF0
0xFFF0
0xFFF0
p1
0xFFF6
0xFFF2
0xFFF2
0xFFF2
0xFFF2
0xFFF2
p2
3 line
b=*p1
a=*p2+5
*p1=5
*p2=*p1
int a = 1 , b = 3 , *p1 , *p2 ;p1 = &a ;p2 = &b ;b = *p1 ; 1a = *p2 + 5 ; 2*p1 = 5 ; 3*p2 = *p1 ; 4
1 2 3 4
ตั�วอย าง
หล�งจากผ่ านื้ค่�าส��งหมายเลขั้ 1, 2, 3, 4 ?
#07 pointer 14
pointer ก�บนื้�พจนื้&ค่ณิ�ตัศาสตัร& เราสามารถูใชี้!นื้�พจนื้&ค่ณิ�ตัศาสตัร&ร วมก�บ
ตั�วแปร pointer ได! เชี้ นื้int a = 1 , b = 3 , *p1 , *p2 ;
p1 = &a ;
p2 = &b ;
a = *p2 + 1 ;
เป0นื้การนื้�าค่ าที่��จ�ดเก+บอย- ในื้ตั�วแปรที่�� pointer p2 ชี้��อย- (ตั�วแปร b) มาบวกก�บตั�วเลขั้ 1 จากนื้��นื้จ2งจ�ดเก+บผ่ลล�พธ&ไว!ในื้ตั�วแปร a
#07 pointer 15
ส��งที่��ตั!องระว�งในื้การใชี้!งานื้ pointer
ตั�วแปร pointer สามารถูนื้�ามาด�าเนื้�นื้การที่างค่ณิ�ตัศาสตัร&ได! แตั ค่วามหมายที่��ได!อาจผ่�ดพลาด เชี้ นื้
a = * ( p1 + 1 ) ;สามารถูที่�าได! แตั จะหมายถู2งการเพ��มค่ า address ที่��ตั�วแปร pointer ชี้��ไปอ�ก 1 ตั�าแหนื้ ง แล!วจ2งหาค่ าที่��จ�ดเก+บอย- ในื้ address ตั�าแหนื้ งนื้��นื้ (ซี2�งเราไม ที่ราบว าเป0นื้ตั�าแหนื้ งอะไร)
#07 pointer 16
ในื้ที่�านื้องเด�ยวก�นื้ เม�อเราที่�างานื้ก�บตั�วแปรปกตั�ที่��วไป และม�การใชี้! & operator เพ�อหาค่ า address ขั้องตั�วแปรนื้��นื้ เชี้ นื้
p1 = &a + 1 ;สามารถูที่�าได! แตั จะหมายถู2งการเพ��มค่ า address ขั้องตั�วแปร a อ�ก 1 ตั�าแหนื้ ง แล!วจ�ดเก+บ address นื้��นื้ไว!ในื้ตั�วแปร pointer p1 ซี2�งผ่�ดค่วามหมายไป
ส��งที่��ตั!องระว�งในื้การใชี้!งานื้ pointer
#07 pointer 17
ในื้การที่�างานื้ก�บตั�วแปร pointer ตั!องก�าหนื้ดค่ าเร��มตั!นื้ให!ก�บตั�วแปร pointer ก อนื้เสมอ ว าตั!องการให!ชี้��ไปย�ง address ขั้องตั�วแปรใด (ใชี้!ส�ญล�กษณิ& & ในื้การก�าหนื้ด) จากนื้��นื้จ2งจะสามารถูกระที่�าการใดๆ ก�บค่ าขั้!อม-ลที่�� pointer นื้��นื้ชี้��อย- ได! (ใชี้!ส�ญล�กษณิ& * ในื้การจ�ดการขั้!อม-ล)
int a = 2 , *p ;*p = 3 ;
ผ่�ด เพราะเราไม ที่ราบว า pointer p จะชี้��ไปที่��ใด
ส��งที่��ตั!องระว�งในื้การใชี้!งานื้ pointer
#07 pointer 18
pointer ก�บตั�วแปร array
เราสามารถูใชี้! pointer ชี้��ไปย�งขั้!อม-ลในื้แตั ละชี้ องขั้องอาร&เรย&ได! โดยอาศ�ยค่วามจร�งที่��ว า ถู!าที่�าการบวกตั�วแปร pointer ตัรงๆ จะหมายถู2งการเพ��มค่ า address ที่�� pointer นื้��นื้ชี้��ไป (เล�อนื้ตั�าแหนื้ ง address ไปเป0นื้จ�านื้วนื้ชี้ องเที่ าก�บค่ าที่��นื้�ามาบวก)
และโดยปกตั�แล!ว ในื้การจ�ดเก+บอาร&เรย&ลงในื้หนื้ วยค่วามจ�า จะจ�ดเก+บในื้ล�กษณิะเป0นื้ชี้ องเร�ยงตั อก�นื้ไปตัามล�าด�บ
#07 pointer 19
score[0]
&FF00
78score[1]
&FF02
56score[2]
&FF04
42score[3]
&FF06
83score[4]
&FF08
25score[5]
&FF0A
36score[6]
&FF0C
68score[7]
&FF0E
54
ขั้!อม-ลที่��เก+บ
Memory address
อาร&เรย&
s_ptr
pointer
s_ptr + 1s_ptr + 2s_ptr + 3s_ptr + 4s_ptr + 5s_ptr + 6s_ptr + 7
#07 pointer 20
#include <stdio.h>void main(){ int sc[5] = {1,2,3,4,5} , *sc_ptr , a , b , c , d , e ;
sc_ptr = &sc[0] ;a = *sc_ptr ;b = *(sc_ptr + 1) ;c = *(sc_ptr + 2) ; d = *(sc_ptr + 3) ;e = *(sc_ptr + 4) ;
}
a = 1 b = 2 c = 3 d = 4 e = 5
ตั�วอย าง
#07 pointer 21
1. #include<stdio.h>2. void main()3. {4. int i; 5. float sum = 0.0 , data[5] , *f_ptr ;6. f_ptr = data ; // f_ptr = &data[0];7. for( i = 0 ; i < 5 ; i++ ) // read float data
5 times8. {9. printf( “ Give float data %d : " , i+1) ;10. scanf( “ %f “ , (f_ptr+i) ) ;11. }12. do13. {14. sum += * ( f_ptr++ ) ; /* add them up
*/15. } while (f_ptr < &data[5] ) ;16. printf( "Sum of all number is %f\n " , sum) ;17. }
ตั�วอย าง
#07 pointer 22
ขั้!อค่วรระว�ง ในื้การใชี้! pointer ชี้��ไปย�งอาร&เรย&
สามารถูที่�าได! 2 ว�ธ� ค่อsc_ptr = &sc[0] ; ก�าหนื้ดให! pointer เก+บค่ า address ขั้องอาร&เรย&ชี้ องแรก (ระบ3 index = 0)
fptr = data ; ก�าหนื้ดชี้�อขั้องอาร&เรย& data ให!ก�บ pointer fptr โดยตัรง (ไม ตั!องที่�าการระบ3 index และไม ตั!องใส เค่ร�องหมาย &)
ไม สามารถูใชี้!ค่�าส��ง sc_ptr = ≻ หรอ fptr = &data; ได!
จร�งๆ แล!วตั�วแปรอาร&เรย&ก+เป0นื้ pointer ชี้นื้�ดหนื้2�งนื้��นื้เอง (pointer แบบค่งที่��, ไม สามารถูชี้�� address อ�นื้ได!)
#07 pointer 23
1. #include<stdio.h>2. void main()3. {4. int i; 5. float sum = 0.0 , data[5] ;6. for( i = 0 ; i < 5 ; i++ ) // read float data
5 times7. {8. printf( “ Give float data %d : " , i+1) ;9. scanf( “ %f “ , &data[i] ) ;10. }11. i = 0 ;12. do13. {14. sum += * ( data + i++ ) ; /* add
them up */15. } while ( i <= 4 ) ;16. printf( "Sum of all number is %f\n " , sum) ;17. }
ตั�วอย าง
#07 pointer 24
สร3ปล�กษณิะการประกาศตั�วแปรint a ;
a ค่อตั�วแปรที่��ใชี้!เก+บขั้!อม-ลชี้นื้�ด int ธรรมดา
int a[] = {1,2,3}; หรอ int a[3] ;a ค่อตั�วแปรชี้นื้�ด pointer แบบค่งที่�� ที่��เก+บ address ขั้องอาร&เรย&ชี้ องแรก ( a เที่ าก�บ &a[0] , *a เที่ าก�บ a[0] )
int *a ;a ค่อตั�วแปรชี้นื้�ด pointer ที่��เก+บ address ขั้องขั้!อม-ลชี้นื้�ด int (ชี้��ไปย�งขั้!อม-ลชี้นื้�ด int)
#07 pointer 25
ถ้�ากำ�าหนดให�ส่�วนของโปรแกำรมใน main function เป�นด�งน��init int a[5]={1,2,3,4,5} , *pa ;1. pa = a;2. pa = &a[1];3. pa++;4. a[0] = *a+*pa;5. *pa = *(a+3); 6. a[4] =*a+3;7. *(pa-1) = 3x3;8. a[1] =*(pa++);จงแส่ดงให�เห�นว�าม�กำารเปลี่��ยนแปลี่งค่�าในหน�วยค่วามจ�าตำ�าแหน�งตำ�างๆ อย�างไรบ้�างหลี่�งจากำจบ้ค่�าส่��งแตำ�ลี่ะค่�าส่��ง
การบ!านื้
5
34
21
0xFFF2
0xFFEE0xFFF0
0xFFEC
0xFFF4
0xFFEA
a[4]
a[2]a[3]
a[1]
pa
a[0]init
5
34
21
0xFFF2
0xFFEE0xFFF0
0xFFEC
0xFFF4
0xFFEA
a[4]
a[2]a[3]
a[1]
pa
a[0]init
3
54
21
3
54
21
3
54
21
3
54
24
4
54
44
init int a[5]={1,2,3,4,5} , *pa ;1. pa = a; 2. pa = &a[1]; pa เกำ�บ้ค่�า add ของ a[1]3. pa++; เพิ่'�มค่�าของ pa ไป 1 ตำ�าแหน�ง4. a[0] = *a+*pa; a = ชี้��อย)�ที่�� a[0] บ้วกำ กำ�บ้ ค่�าที่�� pa ชี้��อย)�5. *pa = *(a+3); address ของ a เพิ่'�มข+�น 3 จะไปชี้��ที่��
a[3] ด�งน��น ตำ�าแหน�งที่�� pa ชี้��อย)�จะเป�นค่�า 4
0xFFEC0xFFEE 0xFFEE0xFFEE
a
1 2 3 4 5
0xFFEA
0xFFE0
5
34
21
0xFFF2
0xFFEE0xFFF0
0xFFEC
0xFFF4
0xFFEA
a[4]
a[2]a[3]
a[1]
pa
a[0]init
6. a[4] =*a+3; ค่�าของ pointer a ซึ่+�งขณะน�� ชี้��ที่�� a[3] ด�งน��น a[4] = 4+3 7. *(pa-1) = 3x3; pa -1 ค่.อไปชี้��ที่�� a[2] 8. a[1] =*(pa++); ค่�าของ a[1] จะม�ค่�าเที่�ากำ�บ้ address ของ pa เพิ่'�มข+�น 1 ซึ่+�งกำ�ค่.อ a[3] ม�ค่�าเป�น 4
4
74
44
0xFFEE
4
74
94
0xFFEC
4
74
44
0xFFEE
6 7 8
a 0xFFE0
28
ร-ปแบบ การส งตั�วแปรแบบอ!างอ�งไปย�งฟั9งก&ชี้�นื้ หรอแบบ argument and pointer หรอแบบ pass by reference หรอ Call by Reference
ว�ธ�การส งตั�วแปรแบบอ!างอ�งไปย�งฟั9งก&ชี้�นื้ หรอการเร�ยกใชี้!ฟั9งก&ชี้�นื้ Call by Reference ใชี้!ร-ปแบบ ด�งนื้�� ชี้�อฟั9งก&ชี้�นื้ (&ตั�วแปร) ;
การเขั้�ยนื้ส วนื้ห�วขั้องตั�วฟั9งก&ชี้�นื้ ใชี้!ร-ปแบบ ด�งนื้�� ชี้นื้�ดขั้!อม-ล ชี้�อฟั9งก&ชี้�นื้ (ชี้นื้�ดขั้!อม-ล *ตั�วแปรชี้นื้�ดตั�วชี้��)
ส ง Address
ร�บด!วย Pointer
ชี้นื้�ดขั้!อม-ลประกาศให!ตัรงก�นื้ก�บตั�วแปรที่��ส งมา
*** หล�กการใชี้!งานื้ฟั9งก&ชี้�นื้แบบ by reference ค่อ ส ง Address จะร�บด!วย pointer