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