pointer (ตัวชี้)

28
pointer (ตตตตตต)

Upload: mechelle-pacheco

Post on 30-Dec-2015

86 views

Category:

Documents


0 download

DESCRIPTION

pointer (ตัวชี้). เนื้อหาที่สอนในวันนี้. ขั้นตอนการประกาศตัวแปรในภาษาซี ตัวแปรชนิด pointer การกำหนดค่าให้กับตัวแปร pointer การใช้งานตัวแปร pointer pointer กับนิพจน์ทางคณิตศาสตร์ สิ่งที่ต้องระวังในการใช้งาน pointer pointer กับตัวแปร array. ขั้นตอนการประกาศตัวแปรในภาษาซี. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: pointer (ตัวชี้)

pointer (ตั�วชี้��)

Page 2: pointer (ตัวชี้)

#07 pointer 2

เนื้�อหาที่��สอนื้ในื้ว�นื้นื้�� ขั้��นื้ตัอนื้การประกาศตั�วแปรในื้ภาษาซี� ตั�วแปรชี้นื้�ด pointer การก�าหนื้ดค่ าให!ก�บตั�วแปร pointer การใชี้!งานื้ตั�วแปร pointer pointer ก�บนื้�พจนื้&ที่างค่ณิ�ตัศาสตัร& ส��งที่��ตั!องระว�งในื้การใชี้!งานื้ pointer pointer ก�บตั�วแปร array

Page 3: pointer (ตัวชี้)

#07 pointer 3

ขั้��นื้ตัอนื้การประกาศตั�วแปรในื้ภาษาซี�การประกาศตั�วแปรในื้โปรแกรม -> การ

ก�าหนื้ดพ�นื้ที่��ในื้หนื้ วยค่วามจ�าเพ�อใชี้!ในื้การเก+บค่ าขั้องตั�วแปรนื้��นื้ๆ

int x = 25; -> การก�าหนื้ดพ�นื้ที่��ในื้หนื้ วยค่วามจ�าส�าหร�บตั�วแปรชี้�อ x ที่��ม�ค่ าขั้!อม-ลชี้นื้�ดจ�านื้วนื้เตั+ม โดยก�าหนื้ดค่ าเร��มตั!นื้ไว!ในื้พ�นื้ที่��หนื้ วยค่วามจ�า ณิ ตั�าแหนื้ งด�งกล าวเป0นื้ 25

ด�งนื้��นื้ ค่ า 25 จะถู-กจ�ดเก+บในื้หนื้ วยค่วามจ�า ณิ ตั�าแหนื้ งหนื้2�งในื้หนื้ วยค่วามจ�า โดยม�ตั�วแปร x เพ�อใชี้!ในื้การอ!างถู2งตั�าแหนื้ งนื้��นื้

Page 4: pointer (ตัวชี้)

#07 pointer 4

สมม3ตั�ตั�าแหนื้ งในื้หนื้ วยค่วามจ�าด�งกล าวค่อ ตั�าแหนื้ ง FFF216 ( address ที่�� FFF216 )

0xFFF4

0xFFF0int x 0xFFF2x 25x = 25 x

0xFFF4

0xFFF00xFFF2

เม�อเราอ!างถู2งตั�วแปร x ก+ค่อการอ!างถู2งขั้!อม-ลที่��เก+บอย- ในื้หนื้ วยค่วามจ�าตั�าแหนื้ ง FFF216 นื้��งเอง เชี้ นื้ x = x + 10;

Page 5: pointer (ตัวชี้)

#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

Page 6: pointer (ตัวชี้)

#07 pointer 6

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

Type : ชี้นื้�ดขั้องตั�วแปร * : เป0นื้เค่ร�องหมายที่��แสดง

ว าตั�วแปรที่�� ตัามหล�งเค่ร�องหมายนื้��เป0นื้ตั�วแปร ชี้นื้�ด pointer

Variable_Name : เป0นื้ชี้�อตั�วแปรที่��ตั!องการประกาศว า เป0นื้ตั�วแปรชี้นื้�ด pointer โดยม�กฎการ ตั��งชี้�อเหมอนื้ตั�วแปรที่��วไป

Type * Variable_Name;

Page 7: pointer (ตัวชี้)

#07 pointer 7

ขั้!อค่วรจ�า เม�อเราตั!องการประกาศตั�วแปร pointer เพ�อชี้�� (เก+บค่ า address) ไปย�งตั�วแปรชี้นื้�ดใด เราจ�าเป0นื้ตั!องประกาศตั�วแปร pointer ให!ม�ชี้นื้�ดขั้!อม-ลเป0นื้ชี้นื้�ดเด�ยวก�บตั�วแปรนื้��นื้ด!วย

ตั�วอย างint *pt_i ; หมายค่วามว า pt_i เป0นื้ตั�วแปร pointer ที่��ชี้��

ไปย�งขั้!อม-ลชี้นื้�ด integer

float *pt_f ; หมายค่วามว า pt_f เป0นื้ตั�วแปร pointer ที่��ชี้��

ไปย�งขั้!อม-ลชี้นื้�ด float

Page 8: pointer (ตัวชี้)

#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 ขั้องตั�วแปรที่��เราตั!องการ

Page 9: pointer (ตัวชี้)

#07 pointer 9

การก�าหนื้ดให!ตั�วแปร pointer เก+บค่ า address ขั้องตั�วแปรอ�นื้ ก�าหนื้ดได!โดยอาศ�ยเค่ร�องหมาย & (address operator)

pa = &a ;หมายถู2ง ให!นื้�าค่ า address ขั้อง

ตั�วแปร a ไปจ�ดเก+บไว!ในื้ตั�วแปร pointer pa ( หรออาจกล าวได!อ�กอย างว า เป0นื้การก�าหนื้ดให! pointer pa ชี้��ไปย�งตั�วแปร a )

เม�อม�เค่ร�องหมาย & อย- หนื้!าตั�วแปรใด จะหมายถู2ง address ขั้องตั�วแปรนื้��นื้ (ยกเว!นื้ตั�วแปร pointer)

Page 10: 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

Page 11: pointer (ตัวชี้)

#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 )

Page 12: pointer (ตัวชี้)

#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

Page 13: pointer (ตัวชี้)

#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 ?

Page 14: pointer (ตัวชี้)

#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

Page 15: pointer (ตัวชี้)

#07 pointer 15

ส��งที่��ตั!องระว�งในื้การใชี้!งานื้ pointer

ตั�วแปร pointer สามารถูนื้�ามาด�าเนื้�นื้การที่างค่ณิ�ตัศาสตัร&ได! แตั ค่วามหมายที่��ได!อาจผ่�ดพลาด เชี้ นื้

a = * ( p1 + 1 ) ;สามารถูที่�าได! แตั จะหมายถู2งการเพ��มค่ า address ที่��ตั�วแปร pointer ชี้��ไปอ�ก 1 ตั�าแหนื้ ง แล!วจ2งหาค่ าที่��จ�ดเก+บอย- ในื้ address ตั�าแหนื้ งนื้��นื้ (ซี2�งเราไม ที่ราบว าเป0นื้ตั�าแหนื้ งอะไร)

Page 16: pointer (ตัวชี้)

#07 pointer 16

ในื้ที่�านื้องเด�ยวก�นื้ เม�อเราที่�างานื้ก�บตั�วแปรปกตั�ที่��วไป และม�การใชี้! & operator เพ�อหาค่ า address ขั้องตั�วแปรนื้��นื้ เชี้ นื้

p1 = &a + 1 ;สามารถูที่�าได! แตั จะหมายถู2งการเพ��มค่ า address ขั้องตั�วแปร a อ�ก 1 ตั�าแหนื้ ง แล!วจ�ดเก+บ address นื้��นื้ไว!ในื้ตั�วแปร pointer p1 ซี2�งผ่�ดค่วามหมายไป

ส��งที่��ตั!องระว�งในื้การใชี้!งานื้ pointer

Page 17: pointer (ตัวชี้)

#07 pointer 17

ในื้การที่�างานื้ก�บตั�วแปร pointer ตั!องก�าหนื้ดค่ าเร��มตั!นื้ให!ก�บตั�วแปร pointer ก อนื้เสมอ ว าตั!องการให!ชี้��ไปย�ง address ขั้องตั�วแปรใด (ใชี้!ส�ญล�กษณิ& & ในื้การก�าหนื้ด) จากนื้��นื้จ2งจะสามารถูกระที่�าการใดๆ ก�บค่ าขั้!อม-ลที่�� pointer นื้��นื้ชี้��อย- ได! (ใชี้!ส�ญล�กษณิ& * ในื้การจ�ดการขั้!อม-ล)

int a = 2 , *p ;*p = 3 ;

ผ่�ด เพราะเราไม ที่ราบว า pointer p จะชี้��ไปที่��ใด

ส��งที่��ตั!องระว�งในื้การใชี้!งานื้ pointer

Page 18: pointer (ตัวชี้)

#07 pointer 18

pointer ก�บตั�วแปร array

เราสามารถูใชี้! pointer ชี้��ไปย�งขั้!อม-ลในื้แตั ละชี้ องขั้องอาร&เรย&ได! โดยอาศ�ยค่วามจร�งที่��ว า ถู!าที่�าการบวกตั�วแปร pointer ตัรงๆ จะหมายถู2งการเพ��มค่ า address ที่�� pointer นื้��นื้ชี้��ไป (เล�อนื้ตั�าแหนื้ ง address ไปเป0นื้จ�านื้วนื้ชี้ องเที่ าก�บค่ าที่��นื้�ามาบวก)

และโดยปกตั�แล!ว ในื้การจ�ดเก+บอาร&เรย&ลงในื้หนื้ วยค่วามจ�า จะจ�ดเก+บในื้ล�กษณิะเป0นื้ชี้ องเร�ยงตั อก�นื้ไปตัามล�าด�บ

Page 19: pointer (ตัวชี้)

#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

Page 20: pointer (ตัวชี้)

#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

ตั�วอย าง

Page 21: pointer (ตัวชี้)

#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. }

ตั�วอย าง

Page 22: pointer (ตัวชี้)

#07 pointer 22

ขั้!อค่วรระว�ง ในื้การใชี้! pointer ชี้��ไปย�งอาร&เรย&

สามารถูที่�าได! 2 ว�ธ� ค่อsc_ptr = &sc[0] ; ก�าหนื้ดให! pointer เก+บค่ า address ขั้องอาร&เรย&ชี้ องแรก (ระบ3 index = 0)

fptr = data ; ก�าหนื้ดชี้�อขั้องอาร&เรย& data ให!ก�บ pointer fptr โดยตัรง (ไม ตั!องที่�าการระบ3 index และไม ตั!องใส เค่ร�องหมาย &)

ไม สามารถูใชี้!ค่�าส��ง sc_ptr = &sc; หรอ fptr = &data; ได!

จร�งๆ แล!วตั�วแปรอาร&เรย&ก+เป0นื้ pointer ชี้นื้�ดหนื้2�งนื้��นื้เอง (pointer แบบค่งที่��, ไม สามารถูชี้�� address อ�นื้ได!)

Page 23: pointer (ตัวชี้)

#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. }

ตั�วอย าง

Page 24: pointer (ตัวชี้)

#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)

Page 25: pointer (ตัวชี้)

#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

Page 26: pointer (ตัวชี้)

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

Page 27: pointer (ตัวชี้)

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

Page 28: pointer (ตัวชี้)

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