170 likes | 505 Views
Pointers. Why have pointers?. pointers ทำให้ฟังก์ชันหรือส่วนของโปรแกรมสามารถใช้งานข้อมูลร่วมกันได้ ใช้ pointers ในการสร้างโครงสร้างข้อมูลที่ซับซ้อนได้ เช่น linked list หรือ binary tree. What is a pointer?.
E N D
Why have pointers? • pointers ทำให้ฟังก์ชันหรือส่วนของโปรแกรมสามารถใช้งานข้อมูลร่วมกันได้ • ใช้ pointers ในการสร้างโครงสร้างข้อมูลที่ซับซ้อนได้ เช่น linked list หรือ binary tree
What is a pointer? • ชนิดข้อมูลประเภท int เปรียบเสมือนกับกล่องที่เก็บค่า “เลขจำนวนเต็ม” 1 ค่า เช่น int num = 42; num 42 จะจองเนื้อที่ในหน่วยความจำไว้สำหรับเก็บข้อมูลจำนวนเต็ม 1 ค่า โดยสามารถอ้างถึงตำแหน่งที่เก็บนี้ด้วยชื่อ num
What is a pointer? • pointer มีความแตกต่างเล็กน้อย ... • pointer จะไม่ได้เก็บค่าข้อมูลโดยตรง แต่จะเก็บตำแหน่ง (reference)ของตัวแปรที่เก็บข้อมูลนั้นแทน • เราอาจเรียกตัวแปรที่ถูก pointerเก็บตำแหน่งไว้ว่า “Pointee” num 42 1001 ptr 1001
What is a pointer? Pointee num num 42 42 อาจวาดได้อีกอย่าง 1001 ptr ptr 1001 ตัวแปร Pointer
Pointer assignment num 42 เราสามารถกำหนดให้ pointer ชี้ไปยังตำแหน่งเดียวกันได้ โดยใช้เครื่องหมาย assignment (เครื่องหมายเท่ากับ =) เช่น ptr2 = ptr; ptr ptr2
Sharing Sharing อ้างถึงเนื้อที่ในหน่วยความจำเดียวกัน (ประยุกต์ใช้ตอนส่งค่าระหว่างฟังก์ชันหรือโปรแกรมได้) ptr 42 ptr2
Syntax int * point to int float * point to float char * point to char • int *ptr; กำหนดให้ ptr เป็น pointer ที่ชี้ไปยังตัวแปรประเภท integer
The star * • ตาม syntax อนุญาตให้เครื่องหมาย asterisk หรือ star ถูกวางไว้ที่ตำแหน่งใดก็ได้ระหว่างชนิดของตัวแปร(base type)และชื่อตัวแปร(variable name) int *ptr; int * ptr; int* ptr; เหมือนกัน
& operator ใช้ & วางไว้หน้าชื่อตัวแปร จะหมายถึงตำแหน่งของตัวแปรนั้น int num; int * numPtr; num 42 numPtr num = 42; numPtr = #
* operator • * operator เมื่อวางไว้หน้าตัวแปร pointer แล้วจะหมายถึง ข้อมูลในตำแหน่งที่ pointer นั้นชี้อยู่ (ข้อมูลใน pointee) • สมมติให้มีการประกาศตัวแปรดังนี้ int num, *numPtr; num 42 numPtr num = 42; 50 numPtr = # ผลลัพธ์ *numPtr = 50; • 50 printf(“%d %d”, *numPtr, num);
Example int A, B, C, *P, *Q; A = 1; B = 2; C = 3; A 1 P B 2 13 P = &A; Q Q = &B; 1 3 C C = *P; P = Q; *P = 13;
int a,b,c, *p, *q; a = 1; b = 2; c = 3; p = &a; printf("p = %p\n",p); printf("*p = %d\n",*p); q = &b; printf("q = %p\n",q); printf("*q = %d\n",*q); c = *p; printf("c = %d\n",c); p = q; printf("*p = %d\n",*p); printf("*q = %d\n",*q); printf("p = %p\n",p); printf("q = %p\n",q); *p = 13; printf("*p = %d\n",*p); printf("*q = %d\n",*q); pointer1.cpp
Bad Pointer Example เช่น int * p; *p = 42; จะเห็นว่า pointer p ยังไม่ถูก assign ให้ชี้ไปที่ตำแหน่งใด แต่มีการกำหนดค่า *p = 42; ซึ่งไม่ถูกต้อง
Pointer Type Effects int *p; p = p + 12; จากตัวอย่างข้างบน p = p+12 ไม่ได้เป็นการบวก 12 กับค่าที่อยู่ใน p แต่... p = p+12 จะเพิ่มค่า p ขึ้นเท่ากับขนาดของ integer 12 ตัว (มาจากการประกาศให้ p เป็น pointer ที่ชี้ไปยัง int ) ดังนั้น ถ้า integer 1 ตัว = 2 bytes จะได้ว่า p = p+12 จะหมายถึงเพิ่มค่า p ขึ้นอีก 24
Pointer Type Effects int *p; p = p + 2; ถ้า int มีขนาด 2 bytes ดังนั้น เพิ่มค่าใน p ขึ้นอีก 4 char *c; c = c + 2; ถ้า char มีขนาด 1 byte ดังนั้น เพิ่มค่าใน c ขึ้นอีก 2 float *f; f = f + 2; ถ้า float มีขนาด 4 bytes ดังนั้น เพิ่มค่าใน f ขึ้นอีก 8