700 likes | 1.05k Views
พอยน์เตอร์ ( Pointer). CSC-113 Structure Programming. เนื้อหา. Pointer คืออะไร การประกาศตัวแปร Pointer การส่งค่ากลับของ Function Pointer กับ Array Pointer กับ String Array ของ Pointer Pointer ของ Pointer. 2. 2. Pointer คืออะไร.
E N D
พอยน์เตอร์(Pointer) CSC-113 Structure Programming
เนื้อหา • Pointer คืออะไร • การประกาศตัวแปร Pointer • การส่งค่ากลับของ Function • Pointer กับ Array • Pointer กับ String • Array ของ Pointer • Pointer ของ Pointer 2 2
Pointer คืออะไร • Data type ชนิดหนึ่งที่ข้อมูลที่เก็บเป็นตำแหน่งที่อยู่ (Address)ของข้อมูล หรือ การนําตัวแปรพอยน์เตอร์ไปชี้ตําแหน่งที่อยู่ของตัวแปรที่อยู่ในหน่วยความจำ Ptr เป็นตัวแปรแบบ Pointer 1001 Ptr 1003 เก็บอยู่ในตำแหน่งที่ 1003 1002 N 1001 N เป็นตัวแปรแบบ integer 350 เก็บอยู่ในตำแหน่งที่ 1001 memory 3 3
Pointer คืออะไร • เมื่อตองการเรียกใชคาใดที่เก็บอยูในหนวยความจํา ก็สามารถเขาถึงคานั้น โดยการใชพอยน์เตอรอางอิงถึงตําแหนงนั้น • ทําใหการเขาถึงขอมูลทําไดเร็วกวาตัวแปรชนิดปกติ • แบ่งเป็น 2 ชนิด • 1. Direct Pointer Variable • 2. Indirect Pointer Variable 4 4
1. Direct Pointer Variable • คือ ตัวแปรที่เก็บตำแหน่งที่อยู่ของข้อมูลภายในหน่วยความจำโดยตรง mem. address Ptr เป็นตัวแปรแบบ Pointer 1001 Ptr 1003 เก็บอยู่ในตำแหน่งที่ 1003 1002 N 1001 N เป็นตัวแปรแบบ integer 350 เก็บอยู่ในตำแหน่งที่ 1001 memory 5 5
2. Indirect Pointer Variable • คือ ตัวแปร Pointer ที่เก็บตำแหน่งที่อยู่ของข้อมูลของตัวแปรแบบ Pointer อีกตัวหนึ่ง • บางครั้งเรียก Pointer to Pointer 6 6
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
ประโยชน์ของ Pointer • ใช้ส่ง Array และ String จาก Function หนึ่งไป Function หนึ่ง • ใช้จัดการกับ Array • ใช้กับ Data Structure ที่ซับซ้อน เช่น Link lists, Binary Tree เป็นต้น • ใช้ในการรับค่ากลับมายังฟังก์ชันมากกว่า 1 ค่า 8 8
เนื้อหา • Pointer คืออะไร • การประกาศตัวแปร Pointer • การส่งค่ากลับของ Function • Pointer กับ Array • Pointer กับ String • Array ของ Pointer • Pointer ของ Pointer 9 9
การประกาศตัวแปร Pointer 10 10 type *prt_name; หรือ type *prt1_name, *prt2_name, …; typeชนิดของข้อมูลที่ตัวแปร Pointer เก็บตำแหน่งที่อยู่ ptr_nameชื่อของตัวแปร Pointer ต้องมี * นำหน้าเพื่อบอกว่าเป็นตัวแปร Pointer ตัวอย่าง int *p, *a;
ตัวดำเนินการของพอยน์เตอรตัวดำเนินการของพอยน์เตอร 11 11 • ตัวดําเนินการเครื่องหมายดอกจันทร* (Asterisk) ใชกับตัวแปรพอยน์เตอรและเพื่อแสดงผลขอมูลที่เก็บอยูในตัวแปรพอยน์เตอร์ • ตัวดําเนินการ & (Ampersand) ใชเพื่อนำคาตําแหน่งที่อยูของตัวแปร ไปเก็บไวในตัวแปรพอยน์เตอรและใชในการแสดงคาแอดเดรสของตัวแปรพอยน์เตอร char m=‘T’; char *pm; pm = &m; การกำหนดค่าให้พอยน์เตอร์
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 #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 #include<stdio.h> void main() { int num = 15; int *address; address = # 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 #include<stdio.h> void main() { int num = 15; int *address; address = # 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 #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 #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 #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
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 #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 #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
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
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
20 24 24 #include<stdio.h> void main() { int *pt,a,b; a = 20; pt = &a; b = *pt; printf(“%d\n”,b); }
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); }
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
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
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
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 #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 แบบฝึกหัด 1. ประกาศตัวแปร MySalary = 5000 //แบบ int 2. ประกาศตัวแปรพอยน์เตอร์ PMySalary ชี้ไปยังข้อมูลแบบ int 3. กำหนดให้ PMySalary ชี้ไปยัง MySalary 4. พิมพ์ตำแหน่งใน Memory ของ MySalary 5. พิมพ์ตำแหน่งใน Memory ของPMySalary; 6. พิมพ์ค่าของ MySalary 7. พิมพ์ค่าที่ PMySalary ชี้ไป 8. &(*PMySalary) คือ ?
#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}
เนื้อหา • Pointer คืออะไร • การประกาศตัวแปร Pointer • การส่งค่ากลับของ Function • Pointer กับ Array • Pointer กับ String • Array ของ Pointer • Pointer ของ Pointer 33 33
การส่งค่ากลับของ Function 34 34 • ปกติการส่งค่ากลับของ Function จะมีเพียง 1 ค่าเท่านั้น โดยใช้คำสั่ง Return • แต่ในกรณีที่ต้องการให้มีการส่งค่ากลับหลายค่า จะต้องใช้ตัวแปร Pointer ช่วย • การ Pass ค่าไปยัง Function • Pass by Value (การส่งค่าของข้อมูลไปยัง Function) • Pass by Reference (การส่งตำแหน่งของข้อมูลไปยัง Function)
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
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
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 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
เนื้อหา • Pointer คืออะไร • การประกาศตัวแปร Pointer • การส่งค่ากลับของ Function • Pointer กับ Array • Pointer กับ String • Array ของ Pointer • Pointer ของ Pointer 39 39
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 ข้อมูล Address
Pointer กับ Array 42 42 str char str[80], *pl; pl = str; หรือpl = &str[0]; pl การอ้างถึงตัวแปรชุด สามารถอ้างถึงได้โดยการเพิ่มหรือลดตัวแปรพอยน์เตอร์ได้ เช่น ถ้าต้องการอ้างถึงตัวแปร str[4] โดยการอ้างถึงตำแหน่งที่อยู่ สามารถทำได้โดยการเพิ่มตัวแปรพอยน์เตอร์ ดังนี้ *(pl + 4)
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 #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 #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 #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 #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 #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 #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 #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