210 likes | 404 Views
ตัวแปรประเภทตัวชี้ (Pointer). http://www.renvi.src.ku.ac.th. ตัวแปรพอยท์เตอร์กับอาร์เรย์. พอยท์เตอร์ของพอยท์เตอร์. 4. 6. Today Agenda. pointer?. อาร์เรย์ของพอยท์เตอร์. 1. 5. 2. การประกาศตัวแปรพอยท์เตอร์. การแสดงตำแหน่ง, ค่าของข้อมูลของตัวแปรที่พอยท์เตอร์ชี้อยู่. 3. Pointer ?.
E N D
ตัวแปรประเภทตัวชี้ (Pointer) http://www.renvi.src.ku.ac.th
ตัวแปรพอยท์เตอร์กับอาร์เรย์ตัวแปรพอยท์เตอร์กับอาร์เรย์ พอยท์เตอร์ของพอยท์เตอร์ 4 6 Today Agenda pointer? อาร์เรย์ของพอยท์เตอร์ 1 5 2 การประกาศตัวแปรพอยท์เตอร์ การแสดงตำแหน่ง, ค่าของข้อมูลของตัวแปรที่พอยท์เตอร์ชี้อยู่ 3
Pointer ? • เมื่อมีการประกาศตัวแปรใด ๆ ขึ้นในโปรแกรม คอมไพเลอร์ของ C จะจัดการจองพื้นที่ในหน่วยความจำ ณ ตำแหน่งที่ว่างเพื่อเป็นที่เก็บข้อมูลของตัวแปรนั้น • ปกติผู้พัฒนาจะไม่ทราบว่าตำแหน่งที่เก็บข้อมูลนั้นอยู่ ณ ตำแหน่งใด • หากต้องการทราบตำแหน่งของข้อมูลในหน่วยความจำ สามารถทำได้โดยการใช้ ตัวแปรประเภทตัวชี้ (Pointer) ตัวอย่าง: int counter = 100; char sex = ‘M’; float gpa = 3.21;
การประกาศตัวแปรชนิด Pointer • รูปแบบการใช้งาน • ชนิดข้อมูล เป็น ชนิดของข้อมูลพอยท์เตอร์ • ชื่อตัวแปร เป็น ชื่อของตัวแปรพอยท์เตอร์ • เช่น • int *pt_int; ตัวแปรพอยเตอร์นี้จะชี้ไปยังชนิดข้อมูลที่__________ • char *pt_char ตัวแปรพอยท์เตอร์นี้จะชี้ไปยังชนิดข้อมูลที่________ • float *pt_float ตัวแปรพอยท์เตอร์นี้จะชี้ไปยังชนิดข้อมูลที่________ ชนิดข้อมูล *ชื่อตัวแปร;
การแสดงตำแหน่งข้อมูลที่พอยท์เตอร์ชี้การแสดงตำแหน่งข้อมูลที่พอยท์เตอร์ชี้ • ประกาศตัวแปรสำหรับเก็บข้อมูฃ • ประกาศตัวแปรพอยท์เตอร์ • ____________________________________
การแสดงตำแหน่งข้อมูลที่พอยท์เตอร์ชี้(ต่อ)การแสดงตำแหน่งข้อมูลที่พอยท์เตอร์ชี้(ต่อ) • 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; _____
การแสดงตำแหน่งข้อมูลที่พอยท์เตอร์ชี้(ต่อ)การแสดงตำแหน่งข้อมูลที่พอยท์เตอร์ชี้(ต่อ) • รูปแบบการใช้งาน • ตัวแปรพอยท์เตอร์ เป็น ตัวแปรชนิดพอยท์เตอร์ที่สร้างไว้ • ชื่อตัวแปรที่ต้องการทราบตำแหน่ง • อย่าลืมว่า “ทั้งตัวแปรพอยท์เตอร์และตัวแปรที่ต้องการทราบตำแหน่งต้องเป็นประเภทข้อมูลชนิดเดียวกัน” • และ เราใช้ %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 *ตัวแปรพอยท์เตอร์ ____ ___
การแสดงค่าของข้อมูลที่ตัวแปรพอยท์เตอร์ชี้ (ต่อ) • #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]; ____
ตัวแปรพอยท์เตอร์กับอาร์เรย์(ต่อ)ตัวแปรพอยท์เตอร์กับอาร์เรย์(ต่อ) • สามารถใช้การกระทำการทางคณิตศาสตร์ เช่น +, -, ++, -- เข้ามาจัดการกับการเลื่อนตัวแปรพอยท์เตอร์ในอาร์เรย์ • ดังนั้นการเลื่อนพอยท์เตอร์ไป 1 ก็คือเลื่อนตำแหน่งในหน่วยความจำไปเท่ากับขนาดของชนิดตัวแปรนั้น • intเลื่อนตำแหน่งในหน่วยความจำไป 2 bytes • float เลื่อนตำแหน่งในหน่วยความจำไป 4 bytes • ยกตัวอย่างเช่น • char a[4] = “com”; • char *p; • p = a;หรือ p = &a[0]; • p = p+2; • --p; 101 103 102
ตัวแปรพอยท์เตอร์กับอาร์เรย์(ต่อ)ตัวแปรพอยท์เตอร์กับอาร์เรย์(ต่อ) • 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; • printf("p point to address %p: value %c\n", p, *p); • p = p+5; • printf("p point to address %p: value %c\n", p, *p); • getch(); • }
อาร์เรย์ของพอยท์เตอร์อาร์เรย์ของพอยท์เตอร์ • ก่อนหน้านี้เห็นได้ว่า พอยท์เตอร์ 1 ตัวสามารถอ้างอิงไปยังตัวแปรอื่น ๆ ได้ ณ เวลาใดเวลาหนึ่งเพียงตัวแปรเดียวเท่านั้น • หากเราต้องการให้พอยท์เตอร์สามารถอ้างอิงไปยังตัวแปรหลาย ๆ ตัวพร้อมกันในเวลาเดียวกัน ทำได้โดยการนำตัวแปรพอยท์เตอร์มากำหนดให้อยู่ในรูปแบบของอาร์เรย์ • เช่น int a = 1, b = 2; int *p[2]; p[0] = &a; p[1] = &b; ___ ___
อาร์เรย์ของพอยท์เตอร์(ต่อ)อาร์เรย์ของพอยท์เตอร์(ต่อ) • รูปแบบการใช้งาน • เช่น • int *p[3]; คือการประกาศตัวแปร p เป็นตัวแปรอาร์เรย์ของพอยท์เตอร์ชนิดจำนวนเต็ม ขนาด 3 ช่อง • Char *p[10]; คือการประกาศตัวแปร p เป็นตัวแปรอาร์เรย์ของพอยท์เตอร์ชนิดตัวอักษร ขนาด 10 ช่อง ชนิดของข้อมูล *ชื่อตัวแปรพอยท์เตอร์[ขนาดของอาร์เรย์];
อาร์เรย์ของพอยท์เตอร์(ต่อ)อาร์เรย์ของพอยท์เตอร์(ต่อ) • main(){ • int a[5] = {1, 2, 3, 4, 5}; • int *p_a[5]; • inti; • 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; ___ ___ ___
พอยท์เตอร์ของพอยท์เตอร์(ต่อ)พอยท์เตอร์ของพอยท์เตอร์(ต่อ) • รูปแบบการใช้งาน • เรียกอีกอย่างว่า 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