ตัวแปรประเภทตัวชี้ (Pointer) http://www.renvi.src.ku.ac.th
Today Agenda pointer? การประกาศตัวแปรพอยท์เตอร์ 1 การประกาศตัวแปรพอยท์เตอร์ 2 การแสดงตำแหน่ง, ค่าของข้อมูลของตัวแปรที่พอยท์เตอร์ชี้อยู่ 3 ตัวแปรพอยท์เตอร์กับอาร์เรย์ 4 อาร์เรย์ของพอยท์เตอร์ 5 พอยท์เตอร์ของพอยท์เตอร์ 6
ตำแหน่งบนหน่วยความจำ Pointer ? เมื่อมีการประกาศตัวแปรใด ๆ ขึ้นในโปรแกรม คอมไพเลอร์ของ C จะจัดการจองพื้นที่ในหน่วยความจำ ณ ตำแหน่งที่ว่างเพื่อเป็นที่เก็บข้อมูลของตัวแปรนั้น ปกติผู้พัฒนาจะไม่ทราบว่าตำแหน่งที่เก็บข้อมูลนั้นอยู่ ณ ตำแหน่งใด หากต้องการทราบตำแหน่งของข้อมูลในหน่วยความจำ สามารถทำได้โดยการใช้ ตัวแปรประเภทตัวชี้ (Pointer) ตัวอย่าง: int counter = 100; char sex = ‘M’; float gpa = 3.21; ตัวแปร ตำแหน่งบนหน่วยความจำ ค่าของข้อมูล counter 1001 100 sex 1003 ‘M’ gpa 1004 3.21
การประกาศตัวแปรชนิด Pointer รูปแบบการใช้งาน ชนิดข้อมูล เป็น ชนิดของข้อมูลพอยท์เตอร์ ชื่อตัวแปร เป็น ชื่อของตัวแปรพอยท์เตอร์ เช่น int *pt_int; ตัวแปรพอยเตอร์นี้จะชี้ไปยังชนิดข้อมูลที่__________ char *pt_char ตัวแปรพอยท์เตอร์นี้จะชี้ไปยังชนิดข้อมูลที่ ________ float *pt_float ตัวแปรพอยท์เตอร์นี้จะชี้ไปยังชนิดข้อมูลที่ ________ ชนิดข้อมูล *ชื่อตัวแปร;
การแสดงตำแหน่งข้อมูลที่พอยท์เตอร์ชี้ ประกาศตัวแปรสำหรับเก็บข้อมูฃ ประกาศตัวแปรพอยท์เตอร์ ____________________________________ ตัวแปร ตำแหน่งบนหน่วยความจำ ค่าของข้อมูล พอยท์เตอร์ counter 1001 100 pt_counter sex 1003 ‘M’ pt_sex gpa 1004 3.21 pt_gpa
การแสดงตำแหน่งข้อมูลที่พอยท์เตอร์ชี้ (ต่อ) ตัวแปร ตำแหน่งบนหน่วยความจำ ค่าของข้อมูล พอยท์เตอร์ counter 1001 100 pt_counter sex 1003 ‘M’ pt_sex gpa 1004 3.21 pt_gpa int counter = 100; int *pt_counter; char sex = ‘M’; char *pt_sex; float gpa = 3.21; float *pt_gpa;
การแสดงตำแหน่งข้อมูลที่พอยท์เตอร์ชี้ (ต่อ) int counter = 100; int *pt_counter; pt_counter = &counter; counter 100 1001 pt_counter 1003 _____
การแสดงตำแหน่งข้อมูลที่พอยท์เตอร์ชี้ (ต่อ) รูปแบบการใช้งาน ตัวแปรพอยท์เตอร์ เป็น ตัวแปรชนิดพอยท์เตอร์ที่สร้างไว้ ชื่อตัวแปรที่ต้องการทราบตำแหน่ง อย่าลืมว่า “ทั้งตัวแปรพอยท์เตอร์และตัวแปรที่ต้องการทราบตำแหน่งต้องเป็นประเภทข้อมูลชนิดเดียวกัน” และ เราใช้ %p เป็นรหัสที่ใช้ในการแสดงข้อมูลประเภทพอยท์เตอร์ ตัวแปรพอยท์เตอร์ = &ชื่อตัวแปรที่ต้องการทราบตำแหน่ง;
การแสดงตำแหน่งข้อมูลที่พอยท์เตอร์ชี้ (ต่อ) ตัวอย่างการใช้งาน int counter = 100; int *pt_counter; pt_counter = &counter; printf(“address of counter is: %p\n”, pt_counter); char sex = ‘M’; char *pt_sex; pt_sex = &sex printf(“address of sex is: %p\n”, pt_sex); float gpa = 3.21; float *pt_gpa; pt_gpa = &gpa; printf(“address of gpa is: %p”, pt_gpa);
การแสดงค่าของข้อมูลที่ตัวแปรพอยท์เตอร์ชี้ รูปแบบการใช้งาน ตัวอย่าง int x = 17, y; int *pt_int; pt_int = &x; y = *pt_num *ตัวแปรพอยท์เตอร์ x 17 0100 pt_int 0370 y 0876 ____ ___
การแสดงค่าของข้อมูลที่ตัวแปรพอยท์เตอร์ชี้ (ต่อ) #include "stdio.h" #include "conio.h" main() { int a = 2, b = 3; int *p = &a; printf("Pointer p is points to a at address: %p\n", p); printf("Value of a is %d and value of p is %d too\n\n", a, *p); p = &b; printf("Now pointer p is point to b at address %p\n", p); printf("Value of b is %d and now value of p is %d too\n", b, *p); getch(); }
ตัวแปรพอยท์เตอร์กับอาร์เรย์ เราสามารถใช้พอยท์เตอร์ชี้ไปยังข้อมูลในแต่ละช่องของอาร์เรย์ได้ โดยการกำหนดให้พอยท์เตอร์ชี้ไปยังตำแหน่งของช่องที่ต้องการอ้างถึง วิธีการระบุให้พอยท์เตอร์ชี้ไปยังช่องแรกของอาร์เรย์นั้น ทำได้โดยกำหนดชื่อของอาร์เรย์ให้กับตัวแปรพอยท์เตอร์โดยตรง ตัวอย่างการใช้งาน char a[4] = “com”; char *p; p = a; หรือ p = &a[0]; p 1001 a[0] a[1] a[2] a[3] c o m null 101 102 103 104 ____
ตัวแปรพอยท์เตอร์กับอาร์เรย์ (ต่อ) สามารถใช้การกระทำการทางคณิตศาสตร์ เช่น +, -, ++, -- เข้ามาจัดการกับการเลื่อนตัวแปรพอยท์เตอร์ในอาร์เรย์ ดังนั้นการเลื่อนพอยท์เตอร์ไป 1 ก็คือ เลื่อนตำแหน่งในหน่วยความจำไปเท่ากับขนาดของชนิดตัวแปรนั้น int เลื่อนตำแหน่งในหน่วยความจำไป 2 bytes float เลื่อนตำแหน่งในหน่วยความจำไป 4 bytes ยกตัวอย่างเช่น char a[4] = “com”; char *p; p = a; หรือ p = &a[0]; p = p+2; --p; p 1001 a[0] a[1] a[2] a[3] c o m null 101 102 103 104 102 101 103
ตัวแปรพอยท์เตอร์กับอาร์เรย์ (ต่อ) main() { char data[9] = "Computer"; char *p = data; printf("First element of data at address %p\n", &data[0]); printf("and value of first element is: %c\n\n", *p); ++p; printf("p point to address %p: value %c\n", p, *p); --p; p = p+5; getch(); }
อาร์เรย์ของพอยท์เตอร์ ก่อนหน้านี้เห็นได้ว่า พอยท์เตอร์ 1 ตัวสามารถอ้างอิงไปยังตัวแปรอื่น ๆ ได้ ณ เวลาใดเวลาหนึ่งเพียงตัวแปรเดียวเท่านั้น หากเราต้องการให้พอยท์เตอร์สามารถอ้างอิงไปยังตัวแปรหลาย ๆ ตัวพร้อมกันในเวลาเดียวกัน ทำได้โดยการนำตัวแปรพอยท์เตอร์มากำหนดให้อยู่ในรูปแบบของอาร์เรย์ เช่น int a = 1, b = 2; int *p[2]; p[0] = &a; p[1] = &b; P[0] P[1] 105 106 a 1 101 b 2 103 ___ ___
อาร์เรย์ของพอยท์เตอร์ (ต่อ) รูปแบบการใช้งาน เช่น int *p[3]; คือการประกาศตัวแปร p เป็นตัวแปรอาร์เรย์ของพอยท์เตอร์ชนิดจำนวนเต็ม ขนาด 3 ช่อง Char *p[10]; คือการประกาศตัวแปร p เป็นตัวแปรอาร์เรย์ของพอยท์เตอร์ชนิดตัวอักษร ขนาด 10 ช่อง ชนิดของข้อมูล *ชื่อตัวแปรพอยท์เตอร์[ขนาดของอาร์เรย์];
อาร์เรย์ของพอยท์เตอร์ (ต่อ) main(){ int a[5] = {1, 2, 3, 4, 5}; int *p_a[5]; int i; for(i=0; i<5; i++){ p_a[i] = &a[i]; printf("Address of a[%d]: %p\n", i, p_a[i]); printf("Value of a[%d]: %d\n\n", i, *p_a[i]); } getch();
พอยท์เตอร์ของพอยท์เตอร์ เป็นตัวแปรพอยท์เตอร์ตัวหนึ่งทึ่ทำหน้าที่ชี้ไปยังตัวแปรพอยท์เตอร์อีกตัวแทนที่จะชี้ไปยังตัวแปรอื่นโดยตรง char a = ‘A’; char *p1; char **p2; p1 = &a; p2 = &p1; char a = ‘A’; char *p1; p1 = &a; p1 300 a A 200 p1 400 p1 300 a A 200 ___ ___ ___
พอยท์เตอร์ของพอยท์เตอร์ (ต่อ) รูปแบบการใช้งาน เรียกอีกอย่างว่า indirect pointer หากต้องการทราบตำแหน่งของพอยท์เตอร์ของพอยท์เตอร์ของพอยท์เตอร์ ก็ต้องใช้ * จำนวน 3 ตัว เป็นเช่นนี้ไปเรื่อย ๆ ชนิดของข้อมูล **ชื่อตัวแปรพอยท์เตอร์;
พอยท์เตอร์ของพอยท์เตอร์ (ต่อ) main() { int a = 10; int *pt_a; int **pt_pt_a; pt_a = &a; pt_pt_a = &pt_a; printf("address of a is %p and value of a is %d\n", pt_a, *pt_a); printf("address of pt_a is %p and value of a is %d", pt_pt_a, **pt_pt_a); getch(); }
It’s Time to do your QUIZ :) http://www.renvi.src.ku.ac.th