Important Announcement
PubHTML5 Scheduled Server Maintenance on (GMT) Sunday, June 26th, 2:00 am - 8:00 am.
PubHTML5 site will be inoperative during the times indicated!

Home Explore เอกสารติว

เอกสารติว

Published by krupook_sajai, 2022-06-18 06:09:20

Description: เอกสารติว

Search

Read the Text Version

การประกาศตัวแปรชี้ (pointer) ช้ีไปยงั struct กรณกี ารส่งอากวิ เมนทเ์ ปน็ ตวั แปร s t r u c t จะไม่เหมาะกับ s t r u c t ท่ีมีขนาดใหญ่ เนือ่ งจากทกุ ครั้งท่ีสง่ ตัวแปร struct จะเป็นการสาเนา ตวั แปรตวั ใหมข่ ้ึนมาในฟงั กช์ นั ซงึ่ จะทาใหช้ ้าและเปลืองพ้นื ทห่ี น่วย ความจา เราจะใชพ้ อยนเ์ ตอร์เขา้ มาชว่ ยแกป้ ญั หานี้ โดยส่งแอดเดรสของตวั แปร struct มายงั ฟงั กช์ นั ซง่ึ รับอากิวเมนท์ เป็นพอยน์เตอร์ อากิวเมนทจ์ ะชไ้ี ปยังแอดเดรสเรม่ิ ตน้ ของ ตวั แปร struct จะชว่ ยใหก้ ารทางานเรว็ ข้ึนและเปลืองหนว่ ยความจา นอ้ ยลง แตส่ ่ิงทตี่ อ้ งระวงั คือหากมกี ารเปลีย่ นแปลงคา่ ท่ีอากิวเมนท์ พอยนเ์ ตอรช์ อี้ ยู่ คา่ ในตวั แปร struct ท่สี ง่ มายังฟงั กช์ นั จะเปลย่ี นตาม โดยอัตโนมตั ิ 151

ตัวอยา่ ง struct point origin, *pp; pp = &original; printf ( “origin is (%d, %d)\\n”, (*pp).x, (*pp).y ); จะได้ตัวแปร pp ช้ไี ปยังขอ้ มูลแบบโครงสร้างชอื่ struct point การเขียน *pp จะเป็นการอ้างถึงโครงสร้าง การอา้ งถึงสมาชิกสามารถทาไดโ้ ดยอา้ ง (*pp).x หรือ (*pp).y 152

หมายเหตุ สง่ิ ท่ตี อ้ งระวงั คือ (*pp).x จะไม่ เหมือนกับ *pp.x เนือ่ งจากเคร่อื งหมาย . จะ มีลาดบั ความสาคัญสูงกวา่ * ทาจะการแปล ความหมาย *pp.x จะเหมอื นกบั การอา้ ง *(pp.x) ซึ่งจะทาใหเ้ กิดความผดิ พลาดขน้ึ 153

การอา้ งถึงสมาชกิ อาจเขยี นอีกลกั ษณะหนง่ึ โดยใช้ เคร่ืองหมาย -> สมมติ p เปน็ พอยน์เตอร์ รปู แบบ การใชเ้ ปน็ ดังน้ี p->member-of-structure จะสามารถแปลงประโยคการใชพ้ อยน์เตอร์ อ้างสมาชิกของ struct จากตวั อย่างข้างบนไดว้ า่ printf ( “origin is (%d, %d)\\n”, pp->x, pp->y); 154

ตัวอยา่ ง หากมีพอยน์เตอร์ชไ้ี ปยัง struct rect ดงั นี้ struct rect r, *rp = r; การอา้ งถึงสมาชิกต่อไปน้จี ะมผี ลเท่ากบั การอ้างถงึ สมาชิกตวั เดยี วกัน r.pt1.x rp->pt1.x (r.pt1).x (rp->pt1).x 155

6.9 (pointer) ป โ ร ร (pointer to structures) พอยน์เตอรเ์ ปน็ ตวั แปรทเี่ ก็บแอดเดรสของตวั แปรอ่นื สามารถใชช้ ไ้ี ปยังข้อมลู ประเภทใด ๆ การใชพ้ อยนเ์ ตอร์ชี้ไปยงั โครงสร้างสามารถทาได้ ดังนี้ 156

แบบที่ 1 typedef struct { การประกาศ int day; แบบขอ้ มูล int month; โครงสร้าง int year; การประกาศ } Date; ตวั แปรขอ้ มูล แบบโครงสรา้ ง Date today; การประกาศตวั Date *ptrdate; แปร pointer ช้ีไป ยงั โครงสร้า1ง57

แบบที่ 2 struct date { int day; int month; int year; } *ptrdate; 158

แบบที่ 3 typedef struct { การประกาศ int day; แบบข้อมูล int month; โครงสร้าง int year; การประกาศประเภท } Date; ตวั แปร pointer ชี้ไปยัง โครงสรา้ ง typedef Date *PtrDate; การประกาศตัว PtrDate ptrdate; แปร pointer ชี้ไป ยงั โครงสร้า1ง59

การประกาศตัวแปร ptrdate ทงั้ 3 ลักษณะ จะสามารถใชง้ านได้เหมอื นกนั ท้งั หมด หากตอ้ งการให้ ptrdate ช้ไี ปยังตัวแปร โครงสร้างสามารถทาไดด้ งั นี้ ptrdate = &today; 160

การอา้ งถงึ สมาชิกของโครงสรา้ งผา่ นตวั แปรพอยน์เตอร์ ptrdate->day = 7; if ( ptrdate->day == 31 && ptrdate->month == 12 ) ..... scanf ( “%d”, &ptrdate->year ); การอ้างถงึ สมาชิกโครงสรา้ งโดยใชเ้ คร่ืองหมาย -> (*ptrdate).day = 7; if ( (*ptrdate).day == 31 && (*ptrdate).month == 12 ) ..... scanf ( “%d”, &((*ptrdate).year) ); 161

ตัวอย่าง 6.8 โปรแกรมตัวอยา่ งการใช้ตัวชี้ (pointer) ชี้ไป ยังโครงสร้าง #include <stdio.h> struct date { /*date template */ int day; int month; int year; }; typedef struct date Date; typedef Date *PtrDate; 162

ตัวอย่าง 6.8 (ต่อ) main ( ) { Date today; PtrDate ptrdate; ptrdate = &today; ptrdate->day = 27; ptrdate->month = 9; ptrdate->year = 1985; printf ( “Today\\’s date is %2d/%2d/%4d\\n”, ptrdate->day, ptrdate->month, ptrdate->year ); } 163

นอกจากน้ียังสามารถทาการกาหนดค่าเรม่ิ ตน้ ใหก้ ับตัวแปรแบบโครงสร้าง เช่น Date xmas = { 25, 12, 1986 }; และหากมกี ารกาหนดค่าเร่มิ ตน้ ใหก้ บั สมาชิกของ โครงสร้างไม่ครบทกุ ตัว หากตวั แปรนนั้ เป็น external หรือ static ค่าของสมาชกิ ทข่ี าดไปจะถกู กาหนดให้เปน็ 0 แต่หากเปน็ ประเภท automatic จะไม่สามารถคาดได้วา่ ค่า ของสมาชิกทไ่ี ปจะเปน็ ค่าใด 164

6.10 รเร โ ร ร การใชง้ านโครงสร้างนอกจากใชใ้ นลักษณะของตัวแปรแล้ว ยงั สมารถใชง้ านในลกั ษณะของอาเรย์ไดอ้ กี ดว้ ย เช่น การ เกบ็ ขอ้ มลู ประวตั ิของพนกั งาน จะมโี ครงสรา้ งท่ใี ช้เก็บ ข้อมูลของพนักงานแตล่ ะคน หากใช้ในลกั ษณะของตวั แปร ปกตจิ ะสามารถเกบ็ ขอ้ มูลของพนกั งานไดเ้ พียง 1 คน ซึ่ง พนกั งานท้งั บริษทั อาจจะมีหลายสิบหรอื หลายร้อยคน การ เก็บขอ้ มูลในลักษณะนี้จะใช้อาเรย์เข้ามาช่วย เช่น Person staff[STAFFSIZE]; 165

การอ้างโดยใช้คาสั่งต่าง ๆ staff อา้ งถงึ อาเรยข์ องโครงสรา้ ง staff[i] อ้างถึงสมาชกิ ที่ i ในอาเรย์ staff[i].forename อ้างถึงช่ือหน้าของสมาชิกที่ I ของอาเรย์ staff[i].surname[j] อ้างถงึ ตวั อักษรตวั ท่ี j ในนามสกลุ ของสมาชิกท่ี i ของอาเรย์ 166

การเรยี กใช้งานสมาชกิ บางตวั ในอารเ์ รย์ของ โครงสร้างผ่านฟงั กช์ ัน การใชข้ ้อมลู สมาชกิ แต่ละตวั จะอ้างถึงโดยการอ้าง ผา่ นระบบดัชนีเหมอื นอาร์เรยท์ ่วั ไป เช่น ฟงั กช์ นั ท่ี ใชใ้ นการพิมพช์ ่อื สมาชกิ คนที่ระบุ จะเรียกใช้โดย print_person ( staff[k] ); รูปแบบฟังก์ชันสามารถกาหนดดว้ ย void print_person ( Person employee ) 167

การเรยี กใช้งานสมาชกิ ทุกตวั ในอารเ์ รย์ของ โครงสรา้ งผา่ นฟงั กช์ ัน หากตอ้ งการเรยี กใชง้ านฟังกช์ ันที่ทางานกับทงั้ อารเ์ รย์ เช่น การเรยี กใชง้ านฟังก์ชนั ท่ที าการเรยี งลาดบั อาร์เรยต์ ามช่อื หน้า จะตอ้ งสง่ อารเ์ รย์และขนาดของ อารเ์ รยไ์ ปยงั ฟังก์ชนั นั้น เช่น sort_forename ( staff, STAFFSIZE ); รูปแบบฟงั ก์ชันสามารถกาหนดดว้ ย void sort_forename ( Person staff[ ], int size ) 168

การกาหนดค่าเริ่มต้นให้กบั อาร์เรยข์ อง โครงสรา้ ง การกาหนดคา่ เรมิ่ ต้นให้กับอารเ์ รย์ของโครงสร้างสามารถทาได้ โดย Person staff[ ] = { { “Bloggs”, “Joe”, MALE, 21 }, { “Smith”, “John”, MALE, 30 }, { “Black”, “Mary”, FEMALE, 25 } }; 169

6.11 รเร แ มิ ิ (Multi-dimensional Arrays) จากพ้นื ฐานทผี่ า่ นมาเรอื่ งอาร์เรย์จะเป็นลักษณะ ของอาร์เรยม์ ิติเดยี ว แตอ่ าร์เรย์อาจจะมมี ากกว่า 1 มติ กิ ็ ได้ เช่น ข้อมูลคะแนนสอบของนกั ศึกษาแต่ละคน ภายในชนั้ ซึง่ แบ่งเป็นคะแนนเกบ็ หลายส่วน จะพบว่า หากตอ้ งการเก็บข้อมูลคะแนนสอบของนกั ศกึ ษาแต่ละ คนสามารถใช้อาร์เรยม์ ติ เิ ดียว ดังตัวอยา่ ง 170

#define NUMBER_OF_PAPERS 5 int student [ NUMBER_OF_PAPERS ]; /* int student[5]; */ student[0] student[1] student[2] student[3] student[4] 5.6 8.5 12.6 24.1 16.0 171

แตห่ ากเพิม่ เติมวา่ ใหเ้ กบ็ ขอ้ มูลคะแนนสอบ ของนกั ศึกษาทกุ คน จะต้องใชอ้ ารเ์ รย์หลาย มิตเิ ข้ามาเกย่ี วข้อง ตวั อย่างเช่นการเกบ็ ข้อมลู คะแนนสอบของนักศกึ ษา 2 คนโดยมีคะแนน สอบของการสอบทัง้ สนิ้ 5 คร้งั 172

คร้งั ท่ี 1 2 3 4 5 นาย ก 5.6 8.5 12.6 24.1 16.0 นาย ข 6.0 7.2 15.0 25.0 18.0 รปู ท่ี 6.10 แสดงตัวอย่างการเก็บขอ้ มลู คะแนนของ นักศกึ ษา 173

การอ้างองิ ถงึ ข้อมลู ในอาร์เรย์ 2 มิติ เราจะมองอารเ์ รย์ 2 มิตใิ นลกั ษณะที่ประกอบด้วย แถว(row) และคอลมั น(์ column) โดยข้อมูลทีอ่ ้างองิ ตวั แรกหมายถึง แถว และข้อมูลถดั มาคอื คอลมั น์ markmsm[marmaomrmakrawkrasrak]sk[rrs0kc[sk20[]so[s0[]1[0l[[]1u81]20[][8]m]8][[]0]02n]]] row column 174

จากลักษณะความต้องการเก็บข้อมลู ดังกลา่ วจะต้อง เตรียมอาร์เรย์เพือ่ เกบ็ ขอ้ มลู ในลักษณะ 2 มติ ิ สามารถ ประกาศอาร์เรยด์ ังนี้ #define NUMBER_OF_PAPERS 5 #define NUMBER_OF_STUDENTS 50 int marks[NUMBER_OF_STUDENTS][NUMBER_OF_PAPERS]; /* int marks[50][5]; */ 175

โปรแกรมการรับค่าอาร์เรย์ 2 มิติ #include<stdio.h> score[0][0] score[0][1] score[0][2] main() score[1][0] score[1][1] score[1][2] { float score[10][3]; score[9][0] score[9][1] score[9][2] int i,j; printf(“Please put score\\n”); 176 for(i=0;i<10;i++) for(j=0;j<3;j++) scanf(“%f”,&score[i][j]); }

ลักษณะข้อมูล หน่วยความจา score[0][0] score[0][1] score[0][2] 200 202 204 206 208 210 score[1][0] score[1][1] score[1][2] [0][0] [0][1] [0][2] [1][0] [1][1] [1][2] score[2][0] score[2][1] score[2][2] 210 212 214 216 218 220 [2][0] [2][1] [2][2] [3][0] [3][1] [3][2] 220 222 224 226 228 230 [4][0] [4][1] [4][2] [5][0] [5][1] [5][2] score[9][0] score[9][1] score[9][2] 177


Like this book? You can publish your book online for free in a few minutes!
Create your own flipbook