• user warning: Table 'cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '3:111e22013f453a570773b9889e3a13b0' in /home/tgv/htdocs/includes/cache.inc on line 27.
  • user warning: Table 'cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<!--paging_filter--><p><v:roundrect arcsize=\"10923f\" fillcolor=\"teal\" stroked=\"f\" style=\"margin-top: 18pt; z-index: -4; margin-left: 180pt; width: 108pt; position: absolute; height: 36pt\" id=\"_x0000_s1032\"><v:shadow on=\"t\" offset=\"6pt,6pt\" opacity=\".5\"></v:shadow></v:roundrect><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"color: #000000\"><b><span style=\"font-size: 20pt; font-family: \'Angsana New\'\" lang=\"TH\">ตัวชี้ </span></b><b><span style=\"font-size: 20pt; font-family: \'Angsana New\'\">(Pointer)<o:p></o:p></span></b></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">ตัวชี้ (</span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">Pointer) <span lang=\"TH\">มีลักษณะเด่นของเครื่องมือดำเนินการที่สำคัญที่สุดในภาษาซี ตัวชี้หรือพอยน์เตอร์ มีประโยชน์มากในการจัดการโครงสร้างข้อมูลแบบพลวัต (</span>dynamic data structure) <span lang=\"TH\">เช่น รายการเชื่อมโยง (</span>Linked List) <span lang=\"TH\">เป็นต้น ซึ่งรายละเอียดของเนื้อหาในส่วนนี้จะสามารถศึกษาได้ในวิชาโครงสร้างข้อมูล นอกจากนี้ตัวแปรชนิดตัวชี้ยังมีประโยชน์ในแง่ของประสิทธิภาพการทำงาน ช่วยให้โปรแกรมทำงานได้เร็วขึ้นและประหยัดเนื้อที่ในหน่วยจำ ซึ่งเนื้อหาในส่วนนี้จะแสดงในหัวข้อการใช้งานตัวชี้กับฟังก์ชัน</span><o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">1. <span lang=\"TH\">การประกาศตัวแปรชนิดตัวชี้</span><o:p></o:p></span></span></b><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">ตัวแปรชนิดตัวชี้จะเก็บค่าเลขที่อยู่ของหน่วยความจำ ซึ่งแตกต่างจากตัวแปรชนิดอื่นที่จะเก็บค่าที่แท้จริง เช่นตัวแปรชนิดจำนวนจริง (</span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">float) <span lang=\"TH\">จะเก็บค่าจำนวนจริงที่มีค่าสูงสุดถึง </span>3.4 x 1038<span>  </span><span lang=\"TH\">และเก็บความละเอียดของทศนิยมได้ถึง </span>7 <span lang=\"TH\">ตำแหน่ง เป็นต้น</span><o:p></o:p></span></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">รูปแบบในการประกาศตัวแปรชนิดตัวชี้คือ</span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">ชนิดข้อมูล </span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">*<span lang=\"TH\">ชื่อตัวแปร</span>; <span lang=\"TH\">หรือ<o:p></o:p></span></span></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">ชนิดข้อมูล</span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">* <span lang=\"TH\">ชื่อตัวแปร</span>;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">เช่น<span>  </span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">int *point; <span lang=\"TH\">เป็นการประกาศตัวแปรชื่อ </span>point <span lang=\"TH\">ซึ่งมีชนิดเป็นตัวชี้ที่จะทำหน้าที่เก็บตำแหน่งในหน่วยความจำที่มีข้อมูลชนิดเลขจำนวนเต็มอยู่ ซึ่งเครื่องหมายดอกจัน (</span>*) <span lang=\"TH\">จะเป็นสิ่งที่ทำให้เราทราบว่าตัวแปร </span>point <span lang=\"TH\">เป็นตัวชี้</span><o:p></o:p></span></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">การกำหนดค่าเริ่มต้นให้กับโปรแกรมชนิดตัวชี้สามารถกำหนดให้มีค่าเป็น </span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">NULL <span lang=\"TH\">หรือ </span>0 <span lang=\"TH\">ซึ่งหมายความว่า ตัวแปรนี้ยังไม่มีการเก็บตำแหน่งที่อยู่ใดๆ นอกจากนี้ยังสามารถกำหนดให้ตัวแปรนี้อ้างอิงไปยังตำแหน่งในหน่วยความจำที่ต้องการซึ่งรายละเอียดในส่วนนี้จะกล่าวถึงในหัวข้อต่อไป</span><o:p></o:p></span></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">ห้ามมีเว้นวรรคระหว่างเครื่องหมายดอกจันและตัวแปร เช่น </span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">int * error <span lang=\"TH\">เป็นการประกาศที่ผิด</span><o:p></o:p></span></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">การประกาศตัวแปรชนิดตัวชี้หลายตัวในเวลาเดียวกันสามารถทำได้ เช่น </span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">int *ptr1, *ptr2; <span lang=\"TH\">นอกจากนี้ถ้าต้องการหลีกเลี่ยงการใช้เครื่องหมายดอกจันทุกครั้งที่ประกาศตัวแปรชนิดตัวชี้สามารถทำได้ด้วยการใช้คำหลัก </span>typedef <span lang=\"TH\">เช่น </span><o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">typedef int* Ptype;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">Ptype ptr1, ptr2;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">2. <span lang=\"TH\"><span> </span>ตัวดำเนินการสำหรับตัวชี้</span><o:p></o:p></span></span></b><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">ตัวดำเนินการสำหรับตัวชี้มีอยู่ด้วยกัน 2 ตัว คือ ตัวดำเนินการเลขที่อยู่ และตัวดำเนินการอ้างอิง</span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p></o:p></span></span><span style=\"color: #000000\"><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">2.1 ตัวดำเนินการเลขที่อยู่ (</span></b><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">address operator)<o:p></o:p></span></b></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">ตัวดำเนินการนี้จะใช้เครื่องหมาย </span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">&amp; <span lang=\"TH\">นำหน้าตัวแปร ซึ่งจะหมายความถึงตำแหน่งที่อยู่ของตัวแปรนั้นในหน่วยความจำ</span><o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"color: #000000\"><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">ตัวอย่าง 1</span></b><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p></o:p></span></b></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">การอ้างอิงตัวชี้</span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">#include&lt;stdio.h&gt;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">void main()<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">{<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">int z = 10;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"DE\"><span style=\"color: #000000\">int *ZPtr;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"DE\"><span style=\"color: #000000\">ZPtr = &amp;z;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">}<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">ข้อความสั่ง </span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">ZPtr = &amp;z; <span lang=\"TH\">มีวัตถุประสงค์เพื่อให้ตัวแปรชนิดตัวชี้ </span>ZPtr <span lang=\"TH\">เก็บเลขที่อยู่ของตัวแปร </span>z <span lang=\"TH\">ซึ่งอาจแสดงในรูปแบบตัวชี้ดังรูป 1</span><o:p></o:p></span></span><v:shapetype o:preferrelative=\"t\" filled=\"f\" o:spt=\"75\" path=\"m@4@5l@4@11@9@11@9@5xe\" coordsize=\"21600,21600\" stroked=\"f\" id=\"_x0000_t75\"><v:stroke joinstyle=\"miter\"></v:stroke><v:formulas><v:f eqn=\"if lineDrawn pixelLineWidth 0\"></v:f><v:f eqn=\"sum @0 1 0\"></v:f><v:f eqn=\"sum 0 0 @1\"></v:f><v:f eqn=\"prod @2 1 2\"></v:f><v:f eqn=\"prod @3 21600 pixelWidth\"></v:f><v:f eqn=\"prod @3 21600 pixelHeight\"></v:f><v:f eqn=\"sum @0 0 1\"></v:f><v:f eqn=\"prod @6 1 2\"></v:f><v:f eqn=\"prod @7 21600 pixelWidth\"></v:f><v:f eqn=\"sum @8 21600 0\"></v:f><v:f eqn=\"prod @7 21600 pixelHeight\"></v:f><v:f eqn=\"sum @10 21600 0\"></v:f></v:formulas><v:path gradientshapeok=\"t\" o:extrusionok=\"f\" o:connecttype=\"rect\"></v:path><o:lock v:ext=\"edit\" aspectratio=\"t\"></o:lock></v:shapetype><v:shape type=\"#_x0000_t75\" style=\"margin-top: -0.7pt; z-index: 1; margin-left: 126pt; width: 198pt; position: absolute; height: 138.45pt\" id=\"_x0000_s1026\"><v:imagedata src=\"file:///C:\\DOCUME~1\\ADMINI~1\\LOCALS~1\\Temp\\msohtml1\\01\\clip_image001.gif\" o:title=\"001\"><span style=\"color: #000000\"></span></v:imagedata></v:shape><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> <img border=\"0\" width=\"1\" src=\"/\" height=\"1\" /></span></o:p></span><br clear=\"all\" /><br />\n<span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">รูปที่ 1 ตัวแปรชนิดตัวชี้ในหน่วยความจำ</span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"color: #000000\"><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">2.2 ตัวดำเนินการอ้างอิง (</span></b><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">dereferencing operator)<o:p></o:p></span></b></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">ตัวดำเนินการนี้จะใช้เครื่องหมายดอกจัน (*) นำหน้าตัวแปรชนิดตัวชี้ ซึ่งจะเป็นอ้างถึงค่าข้อมูลที่ตัวแปรชนิดตัวชี้นั้นชี้ไป ซึ่งค่าของข้อมูลที่ตัวชี้อ้างอิงนี้สามารถถูกเปลี่ยนแปลงค่าได้ เช่น การเพิ่มค่าอีก 1 สามารถทำได้โดยใช้คำสั่ง (*</span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">ptr)++ <span lang=\"TH\">จะเป็นการเพิ่มค่าที่ตัวชี้ </span>ptr <span lang=\"TH\">ชี้ไป การแสดงค่าที่ตัวชี้ชี้ไปก็สามารถทำได้โดยใช้คำสั่ง </span>printf(“%d”,ZPtr); <span lang=\"TH\">จะส่งผลให้โปรแกรมแสดงค่า 10 ออกทางจอภาพตามรูปที่ 1</span><o:p></o:p></span></span><span style=\"color: #000000\"><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">ตัวอย่างที่ 2</span></b><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p></o:p></span></b></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\"><span style=\"color: #000000\">การใช้งานตัวชี้<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">#include&lt;stdio.h&gt;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"FR\"><span style=\"color: #000000\">void main()<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"FR\"><span style=\"color: #000000\">{<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"FR\"><span style=\"color: #000000\">int x;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"FR\"><span style=\"color: #000000\">int y = 20;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"FR\"><span style=\"color: #000000\">int *z;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"FR\"><span style=\"color: #000000\">z = &amp;y;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"FR\"><span style=\"color: #000000\">x = *z;<o:p></o:p></span></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"FR\">printf(</span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">“</span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"FR\">%d</span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">”</span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"FR\">,x);<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">}<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">จากส่วนโปรแกรมข้างต้นเมื่อสั่งให้โปรแกรมทำงานจะมีการแสดงค่าตัวแปรของ </span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">x <span lang=\"TH\">ซึ่งมีค่าเป็น 20 ซึ่งเท่ากับค่าที่เก็บอยู่ในตัวแปร </span>y <span lang=\"TH\">ลำดับเหตุการณ์ที่เกิดขึ้นแสดงดังรูปที่ 2</span><o:p></o:p></span></span><v:shape type=\"#_x0000_t75\" style=\"margin-top: 8.25pt; z-index: 2; margin-left: 108pt; width: 254.45pt; position: absolute; height: 261pt\" id=\"_x0000_s1027\"><v:imagedata src=\"file:///C:\\DOCUME~1\\ADMINI~1\\LOCALS~1\\Temp\\msohtml1\\01\\clip_image003.gif\" o:title=\"002\"><span style=\"color: #000000\"></span></v:imagedata></v:shape><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><br clear=\"all\" /><br />\n<span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">รูปที่ 2 ลำดับเหตุการณ์ที่เกิดขึ้นในหน่วยความจำ</span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">นอกจากนี้สามารถสั่งให้ตัวแปรชนิดตัวชี้ชี้ไปที่เดียวกันกับตัวแปรตัวชี้ตัวอื่น เช่น ถ้าตัวแปร </span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">next <span lang=\"TH\">มีชนิดเป็นตัวชี้ เราสามารถสั่งให้ชี้ไปที่เดียวกันกับ ที่ตัวแปร </span>z <span lang=\"TH\">ชี้ไปโดยใช้ข้อความสั่ง </span>next = z;<o:p></o:p></span></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">การใช้ตัวดำเนินการแบบอ้างอิงกับตัวแปรชนิดตัวชี้ที่ยังไม่ได้มีการกำหนดค่าจะทำให้เกิดข้อผิดพลาดขึ้นได้</span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p></o:p></span></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">เพื่อให้เห็นภาพรวมของการใช้ตัวแปรชนิดตัวชี้กับตัวดำเนินการทั้งสองรูปแบบจึงได้แสดงตัวอย่างโปรแกรมดังนี้</span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"color: #000000\"><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">ตัวอย่างที่ 3</span></b><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p></o:p></span></b></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">การแสดงค่าที่เก็บในตัวชี้</span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">#include&lt;stdio.h&gt;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">void main()<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"FR\"><span style=\"color: #000000\">{<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"FR\"><span style=\"color: #000000\">int y;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"FR\"><span style=\"color: #000000\">int *yPtr;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"FR\"><span style=\"color: #000000\">y = 10;<o:p></o:p></span></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"FR\">yPtr = &amp;y;</span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">printf(“The address of y is %p\\n”, &amp;y);<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">printf(“The value of yPtr is %p\\n”, yPtr);<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">printf(“The value of y is %d\\n”, y);<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">printf(“The value of *yPtr is %d\\n”, *yPtr);<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">}<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">ค่าที่แสดงตำแหน่งในหน่วยความจำบนจอภาพสำหรับฟังก์ชัน </span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">printf(“The address of y is %p\\n”,&amp;y); <span lang=\"TH\">และ </span>printf(“The value of yPtr is %p\\n”,yPtr); <span lang=\"TH\">จะแตกต่างกันไปในแต่ละครั้งของการกระทำการโปรแกรมโดยขึ้นอยู่กับเลขที่อยู่ของหน่วยความจำที่ระบบปฏิบัติการจัดสรรให้</span><o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">3. <span lang=\"TH\"><span> </span>การใช้ตัวแปรชนิดตัวชี้กับค่าคงที่</span><o:p></o:p></span></span></b><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">ตัวแปรชนิดตัวชี้สามารถถูกระบุคุณสมบัติเพิ่มเติมได้โดยการนำคำหลัก </span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">const <span lang=\"TH\">ซึ่งหมายถึงค่าคงที่มาประกอบซึ่งจะมีความหมายแตกต่างกันไปดังนี้</span><o:p></o:p></span></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">1. </span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">const int *Ptr; <span lang=\"TH\">หรือ </span>int const *Ptr <span lang=\"TH\">หมายถึงการกำหนดให้ตัวชี้ </span>Ptr <span lang=\"TH\">ชี้ไปที่ข้อมูลตัวเลขจำนวนเต็มที่มีค่าคงที่ ไม่สามารถเปลี่ยนแปลงค่าได้ แต่ตัวชี้ </span>Ptr <span lang=\"TH\">สามารถเปลี่ยนไปชี้ที่อื่นได้</span><o:p></o:p></span></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">2. </span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">int *const Ptr; <span lang=\"TH\">หมายถึงการบังคับให้ตัวชี้ </span>Ptr <span lang=\"TH\">ชี้ไปที่ใดที่หนึ่งและห้ามเปลี่ยนตำแหน่งการชี้ แต่ค่าของข้อมูลที่เก็บอยู่ในตำแหน่งนั้นสามารถเปลี่ยนแปลงได้</span><o:p></o:p></span></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">3. </span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">const int *const Ptr; <span lang=\"TH\">หมายถึงการการบังคับให้ตัวชี้ </span>Ptr <span lang=\"TH\">ชี้ไปที่ใดที่หนึ่งและห้ามเปลี่ยนตำแหน่งการชี้และค่าของข้อมูลที่เก็บอยู่ในตำแหน่งนั้นไม่สามารถเปลี่ยนแปลงได้<o:p></o:p></span></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"color: #000000\"><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">4.<span>  </span>การเรียกใช้ฟังก์ชันที่มีการส่งตัวแปรแบบอ้างอิง</span></b><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p></o:p></span></b></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">การเขียนโปรแกรมที่ดีควรจะมีการแบ่งส่วนชุดคำสั่งการทำงานเป็นกลุ่ม หรือเรียกอีกอย่างหนึ่งว่าฟังก์ชัน โดยส่วนของโปรแกรมหลักจะสามารถสั่งให้ฟังก์ชันทำงานได้โดยการเรียกชื่อฟังก์ชันและส่งตัวแปรที่บรรจุข้อมูลไปยังฟังก์ชันเพื่อให้ฟังก์ชันทำการประมวลผลข้อมูลที่ส่งไป รูปแบบการส่งตัวแปรไปยังฟังก์ชันมี 2 รูปแบบด้วยกันคือ การส่งตัวแปรเฉพาะค่า หรือการเรียกด้วยมูลค่า (</span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">call by value) <span lang=\"TH\">และการส่งตัวแปรแบบอ้างอิงหรือการเรียกด้วยการอ้างอิง (</span>call by reference) <span lang=\"TH\">ซึ่งวิธีการเรียกโดยมูลค่านี้ได้อธิบายไว้ในเนื้อหาบทที่ 4 ในที่นี้จะขออธิบายถึงการส่งตัวแปรแบบอ้างอิงซึ่งต้องอาศัยตัวแปรชนิดตัวชี้ในการดำเนินการ วัตถุประสงค์ของการส่งตัวแปรอ้างอิงคือการยินยอมให้ฟังก์ชันสามารถทำการเปลี่ยนแปลงค่าของตัวแปรนี้อย่างถาวร หมายความว่าเมื่อฟังก์ชันได้ทำงานเสร็จแล้วค่าของตัวแปรนี้จะมีค่าไม่เหมือนเดิมเมื่อเทียบกับค่าของตัวแปรก่อนเรียกฟังก์ชัน ซึ่งจะได้แสดงให้ดูในตัวอย่าง</span><o:p></o:p></span></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">วิธีการส่งตัวแปรแบบอ้างอิงไปยังฟังก์ชันใช้รูปแบบดังนี้</span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"color: #000000\"><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">ชนิดข้อมูล ชื่อฟังก์ชัน(</span></b><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">&amp;<span lang=\"TH\">ตัวแปรชนิดตัวชี้)<o:p></o:p></span></span></b></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">การเขียนส่วนหัวของฟังก์ชันใช้รูปแบบดังนี้</span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"color: #000000\"><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">ชนิดข้อมูล ชื่อฟังก์ชัน(ชนิดข้อมูล *ตัวแปรชนิดตัวชี้)</span></b><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p></o:p></span></b></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"color: #000000\"><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">ตัวอย่างที่ 4</span></b><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p></o:p></span></b></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">การเรียกฟังก์ชันโดยใช้ตัวชี้</span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">#include&lt;stdio.h&gt;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">void power2(int *);<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">void main()<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">{<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">int num = 3;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">printf(“The value of num before calling function is %d \\n”,num);<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">power3(&amp;num);<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">printf(“The value of num after calling function is %d \\n”,num);<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">}<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">void power3(int *Ptr)<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">{<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">*Ptr = *Ptr * *Ptr * *Ptr;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">}<o:p></o:p></span></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">จากโปรแกรมในข้างต้นจะเห็นได้ว่าส่วนของโปรแกรมหลักได้ทำการเรียกฟังก์ชัน </span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">power3() <span lang=\"TH\">โดยส่งเลขที่อยู่ของตัวแปร </span>num <span lang=\"TH\">ไปให้ฟังก์ชันกระทำการ สังเกตที่ส่วนหัวของฟังก์ชัน จะเห็นว่าตัวแปรที่รับค่ามีชนิดเป็นตัวชี้ที่อ้างอิงไปยังข้อมูลชนิดจำนวนเต็ม รูปที่ 3 จะแสดงถึงลำดับเหตุการณ์ที่เกิดขึ้นในหน่วยความจำ</span><o:p></o:p></span></span><v:shape type=\"#_x0000_t75\" style=\"margin-top: 1.7pt; z-index: 3; margin-left: 117pt; width: 204.15pt; position: absolute; height: 7in\" id=\"_x0000_s1028\"><v:imagedata src=\"file:///C:\\DOCUME~1\\ADMINI~1\\LOCALS~1\\Temp\\msohtml1\\01\\clip_image005.gif\" o:title=\"003\"><span style=\"color: #000000\"></span></v:imagedata></v:shape><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><br clear=\"all\" /><br />\n<span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">รูปที่ 3 ลำดับเหตุการณ์การเรียกฟังก์ชันโดยการส่งตัวแปรแบบอ้างอิงในหน่วยความจำ</span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">จากรูปที่ 3 จะสังเกตได้ว่าขณะที่โปรแกรมหลักเรียกฟังก์ชัน </span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">power3() <span lang=\"TH\">โดยส่งเลขที่อยู่ของตัวแปร </span>num <span lang=\"TH\">ไปให้กับตัวแปรชนิดตัวชี้ชื่อ </span>Ptr <span lang=\"TH\">ที่ส่วนหัวของฟังก์ชัน จะเกิดการอ้างอิงขึ้นในหน่วยความจำ (สังเกตที่ลูกศร) หลังจากนั้นเมื่อชุดข้อความสั่งในฟังก์ชันกระทำการกับตัวแปรชนิดตัวชี้ </span>Ptr <span lang=\"TH\">ก็เปรียบเสมือนกับการกระทำการที่ตัวแปร </span>num <span lang=\"TH\">นั่นเองดังนั้นเมื่อฟังก์ชัน </span>power3() <span lang=\"TH\">ทำงานเสร็จสิ้นลง และทำงานเสร็จสิ้นลง และทำการแสดงค่าตัวแปร </span>num <span lang=\"TH\">ออกทางจอภาพ จะได้ค่าใหม่ที่เกิดจากการนำตัวเลขที่เคยเก็บในตัวแปร </span>num <span lang=\"TH\">ยกกำลังสาม</span><o:p></o:p></span></span><span style=\"color: #000000\"><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">ตัวอย่างที่ 5</span></b><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p></o:p></span></b></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">การสลับค่าของข้อมูล</span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">#include&lt;stdio.h&gt;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">void flip(int *, int *);<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">void main()<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">{<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">int num1;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">int num2;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">printf(“This program will swap to integer\\n”);<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">printf(“Please enter number1 and number2 : “);<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"DE\"><span style=\"color: #000000\">scanf(“%d%d”,&amp;num1,&amp;num2);<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">flip(&amp;num1,&amp;num2);<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">printf(“After swapping num1 is %d num2 is %d\\n”, num1, num2);<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">}<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">void flip(int *x, int *y)<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">{<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">int temp;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">temp = *x;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">*x = *y;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">*y = temp;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">}<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">โปรแกรมข้างต้นมีวัตถุประสงค์ในการสลับค่าของตัวแปรที่ผู้ใช้ป้อนเข้ามาโดยการเรียกใช้ฟังก์ชัน </span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">flip() <span lang=\"TH\">ซึ่งรับพารามิเตอร์เป็นตัวแปรชนิดตัวชี้ที่ชี้ไปที่ตัวแปร </span>num1 <span lang=\"TH\">และ </span>num2 <span lang=\"TH\">หลังจากนั้นฟังก์ชัน </span>flip() <span lang=\"TH\">จะทำการสลับค่าในตัวแปรดังกล่าวโดยใช้ตัวชี้ </span>x <span lang=\"TH\">และ ตัวชี้ </span>y <span lang=\"TH\">เพื่อให้เข้าใจง่ายขึ้นจึงแสดงรายละเอียดในรูปที่ </span>4<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><v:shape type=\"#_x0000_t75\" style=\"margin-top: 0px; z-index: 4; margin-left: 36pt; width: 400.3pt; position: absolute; height: 498.6pt\" id=\"_x0000_s1029\"><v:imagedata src=\"file:///C:\\DOCUME~1\\ADMINI~1\\LOCALS~1\\Temp\\msohtml1\\01\\clip_image007.gif\" o:title=\"004\"><span style=\"color: #000000\"></span></v:imagedata></v:shape><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><br clear=\"all\" /><br />\n<span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">รูป </span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">4<span lang=\"TH\"><span>  </span>ลำดับการทำงานเมื่อมีการเรียกฟังก์ชันโดยใช้ตัวชี้<o:p></o:p></span></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"color: #000000\"><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">ตัวอย่างที่ </span></b><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">6<o:p></o:p></span></b></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\"><span style=\"color: #000000\">การเพิ่มค่าที่ตัวชี้อ้างอิงโดยการเรียกฟังก์ชัน<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">#include&lt;stdio.h&gt;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">void increment (int *count_ptr)<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">{<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">(*count_ptr)++;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">}<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">void main()<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">{<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">int count = 0;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">while(count &lt; 10)<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">increment(&amp;count);<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">}<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">โปรแกรมข้างต้นมีวัตถุประสงค์ในการเพิ่มค่าของตัวแปร </span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">count <span lang=\"TH\">โดยการส่งเลขที่อยู่ของตัวแปร </span>count <span lang=\"TH\">ไปให้แก่ตัวชี้ </span>count_ptr <span lang=\"TH\">ที่ฟังก์ชัน </span>increment() <span lang=\"TH\">ฟังก์ชันดังกล่าวจะทำการเพิ่มค่าของ </span>count <span lang=\"TH\">ทีละหนึ่ง ฟังก์ชัน </span>main() <span lang=\"TH\">จะทำการเรียกใช้ฟังก์ชัน </span>increment() <span lang=\"TH\">จำนวน 10 ครั้ง เมื่อโปรแกรมทำงานเสร็จสิ้นลง ตัวแปร </span>count <span lang=\"TH\">จะมีค่าเป็น 10 ครั้ง เมื่อโปรแกรมทำงานเสร็จสิ้นลง<span>    </span>ตัวแปร </span>count <span lang=\"TH\">จะมีค่าเป็น 10</span><o:p></o:p></span></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">จากหลักการส่งตัวแปรไปยังฟังก์ชันจะเห็นว่า การอ้างอิงเลขที่อยู่ของตัวแปรที่เก็บข้อมูลในลักษณะนี้จะทำให้โปรแกรมทำงานได้อย่างมีประสิทธิภาพทั้งในแง่ความเร็วในการประมวลผลและเป็นการประหยัดเนื้อที่ในหน่วยความจำเป็นอย่างมากเมื่อเทียบกับวิธีการส่งตัวแปรแบบเรียกด้วยมูลค่า เนื่องจากการส่งตัวแปรแบบเรียกด้วยมูลค่าจะเกิดกลไกในการคัดลอกข้อมูลจากตัวแปรของผู้เรียกฟังก์ชัน ไปยังตัวแปรที่ส่วนหัวของฟังก์ชัน ซึ่งกลไกนี้จะกินเวลานานถ้าข้อมูลมีขนาดใหญ่ เช่น ข้อมูลชนิดโครงสร้างที่สร้างจากคำหลัก </span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">struct <span lang=\"TH\">ผลที่เกิดตามมาคือจะเกิดการจองเนื้อที่เพื่อเก็บข้อมูลที่เหมือนกันอีกชุดสำหรับฟังก์ชันซึ่งเป็นการสิ้นเปลืองเนื้อที่ อย่างไรก็ตามการส่งตัวแปรแบบเรียกด้วยมูลค่ายังคงมีความสำคัญเนื่องจากบางครั้งอาจไม่ต้องการให้ฟังก์ชันเปลี่ยนแปลงค่าในตัวแปรนั้น</span><o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"color: #000000\"><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">5</span></b><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">. <span lang=\"TH\"><span> </span>การใช้ตัวชี้กับตัวแปรชนิดแถวลำดับ</span><o:p></o:p></span></b></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">ตัวแปรชนิดตัวชี้สามารถช่วยอำนวยความสะดวกในการเข้าถึงข้อมูลที่เก็บอยู่ในแถวลำดับ (</span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">array) <span lang=\"TH\">/ได้ โดยในขั้นตอนแรกจะต้องกำหนดให้ตัวแปรชนิดตัวชี้ชี้ไปยังสมาชิกตัวแรกของตัวแปรแถวลำดับเสียก่อน ซึ่งมี 2 รูปแบบดังนี้</span><o:p></o:p></span></span><span style=\"color: #000000\"><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">รูปแบบที่ 1</span></b><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p></o:p></span></b></span><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span></b><span style=\"color: #000000\"><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">ตัวแปรชนิดตัวชี้ </span></b><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">= <span lang=\"TH\">ตัวแปรแถวลำดับ</span>;<o:p></o:p></span></b></span><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span></b><span style=\"color: #000000\"><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">รูปแบบที่ 2</span></b><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p></o:p></span></b></span><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\"><o:p><span style=\"color: #000000\"> </span></o:p></span></b><span style=\"color: #000000\"><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">ตัวแปรชนิดตัวชี้ </span></b><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">=<span>  </span><span lang=\"TH\">ตัวแปรแถวลำดับ</span>[0];<o:p></o:p></span></b></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"color: #000000\"><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">ตัวอย่างที่ </span></b><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">7 <o:p></o:p></span></b></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">การใช้ตัวชี้ในการอ้างถึงแถวลำดับ</span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">int a[10];<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">int *aPtr;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">aPtr = a;<o:p></o:p></span></span><v:shape type=\"#_x0000_t75\" style=\"margin-top: 12.6pt; z-index: 5; margin-left: 36pt; width: 378pt; position: absolute; height: 346.45pt\" id=\"_x0000_s1030\"><v:imagedata src=\"file:///C:\\DOCUME~1\\ADMINI~1\\LOCALS~1\\Temp\\msohtml1\\01\\clip_image009.gif\" o:title=\"005\"><span style=\"color: #000000\"></span></v:imagedata></v:shape><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><br clear=\"all\" /><br />\n<span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">รูปที่ 5 ลำดับเหตุการณ์ใช้ตัวแปรชนิดตัวชี้ในการอ้างอิงตัวแปรชนิดแถวลำดับ</span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">หลังจากข้อความสั่ง </span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">aPtr = a; <span lang=\"TH\">สามารถใช้ตัวแปรชนิดตัวชี้ในการเข้าถึงข้อมูลในแต่ละสมาชิกของแถวลำดับได้ดังนี้</span><o:p></o:p></span></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">1. การเพิ่มค่าตัวชี้หนึ่งลำดับ (</span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">increment pointer)<o:p></o:p></span></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">คือ การสั่งให้ตัวชี้เลื่อนไปยังสมาชิกตัวถัดไปหนึ่งลำดับ โดยใช้เครื่องหมายบวกบวก เช่น </span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">aPtr++; <span lang=\"TH\">หรือ </span>aPtr = aPtr +1;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">2. <span lang=\"TH\">การลดค่าตัวชี้หนึ่งลำดับ (</span>decrement pointer)<o:p></o:p></span></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">คือ การสั่งให้ตัวชี้เลื่อนไปยังสมาชิกตัวก่อนหน้าหนึ่งลำดับ โดยใช้เครื่องหมายลบลบ เช่น </span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">aPtr--; <span lang=\"TH\">หรือ </span>aPtr = aPtr - 1;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">3. <span lang=\"TH\">การเพิ่มหรือลดค่าตัวชี้มากกว่าหรือน้อยกว่าหนึ่งลำดับ (</span>add/substract pointer)<o:p></o:p></span></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">คือ การสั่งให้ตัวชี้ชี้ข้ามไปยังสมาชิกตัวถัดไปหรือตัวก่อนหน้าตามตัวเลขที่ระบุ เช่น </span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">aPtr = aPtr + 2 ; <span lang=\"TH\">หมายถึงการสั่งให้ตัวชี้ </span>aPtr <span lang=\"TH\">ชี้ไปยังสมาชิกที่อยู่ถัดไป 2 ลำดับ เช่น ถ้าเดิมตัวชี้ </span>aPtr <span lang=\"TH\">ชี้อยู่ที่ </span>a[0] <span lang=\"TH\">เมื่อใช้ข้อความสั่ง </span>aPtr = aPtr + 2 ; <span lang=\"TH\">จะทำให้ตัวชี้นี้ชี้ไปยังแถวลำดับ </span>a[2]<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">4. <span lang=\"TH\">การนำตัวแปรชนิดตัวชี้มาลบกัน</span><o:p></o:p></span></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">คือการนำตัวแปรชนิดตัวชี้สองตัวมาลบกันซึ่งผลลัพธ์ที่ได้คือ ระยะห่างระหว่างสมาชิกในตัวแปรแถวลำดับ+1 หรือจำนวนสมาชิกที่อยู่ระหว่างตัวชี้ทั้งสองบวกด้วย 1 นั่นเอง เช่น ถ้าตัวชี้ </span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">aPtr <span lang=\"TH\">ชี้อยู่ที่ </span>a[2] <span lang=\"TH\">และตัวแปรชนิดตัวชี้ </span>bPtr <span lang=\"TH\">ชี้อยู่ที่ </span>a[5]<o:p></o:p></span></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">ข้อความสั่ง </span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">x = bPtr-aPtr; <span lang=\"TH\">จะได้ผลลัพธ์เป็น 3<o:p></o:p></span></span></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">5.<span>  </span>การเปรียบเทียบตัวแปรชนิดตัวชี้</span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p></o:p></span></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">คือการตรวจสอบว่า ตัวชี้ใดที่ไปที่สมาชิกลำดับที่มากกว่า น้อยกว่า หรือชี้ไปที่สมาชิกตัวเดียวกัน โดยการเปรียบเทียบนี้จะคืนค่าจริงหรือเท็จ ดังนั้นจึงมักนำไปใช้ร่วมกับข้อความสั่ง </span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">if <span lang=\"TH\">หรือข้อความสั่ง </span>while <span lang=\"TH\">ตัวอย่างเช่น</span><o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">if(aPtr = = bPtr)<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">printf(“finish”);<o:p></o:p></span></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">เป็นการตรวจสอบว่า ตัวแปรชนิดตัวชี้ </span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">aPtr <span lang=\"TH\">ชี้ไปที่สมาชิกตัวเดียวกันกับตัวชี้ </span>bPtr <span lang=\"TH\">หรือไม่</span><o:p></o:p></span></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">คำสั่ง<span>      </span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">if(aPtr &gt; bPtr)<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">printf(“aPtr is behind bPtr”);<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"color: #000000\"><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">ตัวอย่างที่ </span></b><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">8<o:p></o:p></span></b></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">การประมวลผลแถวลำดับโดยไม่ใช้ตัวชี้</span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">#include&lt;stdio.h&gt;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">int array[] = {4, 5, 8, 9, 8, 1, 0, 1, 9, 3};<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">int index;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">void main()<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">{<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">index = 0;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">while (array[index] != 0)<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">++index;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">printf(“Number of elements before zero %d\\n”,index);<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">}<o:p></o:p></span></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">โปรแกรมข้างต้นมีวัตถุประสงค์ในการนับจำนวนตัวเลขที่อยู่หน้าเลข 0 โดยไม่ใช่ตัวชี้ จะสังเกตเห็นว่าการเข้าถึงสมาชิกในแถวลำดับทำได้โดยการอ้างถึงชื่อตัวแปรแถวลำดับที่ระบุสมาชิกที่ต้องการ (</span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">array[index]) <span lang=\"TH\">และการเลื่อนไปหาสมาชิกตัวถัดไปทำได้โดยการเพิ่มค่าของตัวแปร </span>index <span lang=\"TH\">อีก 1</span><o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"color: #000000\"><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">ตัวอย่างที่ 9</span></b><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p></o:p></span></b></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">การประมวลผลแถวลำดับโดยใช้ตัวชี้</span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">#include&lt;stdio.h&gt;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">int array[] = {4, 5, 8 , 9, 8, 1, 0, 1, 9, 3}<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">int *array_ptr;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">void main()<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">{<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">array_ptr = array;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">while (*array_ptr != 0)<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">++array_ptr;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">printf(“Number of elements before zero %d\\n”,array_ptr – array);<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">}<o:p></o:p></span></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">จากโปรแกรมข้างต้นใช้ตัวชี้ชื่อ </span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">array_ptr <span lang=\"TH\">ในการประมวลผลแถวลำดับและเข้าถึงข้อมูลสมาชิกแต่ละตัวในแถวลำดับด้วย *</span>array_ptr <span lang=\"TH\">หลังจากนั้นทำการเลื่อนตัวชี้ด้วยข้อความสั่ง ++</span>array_ptr;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"color: #000000\"><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">ตัวอย่างที่ 10</span></b><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p></o:p></span></b></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">การนำตัวแปรชนิดตัวชี้มาประมวลผลกับข้อมูลชนิดแถวลำดับ</span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">#include&lt;stdio.h&gt;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">#include&lt;stdlib.h&gt;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">void main()<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">{<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">char sentence[10];<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">char *Ptr;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">int count;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">Ptr = sentence;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">for (count = 0; count &lt; 10 ; count++)<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">{<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">*Ptr = getchar();<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">++Ptr;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">}<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">for (count = 0; count &lt; 10 ; count++)<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">{<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">--Ptr;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">putchar(*Ptr);<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">}<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">}<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">โปรแกรมในตัวอย่าง 10 เป็นการนำตัวแปรชนิดตัวชี้ชื่อ </span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">Ptr <span lang=\"TH\">เพื่อรับข้อมูลจากแป้นพิมพ์ทีละอักขระโดยใช้ฟังก์ชัน </span>getchar() <span lang=\"TH\">และนำมาใส่ในแถวลำดับชื่อ </span>sentence[] <span lang=\"TH\">เมื่อรับข้อมูลครบทั้งสิบตัวแล้ว โปรแกรมจะทำการแสดงผลลัพธ์โดยแสดงอักขระออกทางจอภาพทีละตัวโดยใช้ฟังก์ชัน </span>putchar()<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"color: #000000\"><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">ตัวอย่าง 11</span></b><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p></o:p></span></b></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">การส่งผ่านตัวแปรแถวลำดับไปยังฟังก์ชันโดยใช้ตัวชี้</span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">#include&lt;stdio.h&gt;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">long SumArray(int *tbl,int cl);<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">void main()<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">{<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">int Y[5] = {5, 7, 9, 11, 13};<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">long s;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">s = SumArray(Y,5);<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">printf(“sum is %d”,5);<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">}<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">long SumArray (int *tbl, int ct)<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">{<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">int i;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">long summ = 0;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">for(i=0 ; i<span>  </span>&lt; ct ; i++)<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">{<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">summ += *tbl;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">++tbl;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">}<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">return(summ);<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">}<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">6. <span lang=\"TH\"><span> </span>การใช้ตัวชี้กับสายอักขระ</span><o:p></o:p></span></span></b><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">ตัวแปรชนิดตัวชี้สามารถนำมาประมวลผลกับสายอักขระได้โดยสั่งให้ตัวชี้ชี้ไปที่สายอักขระได้เช่นเดียวกับตัวแปรแถวลำดับโดยไม่ต้องมีเครื่องหมาย </span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\">&amp; <span lang=\"TH\">อยู่หน้าตัวชี้ ดังตัวอย่างต่อไปนี้<o:p></o:p></span></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span><span style=\"color: #000000\"><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">ตัวอย่างที่ 12</span></b><b><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p></o:p></span></b></span><span style=\"color: #000000\"><span style=\"font-size: 16pt; font-family: \'Angsana New\'\" lang=\"TH\">โปรแกรมคัดลอกสายอักขระ</span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">#include&lt;stdio.h&gt;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">void strcopy (char *s1,char *s2)<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">{<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">while(*s2 != ‘\\0’)<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">{<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">*s1 = *s2;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">s1++;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">s2++;<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">}<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">}<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">void main()<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">{<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">printf(“This program will copy your string \\n”);<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">scanf(“%s”,str1);<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">strcopy(str1, str2);<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">printf(“The original string is %s\\n”,str1);<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">pritnf(“The new copied string is %s\\n”,str2);<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><span style=\"color: #000000\">}<o:p></o:p></span></span><span style=\"font-size: 16pt; font-family: \'Angsana New\'\"><o:p><span style=\"color: #000000\"> </span></o:p></span> </p>\n', created = 1726784046, expire = 1726870446, headers = '', serialized = 0 WHERE cid = '3:111e22013f453a570773b9889e3a13b0' in /home/tgv/htdocs/includes/cache.inc on line 112.

ตัวชี้ (Pointer)

 ตัวชี้ (Pointer) ตัวชี้ (Pointer) มีลักษณะเด่นของเครื่องมือดำเนินการที่สำคัญที่สุดในภาษาซี ตัวชี้หรือพอยน์เตอร์ มีประโยชน์มากในการจัดการโครงสร้างข้อมูลแบบพลวัต (dynamic data structure) เช่น รายการเชื่อมโยง (Linked List) เป็นต้น ซึ่งรายละเอียดของเนื้อหาในส่วนนี้จะสามารถศึกษาได้ในวิชาโครงสร้างข้อมูล นอกจากนี้ตัวแปรชนิดตัวชี้ยังมีประโยชน์ในแง่ของประสิทธิภาพการทำงาน ช่วยให้โปรแกรมทำงานได้เร็วขึ้นและประหยัดเนื้อที่ในหน่วยจำ ซึ่งเนื้อหาในส่วนนี้จะแสดงในหัวข้อการใช้งานตัวชี้กับฟังก์ชัน 1. การประกาศตัวแปรชนิดตัวชี้ตัวแปรชนิดตัวชี้จะเก็บค่าเลขที่อยู่ของหน่วยความจำ ซึ่งแตกต่างจากตัวแปรชนิดอื่นที่จะเก็บค่าที่แท้จริง เช่นตัวแปรชนิดจำนวนจริง (float) จะเก็บค่าจำนวนจริงที่มีค่าสูงสุดถึง 3.4 x 1038  และเก็บความละเอียดของทศนิยมได้ถึง 7 ตำแหน่ง เป็นต้นรูปแบบในการประกาศตัวแปรชนิดตัวชี้คือ ชนิดข้อมูล *ชื่อตัวแปร; หรือชนิดข้อมูล* ชื่อตัวแปร; เช่น  int *point; เป็นการประกาศตัวแปรชื่อ point ซึ่งมีชนิดเป็นตัวชี้ที่จะทำหน้าที่เก็บตำแหน่งในหน่วยความจำที่มีข้อมูลชนิดเลขจำนวนเต็มอยู่ ซึ่งเครื่องหมายดอกจัน (*) จะเป็นสิ่งที่ทำให้เราทราบว่าตัวแปร point เป็นตัวชี้การกำหนดค่าเริ่มต้นให้กับโปรแกรมชนิดตัวชี้สามารถกำหนดให้มีค่าเป็น NULL หรือ 0 ซึ่งหมายความว่า ตัวแปรนี้ยังไม่มีการเก็บตำแหน่งที่อยู่ใดๆ นอกจากนี้ยังสามารถกำหนดให้ตัวแปรนี้อ้างอิงไปยังตำแหน่งในหน่วยความจำที่ต้องการซึ่งรายละเอียดในส่วนนี้จะกล่าวถึงในหัวข้อต่อไปห้ามมีเว้นวรรคระหว่างเครื่องหมายดอกจันและตัวแปร เช่น int * error เป็นการประกาศที่ผิดการประกาศตัวแปรชนิดตัวชี้หลายตัวในเวลาเดียวกันสามารถทำได้ เช่น int *ptr1, *ptr2; นอกจากนี้ถ้าต้องการหลีกเลี่ยงการใช้เครื่องหมายดอกจันทุกครั้งที่ประกาศตัวแปรชนิดตัวชี้สามารถทำได้ด้วยการใช้คำหลัก typedef เช่น typedef int* Ptype;Ptype ptr1, ptr2;  2.  ตัวดำเนินการสำหรับตัวชี้ตัวดำเนินการสำหรับตัวชี้มีอยู่ด้วยกัน 2 ตัว คือ ตัวดำเนินการเลขที่อยู่ และตัวดำเนินการอ้างอิง2.1 ตัวดำเนินการเลขที่อยู่ (address operator)ตัวดำเนินการนี้จะใช้เครื่องหมาย & นำหน้าตัวแปร ซึ่งจะหมายความถึงตำแหน่งที่อยู่ของตัวแปรนั้นในหน่วยความจำ ตัวอย่าง 1การอ้างอิงตัวชี้#include<stdio.h>void main(){int z = 10;int *ZPtr;ZPtr = &z;} ข้อความสั่ง ZPtr = &z; มีวัตถุประสงค์เพื่อให้ตัวแปรชนิดตัวชี้ ZPtr เก็บเลขที่อยู่ของตัวแปร z ซึ่งอาจแสดงในรูปแบบตัวชี้ดังรูป 1       

รูปที่ 1 ตัวแปรชนิดตัวชี้ในหน่วยความจำ 2.2 ตัวดำเนินการอ้างอิง (dereferencing operator)ตัวดำเนินการนี้จะใช้เครื่องหมายดอกจัน (*) นำหน้าตัวแปรชนิดตัวชี้ ซึ่งจะเป็นอ้างถึงค่าข้อมูลที่ตัวแปรชนิดตัวชี้นั้นชี้ไป ซึ่งค่าของข้อมูลที่ตัวชี้อ้างอิงนี้สามารถถูกเปลี่ยนแปลงค่าได้ เช่น การเพิ่มค่าอีก 1 สามารถทำได้โดยใช้คำสั่ง (*ptr)++ จะเป็นการเพิ่มค่าที่ตัวชี้ ptr ชี้ไป การแสดงค่าที่ตัวชี้ชี้ไปก็สามารถทำได้โดยใช้คำสั่ง printf(“%d”,ZPtr); จะส่งผลให้โปรแกรมแสดงค่า 10 ออกทางจอภาพตามรูปที่ 1ตัวอย่างที่ 2การใช้งานตัวชี้#include<stdio.h>void main(){int x;int y = 20;int *z;z = &y;x = *z;printf(%d,x);} จากส่วนโปรแกรมข้างต้นเมื่อสั่งให้โปรแกรมทำงานจะมีการแสดงค่าตัวแปรของ x ซึ่งมีค่าเป็น 20 ซึ่งเท่ากับค่าที่เก็บอยู่ในตัวแปร y ลำดับเหตุการณ์ที่เกิดขึ้นแสดงดังรูปที่ 2             

รูปที่ 2 ลำดับเหตุการณ์ที่เกิดขึ้นในหน่วยความจำ นอกจากนี้สามารถสั่งให้ตัวแปรชนิดตัวชี้ชี้ไปที่เดียวกันกับตัวแปรตัวชี้ตัวอื่น เช่น ถ้าตัวแปร next มีชนิดเป็นตัวชี้ เราสามารถสั่งให้ชี้ไปที่เดียวกันกับ ที่ตัวแปร z ชี้ไปโดยใช้ข้อความสั่ง next = z;การใช้ตัวดำเนินการแบบอ้างอิงกับตัวแปรชนิดตัวชี้ที่ยังไม่ได้มีการกำหนดค่าจะทำให้เกิดข้อผิดพลาดขึ้นได้เพื่อให้เห็นภาพรวมของการใช้ตัวแปรชนิดตัวชี้กับตัวดำเนินการทั้งสองรูปแบบจึงได้แสดงตัวอย่างโปรแกรมดังนี้ ตัวอย่างที่ 3การแสดงค่าที่เก็บในตัวชี้#include<stdio.h>void main(){int y;int *yPtr;y = 10;yPtr = &y;printf(“The address of y is %p\n”, &y);printf(“The value of yPtr is %p\n”, yPtr);printf(“The value of y is %d\n”, y);printf(“The value of *yPtr is %d\n”, *yPtr);} ค่าที่แสดงตำแหน่งในหน่วยความจำบนจอภาพสำหรับฟังก์ชัน printf(“The address of y is %p\n”,&y); และ printf(“The value of yPtr is %p\n”,yPtr); จะแตกต่างกันไปในแต่ละครั้งของการกระทำการโปรแกรมโดยขึ้นอยู่กับเลขที่อยู่ของหน่วยความจำที่ระบบปฏิบัติการจัดสรรให้ 3.  การใช้ตัวแปรชนิดตัวชี้กับค่าคงที่ตัวแปรชนิดตัวชี้สามารถถูกระบุคุณสมบัติเพิ่มเติมได้โดยการนำคำหลัก const ซึ่งหมายถึงค่าคงที่มาประกอบซึ่งจะมีความหมายแตกต่างกันไปดังนี้1. const int *Ptr; หรือ int const *Ptr หมายถึงการกำหนดให้ตัวชี้ Ptr ชี้ไปที่ข้อมูลตัวเลขจำนวนเต็มที่มีค่าคงที่ ไม่สามารถเปลี่ยนแปลงค่าได้ แต่ตัวชี้ Ptr สามารถเปลี่ยนไปชี้ที่อื่นได้2. int *const Ptr; หมายถึงการบังคับให้ตัวชี้ Ptr ชี้ไปที่ใดที่หนึ่งและห้ามเปลี่ยนตำแหน่งการชี้ แต่ค่าของข้อมูลที่เก็บอยู่ในตำแหน่งนั้นสามารถเปลี่ยนแปลงได้3. const int *const Ptr; หมายถึงการการบังคับให้ตัวชี้ Ptr ชี้ไปที่ใดที่หนึ่งและห้ามเปลี่ยนตำแหน่งการชี้และค่าของข้อมูลที่เก็บอยู่ในตำแหน่งนั้นไม่สามารถเปลี่ยนแปลงได้ 4.  การเรียกใช้ฟังก์ชันที่มีการส่งตัวแปรแบบอ้างอิงการเขียนโปรแกรมที่ดีควรจะมีการแบ่งส่วนชุดคำสั่งการทำงานเป็นกลุ่ม หรือเรียกอีกอย่างหนึ่งว่าฟังก์ชัน โดยส่วนของโปรแกรมหลักจะสามารถสั่งให้ฟังก์ชันทำงานได้โดยการเรียกชื่อฟังก์ชันและส่งตัวแปรที่บรรจุข้อมูลไปยังฟังก์ชันเพื่อให้ฟังก์ชันทำการประมวลผลข้อมูลที่ส่งไป รูปแบบการส่งตัวแปรไปยังฟังก์ชันมี 2 รูปแบบด้วยกันคือ การส่งตัวแปรเฉพาะค่า หรือการเรียกด้วยมูลค่า (call by value) และการส่งตัวแปรแบบอ้างอิงหรือการเรียกด้วยการอ้างอิง (call by reference) ซึ่งวิธีการเรียกโดยมูลค่านี้ได้อธิบายไว้ในเนื้อหาบทที่ 4 ในที่นี้จะขออธิบายถึงการส่งตัวแปรแบบอ้างอิงซึ่งต้องอาศัยตัวแปรชนิดตัวชี้ในการดำเนินการ วัตถุประสงค์ของการส่งตัวแปรอ้างอิงคือการยินยอมให้ฟังก์ชันสามารถทำการเปลี่ยนแปลงค่าของตัวแปรนี้อย่างถาวร หมายความว่าเมื่อฟังก์ชันได้ทำงานเสร็จแล้วค่าของตัวแปรนี้จะมีค่าไม่เหมือนเดิมเมื่อเทียบกับค่าของตัวแปรก่อนเรียกฟังก์ชัน ซึ่งจะได้แสดงให้ดูในตัวอย่างวิธีการส่งตัวแปรแบบอ้างอิงไปยังฟังก์ชันใช้รูปแบบดังนี้ ชนิดข้อมูล ชื่อฟังก์ชัน(&ตัวแปรชนิดตัวชี้) การเขียนส่วนหัวของฟังก์ชันใช้รูปแบบดังนี้ ชนิดข้อมูล ชื่อฟังก์ชัน(ชนิดข้อมูล *ตัวแปรชนิดตัวชี้) ตัวอย่างที่ 4การเรียกฟังก์ชันโดยใช้ตัวชี้#include<stdio.h>void power2(int *);void main(){int num = 3;printf(“The value of num before calling function is %d \n”,num);power3(&num);printf(“The value of num after calling function is %d \n”,num);}void power3(int *Ptr){*Ptr = *Ptr * *Ptr * *Ptr;}จากโปรแกรมในข้างต้นจะเห็นได้ว่าส่วนของโปรแกรมหลักได้ทำการเรียกฟังก์ชัน power3() โดยส่งเลขที่อยู่ของตัวแปร num ไปให้ฟังก์ชันกระทำการ สังเกตที่ส่วนหัวของฟังก์ชัน จะเห็นว่าตัวแปรที่รับค่ามีชนิดเป็นตัวชี้ที่อ้างอิงไปยังข้อมูลชนิดจำนวนเต็ม รูปที่ 3 จะแสดงถึงลำดับเหตุการณ์ที่เกิดขึ้นในหน่วยความจำ                        

รูปที่ 3 ลำดับเหตุการณ์การเรียกฟังก์ชันโดยการส่งตัวแปรแบบอ้างอิงในหน่วยความจำ จากรูปที่ 3 จะสังเกตได้ว่าขณะที่โปรแกรมหลักเรียกฟังก์ชัน power3() โดยส่งเลขที่อยู่ของตัวแปร num ไปให้กับตัวแปรชนิดตัวชี้ชื่อ Ptr ที่ส่วนหัวของฟังก์ชัน จะเกิดการอ้างอิงขึ้นในหน่วยความจำ (สังเกตที่ลูกศร) หลังจากนั้นเมื่อชุดข้อความสั่งในฟังก์ชันกระทำการกับตัวแปรชนิดตัวชี้ Ptr ก็เปรียบเสมือนกับการกระทำการที่ตัวแปร num นั่นเองดังนั้นเมื่อฟังก์ชัน power3() ทำงานเสร็จสิ้นลง และทำงานเสร็จสิ้นลง และทำการแสดงค่าตัวแปร num ออกทางจอภาพ จะได้ค่าใหม่ที่เกิดจากการนำตัวเลขที่เคยเก็บในตัวแปร num ยกกำลังสามตัวอย่างที่ 5การสลับค่าของข้อมูล#include<stdio.h>void flip(int *, int *);void main(){int num1;int num2;printf(“This program will swap to integer\n”);printf(“Please enter number1 and number2 : “);scanf(“%d%d”,&num1,&num2);flip(&num1,&num2);printf(“After swapping num1 is %d num2 is %d\n”, num1, num2);}void flip(int *x, int *y){int temp;temp = *x;*x = *y;*y = temp;} โปรแกรมข้างต้นมีวัตถุประสงค์ในการสลับค่าของตัวแปรที่ผู้ใช้ป้อนเข้ามาโดยการเรียกใช้ฟังก์ชัน flip() ซึ่งรับพารามิเตอร์เป็นตัวแปรชนิดตัวชี้ที่ชี้ไปที่ตัวแปร num1 และ num2 หลังจากนั้นฟังก์ชัน flip() จะทำการสลับค่าในตัวแปรดังกล่าวโดยใช้ตัวชี้ x และ ตัวชี้ y เพื่อให้เข้าใจง่ายขึ้นจึงแสดงรายละเอียดในรูปที่ 4                         

รูป 4  ลำดับการทำงานเมื่อมีการเรียกฟังก์ชันโดยใช้ตัวชี้       ตัวอย่างที่ 6การเพิ่มค่าที่ตัวชี้อ้างอิงโดยการเรียกฟังก์ชัน#include<stdio.h>void increment (int *count_ptr){(*count_ptr)++;}void main(){int count = 0;while(count < 10)increment(&count);} โปรแกรมข้างต้นมีวัตถุประสงค์ในการเพิ่มค่าของตัวแปร count โดยการส่งเลขที่อยู่ของตัวแปร count ไปให้แก่ตัวชี้ count_ptr ที่ฟังก์ชัน increment() ฟังก์ชันดังกล่าวจะทำการเพิ่มค่าของ count ทีละหนึ่ง ฟังก์ชัน main() จะทำการเรียกใช้ฟังก์ชัน increment() จำนวน 10 ครั้ง เมื่อโปรแกรมทำงานเสร็จสิ้นลง ตัวแปร count จะมีค่าเป็น 10 ครั้ง เมื่อโปรแกรมทำงานเสร็จสิ้นลง    ตัวแปร count จะมีค่าเป็น 10จากหลักการส่งตัวแปรไปยังฟังก์ชันจะเห็นว่า การอ้างอิงเลขที่อยู่ของตัวแปรที่เก็บข้อมูลในลักษณะนี้จะทำให้โปรแกรมทำงานได้อย่างมีประสิทธิภาพทั้งในแง่ความเร็วในการประมวลผลและเป็นการประหยัดเนื้อที่ในหน่วยความจำเป็นอย่างมากเมื่อเทียบกับวิธีการส่งตัวแปรแบบเรียกด้วยมูลค่า เนื่องจากการส่งตัวแปรแบบเรียกด้วยมูลค่าจะเกิดกลไกในการคัดลอกข้อมูลจากตัวแปรของผู้เรียกฟังก์ชัน ไปยังตัวแปรที่ส่วนหัวของฟังก์ชัน ซึ่งกลไกนี้จะกินเวลานานถ้าข้อมูลมีขนาดใหญ่ เช่น ข้อมูลชนิดโครงสร้างที่สร้างจากคำหลัก struct ผลที่เกิดตามมาคือจะเกิดการจองเนื้อที่เพื่อเก็บข้อมูลที่เหมือนกันอีกชุดสำหรับฟังก์ชันซึ่งเป็นการสิ้นเปลืองเนื้อที่ อย่างไรก็ตามการส่งตัวแปรแบบเรียกด้วยมูลค่ายังคงมีความสำคัญเนื่องจากบางครั้งอาจไม่ต้องการให้ฟังก์ชันเปลี่ยนแปลงค่าในตัวแปรนั้น  5.  การใช้ตัวชี้กับตัวแปรชนิดแถวลำดับตัวแปรชนิดตัวชี้สามารถช่วยอำนวยความสะดวกในการเข้าถึงข้อมูลที่เก็บอยู่ในแถวลำดับ (array) /ได้ โดยในขั้นตอนแรกจะต้องกำหนดให้ตัวแปรชนิดตัวชี้ชี้ไปยังสมาชิกตัวแรกของตัวแปรแถวลำดับเสียก่อน ซึ่งมี 2 รูปแบบดังนี้รูปแบบที่ 1 ตัวแปรชนิดตัวชี้ = ตัวแปรแถวลำดับ; รูปแบบที่ 2 ตัวแปรชนิดตัวชี้ =  ตัวแปรแถวลำดับ[0]; ตัวอย่างที่ 7 การใช้ตัวชี้ในการอ้างถึงแถวลำดับint a[10];int *aPtr;aPtr = a;                 

รูปที่ 5 ลำดับเหตุการณ์ใช้ตัวแปรชนิดตัวชี้ในการอ้างอิงตัวแปรชนิดแถวลำดับ หลังจากข้อความสั่ง aPtr = a; สามารถใช้ตัวแปรชนิดตัวชี้ในการเข้าถึงข้อมูลในแต่ละสมาชิกของแถวลำดับได้ดังนี้1. การเพิ่มค่าตัวชี้หนึ่งลำดับ (increment pointer)คือ การสั่งให้ตัวชี้เลื่อนไปยังสมาชิกตัวถัดไปหนึ่งลำดับ โดยใช้เครื่องหมายบวกบวก เช่น aPtr++; หรือ aPtr = aPtr +1;2. การลดค่าตัวชี้หนึ่งลำดับ (decrement pointer)คือ การสั่งให้ตัวชี้เลื่อนไปยังสมาชิกตัวก่อนหน้าหนึ่งลำดับ โดยใช้เครื่องหมายลบลบ เช่น aPtr--; หรือ aPtr = aPtr - 1;3. การเพิ่มหรือลดค่าตัวชี้มากกว่าหรือน้อยกว่าหนึ่งลำดับ (add/substract pointer)คือ การสั่งให้ตัวชี้ชี้ข้ามไปยังสมาชิกตัวถัดไปหรือตัวก่อนหน้าตามตัวเลขที่ระบุ เช่น aPtr = aPtr + 2 ; หมายถึงการสั่งให้ตัวชี้ aPtr ชี้ไปยังสมาชิกที่อยู่ถัดไป 2 ลำดับ เช่น ถ้าเดิมตัวชี้ aPtr ชี้อยู่ที่ a[0] เมื่อใช้ข้อความสั่ง aPtr = aPtr + 2 ; จะทำให้ตัวชี้นี้ชี้ไปยังแถวลำดับ a[2]4. การนำตัวแปรชนิดตัวชี้มาลบกันคือการนำตัวแปรชนิดตัวชี้สองตัวมาลบกันซึ่งผลลัพธ์ที่ได้คือ ระยะห่างระหว่างสมาชิกในตัวแปรแถวลำดับ+1 หรือจำนวนสมาชิกที่อยู่ระหว่างตัวชี้ทั้งสองบวกด้วย 1 นั่นเอง เช่น ถ้าตัวชี้ aPtr ชี้อยู่ที่ a[2] และตัวแปรชนิดตัวชี้ bPtr ชี้อยู่ที่ a[5]ข้อความสั่ง x = bPtr-aPtr; จะได้ผลลัพธ์เป็น 35.  การเปรียบเทียบตัวแปรชนิดตัวชี้คือการตรวจสอบว่า ตัวชี้ใดที่ไปที่สมาชิกลำดับที่มากกว่า น้อยกว่า หรือชี้ไปที่สมาชิกตัวเดียวกัน โดยการเปรียบเทียบนี้จะคืนค่าจริงหรือเท็จ ดังนั้นจึงมักนำไปใช้ร่วมกับข้อความสั่ง if หรือข้อความสั่ง while ตัวอย่างเช่นif(aPtr = = bPtr)printf(“finish”);เป็นการตรวจสอบว่า ตัวแปรชนิดตัวชี้ aPtr ชี้ไปที่สมาชิกตัวเดียวกันกับตัวชี้ bPtr หรือไม่คำสั่ง      if(aPtr > bPtr)printf(“aPtr is behind bPtr”); ตัวอย่างที่ 8การประมวลผลแถวลำดับโดยไม่ใช้ตัวชี้#include<stdio.h>int array[] = {4, 5, 8, 9, 8, 1, 0, 1, 9, 3};int index;void main(){index = 0;while (array[index] != 0)++index;printf(“Number of elements before zero %d\n”,index);}โปรแกรมข้างต้นมีวัตถุประสงค์ในการนับจำนวนตัวเลขที่อยู่หน้าเลข 0 โดยไม่ใช่ตัวชี้ จะสังเกตเห็นว่าการเข้าถึงสมาชิกในแถวลำดับทำได้โดยการอ้างถึงชื่อตัวแปรแถวลำดับที่ระบุสมาชิกที่ต้องการ (array[index]) และการเลื่อนไปหาสมาชิกตัวถัดไปทำได้โดยการเพิ่มค่าของตัวแปร index อีก 1 ตัวอย่างที่ 9การประมวลผลแถวลำดับโดยใช้ตัวชี้#include<stdio.h>int array[] = {4, 5, 8 , 9, 8, 1, 0, 1, 9, 3}int *array_ptr;void main(){array_ptr = array;while (*array_ptr != 0)++array_ptr;printf(“Number of elements before zero %d\n”,array_ptr – array);}จากโปรแกรมข้างต้นใช้ตัวชี้ชื่อ array_ptr ในการประมวลผลแถวลำดับและเข้าถึงข้อมูลสมาชิกแต่ละตัวในแถวลำดับด้วย *array_ptr หลังจากนั้นทำการเลื่อนตัวชี้ด้วยข้อความสั่ง ++array_ptr; ตัวอย่างที่ 10การนำตัวแปรชนิดตัวชี้มาประมวลผลกับข้อมูลชนิดแถวลำดับ#include<stdio.h>#include<stdlib.h>void main(){char sentence[10];char *Ptr;int count;Ptr = sentence;for (count = 0; count < 10 ; count++){*Ptr = getchar();++Ptr;}for (count = 0; count < 10 ; count++){--Ptr;putchar(*Ptr);}} โปรแกรมในตัวอย่าง 10 เป็นการนำตัวแปรชนิดตัวชี้ชื่อ Ptr เพื่อรับข้อมูลจากแป้นพิมพ์ทีละอักขระโดยใช้ฟังก์ชัน getchar() และนำมาใส่ในแถวลำดับชื่อ sentence[] เมื่อรับข้อมูลครบทั้งสิบตัวแล้ว โปรแกรมจะทำการแสดงผลลัพธ์โดยแสดงอักขระออกทางจอภาพทีละตัวโดยใช้ฟังก์ชัน putchar() ตัวอย่าง 11การส่งผ่านตัวแปรแถวลำดับไปยังฟังก์ชันโดยใช้ตัวชี้#include<stdio.h>long SumArray(int *tbl,int cl);void main(){int Y[5] = {5, 7, 9, 11, 13};long s;s = SumArray(Y,5);printf(“sum is %d”,5);}long SumArray (int *tbl, int ct){int i;long summ = 0;for(i=0 ; i  < ct ; i++){summ += *tbl;++tbl;}return(summ);} 6.  การใช้ตัวชี้กับสายอักขระตัวแปรชนิดตัวชี้สามารถนำมาประมวลผลกับสายอักขระได้โดยสั่งให้ตัวชี้ชี้ไปที่สายอักขระได้เช่นเดียวกับตัวแปรแถวลำดับโดยไม่ต้องมีเครื่องหมาย & อยู่หน้าตัวชี้ ดังตัวอย่างต่อไปนี้ ตัวอย่างที่ 12โปรแกรมคัดลอกสายอักขระ#include<stdio.h>void strcopy (char *s1,char *s2){while(*s2 != ‘\0’){*s1 = *s2;s1++;s2++;}}void main(){printf(“This program will copy your string \n”);scanf(“%s”,str1);strcopy(str1, str2);printf(“The original string is %s\n”,str1);pritnf(“The new copied string is %s\n”,str2);} 

สร้างโดย: 
ไพบูลย์ ปัทมวิภาต

มหาวิทยาลัยศรีปทุม ผู้ใหญ่ใจดี
 

 ช่วยด้วยครับ
นักเรียนที่สร้างบล็อก กรุณาอย่า
คัดลอกข้อมูลจากเว็บอื่นทั้งหมด
ควรนำมาจากหลายๆ เว็บ แล้ววิเคราะห์ สังเคราะห์ และเขียนขึ้นใหม่
หากคัดลอกทั้งหมด จะถูกดำเนินคดี
ตามกฎหมายจากเจ้าของลิขสิทธิ์
มีโทษทั้งจำคุกและปรับในอัตราสูง

ช่วยกันนะครับ 
ไทยกู๊ดวิวจะได้อยู่นานๆ 
ไม่ถูกปิดเสียก่อน

ขอขอบคุณในความร่วมมือครับ

อ่านรายละเอียด

ด่วน...... ขณะนี้
พระราชบัญญัติลิขสิทธิ์ (ฉบับที่ 2) พ.ศ. 2558 
มีผลบังคับใช้แล้ว 
ขอให้นักเรียนและคุณครูที่ใช้งาน
เว็บ thaigoodview ในการส่งการบ้าน
ระมัดระวังการละเมิดลิขสิทธิ์ด้วย
อ่านรายละเอียดที่นี่ครับ

 

สมาชิกที่ออนไลน์

ขณะนี้มี สมาชิก 0 คน และ ผู้เยี่ยมชม 422 คน กำลังออนไลน์