1 / 67

พอยน์เตอร์ ( Pointer)

พอยน์เตอร์ ( Pointer). CSC-113 Structure Programming. เนื้อหา. Pointer คืออะไร การประกาศตัวแปร Pointer การส่งค่ากลับของ Function Pointer กับ Array Pointer กับ String Array ของ Pointer Pointer ของ Pointer. 2. 2. Pointer คืออะไร.

tori
Download Presentation

พอยน์เตอร์ ( Pointer)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. พอยน์เตอร์(Pointer) CSC-113 Structure Programming

  2. เนื้อหา • Pointer คืออะไร • การประกาศตัวแปร Pointer • การส่งค่ากลับของ Function • Pointer กับ Array • Pointer กับ String • Array ของ Pointer • Pointer ของ Pointer 2 2

  3. Pointer คืออะไร • Data type ชนิดหนึ่งที่ข้อมูลที่เก็บเป็นตำแหน่งที่อยู่ (Address)ของข้อมูล หรือ การนําตัวแปรพอยน์เตอร์ไปชี้ตําแหน่งที่อยู่ของตัวแปรที่อยู่ในหน่วยความจำ Ptr เป็นตัวแปรแบบ Pointer 1001 Ptr 1003 เก็บอยู่ในตำแหน่งที่ 1003 1002 N 1001 N เป็นตัวแปรแบบ integer 350 เก็บอยู่ในตำแหน่งที่ 1001 memory 3 3

  4. Pointer คืออะไร • เมื่อตองการเรียกใชคาใดที่เก็บอยูในหนวยความจํา ก็สามารถเขาถึงคานั้น โดยการใชพอยน์เตอรอางอิงถึงตําแหนงนั้น • ทําใหการเขาถึงขอมูลทําไดเร็วกวาตัวแปรชนิดปกติ • แบ่งเป็น 2 ชนิด • 1. Direct Pointer Variable • 2. Indirect Pointer Variable 4 4

  5. 1. Direct Pointer Variable • คือ ตัวแปรที่เก็บตำแหน่งที่อยู่ของข้อมูลภายในหน่วยความจำโดยตรง mem. address Ptr เป็นตัวแปรแบบ Pointer 1001 Ptr 1003 เก็บอยู่ในตำแหน่งที่ 1003 1002 N 1001 N เป็นตัวแปรแบบ integer 350 เก็บอยู่ในตำแหน่งที่ 1001 memory 5 5

  6. 2. Indirect Pointer Variable • คือ ตัวแปร Pointer ที่เก็บตำแหน่งที่อยู่ของข้อมูลของตัวแปรแบบ Pointer อีกตัวหนึ่ง • บางครั้งเรียก Pointer to Pointer 6 6

  7. mem. address Ptr1 เป็นตัวแปรแบบ Pointer Ptr2 5000 5000 เก็บอยู่ในตำแหน่งที่ 1000 . . . 2 Ptr2 เป็นตัวแปรแบบ Pointer N 3000 3000 เก็บอยู่ในตำแหน่งที่ 5000 1 . . . N เป็นตัวแปรแบบ integer Ptr1 1000 250 เก็บอยู่ในตำแหน่งที่ 3000 memory 7 7

  8. ประโยชน์ของ Pointer • ใช้ส่ง Array และ String จาก Function หนึ่งไป Function หนึ่ง • ใช้จัดการกับ Array • ใช้กับ Data Structure ที่ซับซ้อน เช่น Link lists, Binary Tree เป็นต้น • ใช้ในการรับค่ากลับมายังฟังก์ชันมากกว่า 1 ค่า 8 8

  9. เนื้อหา • Pointer คืออะไร • การประกาศตัวแปร Pointer • การส่งค่ากลับของ Function • Pointer กับ Array • Pointer กับ String • Array ของ Pointer • Pointer ของ Pointer 9 9

  10. การประกาศตัวแปร Pointer 10 10 type *prt_name; หรือ type *prt1_name, *prt2_name, …; typeชนิดของข้อมูลที่ตัวแปร Pointer เก็บตำแหน่งที่อยู่ ptr_nameชื่อของตัวแปร Pointer ต้องมี * นำหน้าเพื่อบอกว่าเป็นตัวแปร Pointer ตัวอย่าง int *p, *a;

  11. ตัวดำเนินการของพอยน์เตอรตัวดำเนินการของพอยน์เตอร 11 11 • ตัวดําเนินการเครื่องหมายดอกจันทร* (Asterisk) ใชกับตัวแปรพอยน์เตอรและเพื่อแสดงผลขอมูลที่เก็บอยูในตัวแปรพอยน์เตอร์ • ตัวดําเนินการ & (Ampersand) ใชเพื่อนำคาตําแหน่งที่อยูของตัวแปร ไปเก็บไวในตัวแปรพอยน์เตอรและใชในการแสดงคาแอดเดรสของตัวแปรพอยน์เตอร char m=‘T’; char *pm; pm = &m; การกำหนดค่าให้พอยน์เตอร์

  12. 12 12 #include<stdio.h> void main() { int num = 15; printf(“Number is %d\n”,num); printf(“Address of num is %u\n”,&num); }

  13. 13 13 #include<stdio.h> void main() { int num = 15; printf(“Number is %d\n”,num); printf(“Address of num is %u\n”,&num); printf(“Value of address %u is %d\n”,&num,*(&num)); }

  14. 14 14 #include<stdio.h> void main() { int num = 15; int *address; address = &num; printf(“Number is %d\n”,num); printf(“Address of num is %u\n”,address); printf(“Value of address %u is %d\n”,address, *address); }

  15. 15 15 #include<stdio.h> void main() { int num = 15; int *address; address = &num; printf(“Number is %d\n”,num); printf(“Address of num is %u\n”,address); printf(“Value of address %u is %d\n”,address, *address); *address = 100; printf(“Number is %d\n”,num); printf(“Value of address %u is %d\n”,address, *address); }

  16. 16 16 #include <stdio.h> void main() { int *p,q; q = 100; p = &q; printf(“%d”,*p); } 1 2 3 4 1 ประกาศ p เป็นตัวแปรแบบ Pointer และ q เป็นตัวแปรแบบ integer q p ? ? ชี้ไปไหนไม่รู้ อยู่ในตำแหน่งที่ 3000 (สมมติ) อยู่ในตำแหน่งที่ 5000 (สมมติ) ตัวอย่างที่ 1

  17. 17 17 #include <stdio.h> void main() { int *p,q; q = 100; p = &q; printf(“%d”,*p); } 1 2 3 4 2 กำหนดค่าให้ q q p ? 100 ชี้ไปไหนไม่รู้ อยู่ในตำแหน่งที่ 3000 (สมมติ) อยู่ในตำแหน่งที่ 5000 (สมมติ) ตัวอย่างที่ 1

  18. 18 18 #include <stdio.h> void main() { int *p,q; q = 100; p = &q; printf(“%d”,*p); } 1 2 3 4 3 นำ address ของ q มาเก็บไว้ที่ p (กำหนดให้ p ชี้ยัง q) q p 5000 100 อยู่ในตำแหน่งที่ 3000 (สมมติ) อยู่ในตำแหน่งที่ 5000 (สมมติ) ตัวอย่างที่ 1

  19. 100 19 19 #include <stdio.h> void main() { int *p,q; q = 100; p = &q; printf(“%d”,*p); } 1 2 3 4 4 เอาค่าที่ pointer p ชี้อยู่ไปแสดงผล 1 2 q p 5000 100 อยู่ในตำแหน่งที่ 3000 (สมมติ) อยู่ในตำแหน่งที่ 5000 (สมมติ) ตัวอย่างที่ 1

  20. 20 20 #include <stdio.h> void main() { int *p,q; p = &q; *p = 1000; //q= 1000; printf(“%d”,q); } 1 2 3 4 1 ประกาศ p เป็นตัวแปรแบบ Pointer และ q เป็นตัวแปรแบบ integer q p ? ? ชี้ไปไหนไม่รู้ อยู่ในตำแหน่งที่ 3000 (สมมติ) อยู่ในตำแหน่งที่ 5000 (สมมติ) ตัวอย่างที่ 2

  21. 21 21 #include <stdio.h> void main() { int *p,q; p = &q; *p = 1000; //q= 1000; printf(“%d”,q); } 1 2 3 4 2 นำ address ของ q มาเก็บไว้ที่ p (กำหนดให้ p ชี้ยัง q) q p 5000 ? อยู่ในตำแหน่งที่ 3000 (สมมติ) อยู่ในตำแหน่งที่ 5000 (สมมติ) ตัวอย่างที่ 2

  22. 2 1 22 22 #include <stdio.h> void main() { int *p,q; p = &q; *p = 1000; //q= 1000; printf(“%d”,q); } 1 2 3 4 3 นำค่า 1000 เก็บใน address ที่ p ชี้อยู่ 1000 q p 5000 1000 อยู่ในตำแหน่งที่ 3000 (สมมติ) อยู่ในตำแหน่งที่ 5000 (สมมติ) ตัวอย่างที่ 2

  23. 1000 2 1 23 23 #include <stdio.h> void main() { int *p,q; p = &q; *p = 1000; //q= 1000; printf(“%d”,q); } 1 2 3 4 4 เอาค่าในตัวแปร q ไปแสดงผล q p 5000 1000 อยู่ในตำแหน่งที่ 3000 (สมมติ) อยู่ในตำแหน่งที่ 5000 (สมมติ) ตัวอย่างที่ 2

  24. 20 24 24 #include<stdio.h> void main() { int *pt,a,b; a = 20; pt = &a; b = *pt; printf(“%d\n”,b); }

  25. 25 25 #include<stdio.h> void main() { int *pt,a; a = 20; pt = &a; printf(“Address pointed by pt store value of %d\n ”,*pt); *pt = 10; printf(“After indirect assignment a = %d\n”,a); }

  26. 6 ? 2 ? ? ? a a b b c c ? ? ? ? ? ? p p q q r r 26 26 #include <stdio.h> void main() { int a,b,c; int *p,*q,*r; a = 6; b = 2; p = &b; q = p; r = &c; p = &a; *q = 8; *r = *p; *r = a + *q + *&c; printf(“%d %d %d\n”,a,b,c); printf(“%d %d %d”,*p,*q,*r); } ตัวอย่างที่ 3

  27. 6 6 8 2 ? ? a a b b c c ? ? ? ? ? ? p p q q r r 27 27 #include <stdio.h> void main() { int a,b,c; int *p,*q,*r; a = 6; b = 2; p = &b; q = p; r = &c; p = &a; *q = 8; *r = *p; *r = a + *q + *&c; printf(“%d %d %d\n”,a,b,c); printf(“%d %d %d”,*p,*q,*r); } ตัวอย่างที่ 3

  28. 6 8 6 a b c p q r 28 28 #include <stdio.h> void main() { int a,b,c; int *p,*q,*r; a = 6; b = 2; p = &b; q = p; r = &c; p = &a; *q = 8; *r = *p; *r = a + *q + *&c; printf(“%d %d %d\n”,a,b,c); printf(“%d %d %d”,*p,*q,*r); } 6 8 20 a b c p q r ตัวอย่างที่ 3

  29. 6 8 20 a b c p q r 29 29 #include <stdio.h> void main() { int a,b,c; int *p,*q,*r; a = 6; b = 2; p = &b; q = p; r = &c; p = &a; *q = 8; *r = *p; *r = a + *q + *&c; printf(“%d %d %d\n”,a,b,c); printf(“%d %d %d”,*p,*q,*r); } 6 8 20 6 8 20 ตัวอย่างที่ 3

  30. 30 30 #include <stdio.h> void main() { int a = 15; int b,c; int *pa, *pb, *pc; pa = &a; a = *pa; b = *pa + 5; pb = &b; pc = &c; *pc = a + b; printf(“Data in a,b,c = %d %d %d\n”,a,b,c); printf(“Address of a,b,c = %u %u %u\n”,pa,pb,pc); }

  31. 31 31 แบบฝึกหัด 1. ประกาศตัวแปร MySalary = 5000 //แบบ int 2. ประกาศตัวแปรพอยน์เตอร์ PMySalary ชี้ไปยังข้อมูลแบบ int 3. กำหนดให้ PMySalary ชี้ไปยัง MySalary 4. พิมพ์ตำแหน่งใน Memory ของ MySalary 5. พิมพ์ตำแหน่งใน Memory ของPMySalary; 6. พิมพ์ค่าของ MySalary 7. พิมพ์ค่าที่ PMySalary ชี้ไป 8. &(*PMySalary) คือ ?

  32. #include <stdio.h>void main() { int MySalary = 5000; //1 int *PMySalary; //2 PMySalary = &MySalary; //3 printf("%d\n",&MySalary); //4 printf("%d\n",PMySalary); //5 printf("%d\n",MySalary); //6 printf("%d\n",*PMySalary); //7 printf("%d\n",&(*PMySalary)); //8}

  33. เนื้อหา • Pointer คืออะไร • การประกาศตัวแปร Pointer • การส่งค่ากลับของ Function • Pointer กับ Array • Pointer กับ String • Array ของ Pointer • Pointer ของ Pointer 33 33

  34. การส่งค่ากลับของ Function 34 34 • ปกติการส่งค่ากลับของ Function จะมีเพียง 1 ค่าเท่านั้น โดยใช้คำสั่ง Return • แต่ในกรณีที่ต้องการให้มีการส่งค่ากลับหลายค่า จะต้องใช้ตัวแปร Pointer ช่วย • การ Pass ค่าไปยัง Function • Pass by Value (การส่งค่าของข้อมูลไปยัง Function) • Pass by Reference (การส่งตำแหน่งของข้อมูลไปยัง Function)

  35. 35 35 Pass by Value 10 15 q p #include <stdio.h> void pass(int ,int); void main() { int p = 10, q = 15; printf(“Before : p = %d, q = %d\n”,p, q); pass(p, q); printf(“After : p = %d, q = %d\n”,p, q); } void pass(int p, int q) { p = 5; q = 20; printf(“In function : p = %d, q = %d\n”,p, q); } copy ค่า q 10 15 p 10 15 q p q 5 20 p

  36. Pass by Reference 36 36 10 15 q p #include <stdio.h> void pass(int *,int *); void main() { int p = 10, q = 15; printf(“Before : p = %d, q = %d\n”,p, q); pass(&p, &q); printf(“After : p = %d, q = %d\n”,p, q); } void pass(int *p, int *q) { ++*p; *q = 20; printf(“In function : p = %d, q = %d\n”,*p, *q); } ชี้ไปยัง q p 11 20 q p q p ตัวอย่างที่ 1

  37. Pass by Reference 37 37 50 100 q p #include <stdio.h> void swap(int *,int *); void main() { int p = 50, q = 100; printf(“Before : p = %d, q = %d\n”,p, q); swap(&p, &q); printf(“After : p = %d, q = %d\n”,p, q); } void swap(int *pp, int *qq) { int tmp; tmp = *pp; *pp = *qq; *qq = tmp; pp = &q; printf(“In function : p = %d, q = %d\n”,*pp, *qq); } ชี้ไปยัง qq pp 100 50 q p qq pp 50 tmp ตัวอย่างที่ 2

  38. 38 38 Pass by Reference 3 10 5 a b c ชี้ไปยัง #include <stdio.h> void calcu(int *, int *, int *); void main() { int a = 3, b = 10, c= 5; calcu(&a, &b, &c); printf(“A = %d,B = %d,C = %d\n”,a,b,c); } void calcu(int *pa, int *pb, int *pc) { *pa = *pa + 5; *pb = *pb + 10; *pc = * pc + * pb; } pb pa pc 8 20 25 a b c ชี้ไปยัง pb pc pa ตัวอย่างที่ 3

  39. เนื้อหา • Pointer คืออะไร • การประกาศตัวแปร Pointer • การส่งค่ากลับของ Function • Pointer กับ Array • Pointer กับ String • Array ของ Pointer • Pointer ของ Pointer 39 39

  40. Pointer กับ Array 40 40 • นำ Pointer มาใช้ในการจัดการข้อมูล และมาใช้อ้างอิงตำแหน่งที่อยู่ของแต่ละตัวแปรย่อยของตัวแปรชุดได้ เช่น int number[] = {10,20,30,40,50}; อ้างอิง Address ของ Array : number + j หรือ &number[j] = ตำแหน่งที่อยู่ของ number[j] ข้อมูลของ Array ตัวที่ j : number[j] หรือ *(number + j)

  41. 41 41 ข้อมูล Address

  42. Pointer กับ Array 42 42 str char str[80], *pl; pl = str; หรือpl = &str[0]; pl การอ้างถึงตัวแปรชุด สามารถอ้างถึงได้โดยการเพิ่มหรือลดตัวแปรพอยน์เตอร์ได้ เช่น ถ้าต้องการอ้างถึงตัวแปร str[4] โดยการอ้างถึงตำแหน่งที่อยู่ สามารถทำได้โดยการเพิ่มตัวแปรพอยน์เตอร์ ดังนี้ *(pl + 4)

  43. 43 43 #include <stdio.h> void printarray(int *); void main() { int array[ ] = {100, 200, 300, 400, 500}; printarray(array); } void printarray(int *ptr) { for (int i=0; i < 5; i++) printf(“Array#%d = %d\n”,i, ptr[i]); } Array#0 = 100 Array#1 = 200 Array#2 = 300 Array#3 = 400 Array#4 = 500 ตัวอย่าง 1 : ส่งค่าตำแหน่งของตัวแปรชุดไปยังฟังก์ชันสำหรับแสดงข้อมูล

  44. 44 44 #include <stdio.h> void printarray(int *); void main() { int array[ ] = {100, 200, 300, 400, 500}; printarray(array); } void printarray(int *ptr) { for (int i=0; i < 5; i++) printf(“Array#%d = %d\n”,i, *(ptr+i)); } Array#0 = 100 Array#1 = 200 Array#2 = 300 Array#3 = 400 Array#4 = 500 ตัวอย่าง 1 : ส่งค่าตำแหน่งของตัวแปรชุดไปยังฟังก์ชันสำหรับแสดงข้อมูล

  45. 45 45 #define SIZE 5 #include <stdio.h> void inc_array(int *, int, int); void main() { int number[] = {100, 200, 300, 400, 500}; inc_array(number, SIZE, 5); //for (int i =0; i<SIZE;++i) // printf(“%d\n”, number[i]); //*(number+j) } void inc_array(int *ptr, int s, int c) { for (int j=0; j < s; j++){ *(ptr+j) += c; printf(“%d\n”,ptr[j]);} } 105 205 305 405 505 ตัวอย่าง 2 : ส่งค่าตำแหน่งของตัวแปรชุดไปยังฟังก์ชันสำหรับแสดงข้อมูล

  46. 46 46 #include <stdio.h> void main() { int a[5] = {0,1,2,3,4}; int *ptr; ptr = a; printf(“%d\n”,a[0]); printf(“%d\n”,*ptr); printf(“%d\n”,*(ptr+1)); printf(“%d\n”,*(a+2)); printf(“%d\n”,ptr[3]); } ตัวอย่าง 3

  47. 47 47 #include <stdio.h> void main() { int number[3]; int *pt; number[0] = 100; number[1] = 200; number[2] = 300; pt = number; printf(“number[0] = %d\n”,*pt); printf(“number[1] = %d\n”,*(pt+1)); printf(“number[2] = %d\n”,*(pt+2)); } ตัวอย่าง 4

  48. 48 48 #include <stdio.h> void main() { int number[3]; int *pt,i; number[0] = 200; number[1] = 400; number[2] = 600; pt = number; for( i = 0;i <= 2;++i) printf(“number[%d] = %d\n”,i, pt[i]); } ตัวอย่าง 5

  49. 49 49 #include <stdio.h> int array[]={4,5,8,9,8,1,0,1,9,3}; int *array_ptr; void main() { array_ptr = array; while(*array_ptr !=0) ++ array_ptr; printf(“Number of elements before zero %d\n”, array_ptr-array); } ตัวอย่าง 6

  50. 50 50 #include <stdio.h> #include <stdlib.h> void main() { char sentence[10]; char *Ptr; int count; Ptr = sentence; for(count = 0; count <10; count++) { *Ptr = getchar(); ++Ptr; } for(count = 0; count <10; count++) { --Ptr; putchar(*Ptr); } } ตัวอย่าง 7

More Related