230 likes | 396 Views
Pointer. ความหมายของ พอยเตอร์ การใช้งาน พอยเตอร์ พอยเตอร์ กับอาร์เรย์ และ พอยเตอร์ กับ สตรัคเจอร์. int number = 2;. 1. ชื่อ อ้างอิง. number. number. 2. 2. 3. ค่า. AA05. AA04. AA02. AA02. 2. address. องค์ประกอบของหน่วยความจำ. 1. อ้างอิงค่าที่เก็บใน address รูปแบบ ชื่อตัวแปร
E N D
Pointer ความหมายของพอยเตอร์การใช้งานพอยเตอร์พอยเตอร์กับอาร์เรย์ และพอยเตอร์กับสตรัคเจอร์
int number = 2; 1. ชื่ออ้างอิง number number 2 2 3.ค่า AA05 AA04 AA02 AA02 2. address องค์ประกอบของหน่วยความจำ
1. อ้างอิงค่าที่เก็บใน address รูปแบบ ชื่อตัวแปร เช่น numberจะหมายถึงค่า 2 2. อ้างอิงค่า address รูปแบบ &ชื่อตัวแปร เช่น &number จะหมายถึง AA02 number 2 AA02 การอ้างอิงค่าจากตัวแปร
1. ตัวแปรพื้นฐาน (เก็บค่าตามชนิดข้อมูล) รูปแบบ ชนิดข้อมูล ชื่อตัวแปร; เช่น float a = 3.14; 2. ตัวแปรพอยเตอร์(เก็บค่า address)รูปแบบ ชนิดข้อมูล *ชื่อตัวแปร;เช่น float *pA = &a; หมายเหตุ ชนิดข้อมูลของตัวแปรพอยเตอร์ต้องตรงกับ ชนิดข้อมูลที่จะทำการเก็บ address a 3.14 AA00 pA AA00 ตัวแปรเชิงเดียว xxxx
ตัวแปรพอยเตอร์เป็นตัวแปรเก็บค่าตำแหน่งแต่การเก็บค่า address ให้เสมือนว่าทำการชี้ไปที่กล่อง adressนั้น a 3.14 float a = 3.14; AA00 pA float *pA = &a; ขยายความ ความหมายพอยเตอร์ xxxx
ชนิดข้อมูลของพอยเตอร์ ไม่ตรงกับชนิดข้อมูลที่จะทำการชี้ char x = ‘a’; ผิด compile error int *pX = &x; char x = ‘a’; ชนิดข้อมูลต้อง Match กัน สิ่งที่ทำไม่ได้ char *pX = &x;
x หลังจากทำการชี้ด้วยคำสั่งต่อไปนี้แล้ว… ‘a’ char x = ‘a’; char pX = &x; AA22 pX การอ้างอิง ข้อมูลในaddressรูปแบบ *ชื่อตัวแปรพอยเตอร์เช่น *pXจะหมายถึง ‘a’(เหมือนอ้างอิง x) xxxx การอ้างอิง ค่า addressรูปแบบ ชื่อตัวแปรพอยเตอร์เช่น pXจะหมายถึง AA22 การอ้างอิงค่าหลังจากทำการชี้แล้ว
a pA #include <stdio.h> main(){int a = 2;int *pA = &a;printf(“a = %d”, a);printf(“*pA = %d”, *pA);printf(“pA(hex) = %p”, pA);printf(“pA(dec) = %d”, pA);} 2 AA10 xxxx %p คือรหัสแสดง address เป็นเลขฐาน 16%d หรือ %u คือรหัสแสดง addressเป็นเลขฐาน 10 a = 2*pA = 2pA(hex) = AA10pA(dec) = 43536 ตัวอย่าง Code เพิ่มความเข้าใจ
นำพอยเตอร์มากำหนดค่าก่อนทำการชี้นำพอยเตอร์มากำหนดค่าก่อนทำการชี้ int *pt; *pt = 2; ผิด compile error pt pointer ยังไม่ได้ชี้ไปที่ addressใด ???? xxxx สิ่งที่ทำไม่ได้เกี่ยวกับการอ้างอิง pointer
int a[3] = {1,2,3}; การให้พอยเตอร์ชี้ไปที่ indexที่ 0 (ทำได้ 2 กรณี)pA = a; // อ้างอิงชื่อโดยตรงหรือpA = &a[0];// อ้างอิงโดยใช้ & int *pA; การให้พอยเตอร์ชี้ไปที่ indexที่อื่นๆpA = &a[index]; พอยเตอร์กับอาร์เรย์
int a[3] = {1,2,3}; int *pA= a; pA B20 B22 B24 ชื่ออ้างอิงค่าใน array(3 แบบ) 1 2 3 xxxx a[0] a[1] a[2] pA[0] pA[1] pA[2] *pA *(pA+1) *(pA+2) สิ่งที่ได้ตามมาหลังทำการชี้ไปที่ข้อมูลอาร์เรย์
int a[4] = {1,2,3,4}; int *pA= &a[1]; pA B20 B22 B24 B26 1 2 3 4 xxxx a[3] a[0] a[1] a[2] pA[2] pA[0] pA[1] pA[-1] index ของพอยเตอร์ตัวที่ชี้ไป จะเริ่มจาก 0 กรณีที่ 2 สิ่งที่ได้หลังการอ้างอิง *(pA-1) *pA *(pA+1) *(pA+2)
ทบทวนการอ้างอิงค่าในพอยเตอร์int *pt;- ptจะหมายถึงค่า address- *ptจะหมายถึง ข้อมูลใน address นั้น *pt+nความหมายคือ เอาค่าข้อมูลใน address มาบวก n *(pt+n) ความหมายคือ อ้างค่าข้อมูลใน address + n คณิตศาสตร์เกี่ยวกับพอยเตอร์ ใช้อ้างอิงในอาร์เรย์จากหัวข้อที่แล้ว
Structure ความหมายของชนิดข้อมูลแบบโครงสร้างการสร้างสตรัคเจอร์พอยเตอร์กับสตรัคเจอร์
สตรัคเจอร์คือ ชนิดข้อมูลที่รวบรวมชนิดข้อมูลพื้นฐานมาสร้างเป็นกลุ่มข้อมูลใหม่ (โดยชนิดข้อมูลไม่ต้องเหมือนกันก็ได้) ข้อจำกัดอาร์เรย์คือ ชนิดข้อมูลต้องเหมือนกันทั้งชุด struct Student{ char firstName[10]; char lastName[10];intid; float grade;}; สตรัคเจอร์ (ชนิดข้อมูลแบบโครงสร้าง)
structชื่อโครงสร้างหลัก{สมาชิก 1;สมาชิก 2;สมาชิก 3;structชื่อโครงสร้างย่อย {สมาชิก 1; สมาชิก 2; สมาชิก 3; };}; structชื่อโครงสร้าง{สมาชิก 1;สมาชิก 2;สมาชิก 3; …. ….}; structure structure ซ้อน structure รูปแบบการสร้าง Structure
ต้องสร้างตัวแปรของ structure ขึ้นมา (ทำได้ 2 กรณี) ประกาศแบบที่ 1 ประกาศแบบที่ 2 structชื่อโครงสร้าง{สมาชิก 1;สมาชิก 2;สมาชิก 3; …. ….}ชื่อตัวแปร; structชื่อโครงสร้าง{สมาชิก 1;สมาชิก 2;สมาชิก 3; …. ….};structชื่อโครงสร้าง ชื่อตัวแปร; การนำ structure มาใช้งาน ชื่อตัวแปร สามารถเป็นอาร์เรย์ หรือพอยเตอร์ก็ได้
std1 firstName lastName struct Student{ char firstName[10]; char lastName[10];int id; float grade;}std1; id grade ตัวอย่างโครงสร้างข้อมูล
std1 struct Student{ char Name[10];int id; float grade;}std1 = {“oak”, 1359, 4.00}; firstName “oak” id 1359 หรือ grade 4.00 struct Student{ char Name[10];int id; float grade;};struct Student std1 = {“oak”, 1359, 4.00}; การกำหนดค่า เริ่มต้น ให้กับ structure ต้องใส่ชนิดข้อมูลให้ตรงตามลำดับที่ประกาศไว้std1 = {1359,”oak”, 4.00}; ผิด
การอ้างอิงสมาชิกทำได้โดยอ้างอิงผ่าน . (dot)รูปแบบ ชื่อตัวแปรโครงสร้าง.สมาชิกหรือกรณีเป็น structure ซ้อน structureรูปแบบ ตัวแปรโครงสร้างหลัก.ตัวแปรโครงสร้างใน.สมาชิกใน struct Student{ char Name[10];int id; float grade;};struct Student std1; std1.Name std1.id std1.grade การอ้างอิงตัวแปรสมาชิกของ structure
std1 struct Student{ char Name[10];int id; float grade;}std1;strcpy(std1.Name, “oak”);std1.id = 1359;std1.grade = 4.00; firstName “oak” id 1359 grade 4.00 การกำหนดค่าให้สมาชิกโครงสร้างแบบ ข้อความ จะกำหนดผ่านฟังก์ชั่น strcpy()รูปแบบ strcpy(ตัวแปร, ข้อความ)หมายเหตุ ต้องทำการ include string.hเข้ามาในโปรแกรมด้วย การกำหนดค่าให้ Structure
std1 struct Student{ char Name[10];int id; float grade;}struct Student std1;struct Student *pStd1;pStd1 = &std1; firstName id grade pStd1 พอยเตอร์กับสตรัคเจอร์ ตัวแปรพอยเตอร์ชี้ไปที่ address ของตัวแปรโครงสร้าง
หลังจากทำการชี้ไปที่ตัวแปรโครงสร้างแล้วหลังจากทำการชี้ไปที่ตัวแปรโครงสร้างแล้ว struct Student{ char Name[10];int id; float grade;}struct Student std1;struct Student *pStd1;pStd1 = &std1; สิ่งที่สามารถอ้างอิงหลังทำการชี้ pStd1->Name เหมือน std1.NamepStd1->id เหมือน std1.idpStd1->grade เหมือน std1.gradeรูปแบบชื่อตัวแปรพอยเตอร์->สมาชิก การอ้างอิงค่าสมาชิกโดยใช้พอยเตอร์