Tuesday, November 24, 2009

มาทบทวน Pointer ในภาษา C กันเถอะ




วันนี้ผมเรียนวิชา Advance Data Structures and Algorithms มาครับ เรียนเรื่องโครงสร้างข้อมูลใน Java มีอีกหลายอย่างที่ยังไม่รู้ จริงๆก่อนหน้านี้เขียน Java บ่อยๆใช้ก็แต่ ArrayList รู้แค่ว่าใน Java มี Linked List, Graph, Tree ฯลฯ เตรียมไว้ให้ แต่พอได้เรียนจริงๆ ปรากฎว่ามีโครงสร้างข้อมูลอีกหลายชนิดเลยครับที่ Java มีให้ และผมเองก็ไม่เคยได้ยินชื่อมันมาก่อน เดี๋ยวไว้ว่างๆ จะเขียนบทความเกี่ยวกับโครงสร้างข้อมูลแปลกๆ ที่เรียนมานะครับ

จากคาบเรียนวันนี้ ทำให้รู้ว่าจริงๆแล้ว Java ยังมีโครงสร้างโครงมูลให้ใช้อีกเยอะแยะ ผมเลยนึกถึงปรัชญาเรื่องแก้วชาที่มีน้ำชาอยู่เต็มใบ ซึ่งแก้วนั้นไม่สามารถจะใส่น้ำเพิ่มได้อีก ใส่ไปก็ล้น คนเราก็เหมือนกันควรจะเป็นเหมือนแก้วที่ว่างพร้อมจะรับสิ่งใหม่ๆ อยู่เสมอ ว่ามั้ยครับ

พล่ามกันมาเยอะแล้ว เข้าเรื่องกันดีกว่า สำหรับ Pointer ในภาษาซีนั้นเชื่อว่าหลายๆ คนคงเคยใช้หรือเคยเรียนกันมาบ้าง เท่าที่ผมเคยเห็นมา พบว่าเรื่อง Pointer ถือเป็นเรื่องยากเรื่องหนึ่งในการทำความเข้าใจของหลายๆ คน ก่อนอื่นก็ต้องขอบอกก่อนว่า Pointer ก็คือตัวแปรชนิดหนึ่ง แต่แตกต่างจากตัวแปรทั่วๆไปตรงที่ Pointer ใช้ในการทำหน้าที่ชี้ (Reference) ไปยังตัวแปรอื่นๆ ซึ่ง Pointer นั้นสามารถนำไปประยุกต์ใช้งานได้หลายอย่าง แต่ที่เห็นชัดเจนและใช้กันบ่อยๆ ก็คงจะเป็นการนำ Pointer ไปสร้างเป็นโครงสร้างข้อมูลยอดนิยมอย่าง Linked List, Tree และ Graphชนิดต่างๆ แต่ผมไม่ขอพูดถึงวิธีการนำ Pointer ไปใช้ในโครงสร้างข้อมูลเหล่านั้นนะครับ ขอพูดแค่พื้นฐาน

ลองดูรูปโครงสร้างของตัวแปรแบบทั่วไป กับโครงสร้างตัวแปรแบบ Pointer กันนะครับ (รูปโครงสร้างตัวแปรในบทความนี้ ใช้เพื่อประกอบคำอธิบายเพื่อให้เข้าใจง่ายขึ้นเท่านั้นนะครับ จริงๆ แล้วโครงสร้างจริงๆ ในหน่วยความจำจะเก็บอยู่ในรูปแบบเลขฐานสอง)

สมมติผมประกาศตัวแปรว่า

int foo = 21;
int *bar;




จากคำสั่งประกาศตัวแปร foo เป็นชนิด int พร้อมกับใส่ค่าเป็น 21 แล้วประกาศตัวแปร bar เป็นแบบ Pointer ของ int ก็จะได้ตามรูปข้างบน ซึ่งตัวแปร foo จะถูกจองอยู่ในหน่วยความจำของคอมพิวเตอร์ ซึ่งจากรูปนี้ foo จะอยู่ที่ตำแหน่ง 240ff58 ของหน่วยความจำ แล้ว foo ก็เก็บค่า 21 ไว้ (ในหน่วยความจำจริงๆ จะเก็บเป็นเลขฐานสอง ไม่ได้เก็บเลข 21 ไว้นะครับ) และในทำนองเดียวกันตัวแปร bar ก็ถูกเก็บอยู่ในหน่วยความจำ ซึ่งตามรูปคือที่ตำแหน่ง 240ff5c และเรายังไม่ได้กำหนดค่าให้ bar นอกจากนั้นจะเห็นว่าตัวแปรแบบ bar นั้นจะมีfieldข้อมูลมากกว่าตัวแปรแบบธรรมดาอยู่ 1 field เรามาดูคำสั่งต่อไปกันต่อนะครับ
ผมพิมพ์โค้ดว่า

bar = &foo;



จากรูป ผลลัพธ์ที่ได้เมื่อเราสั่งให้ bar ชี้ (Reference) ไปยัง foo จะทำให้ส่วนของ value ของ bar เก็บ address ของ foo ไว้ ถ้าเราลองพิมพ์ค่าของตัวแปรทั้งสองตัวออกมาด้วยคำสั่ง printf

printf("Address of foo is %x , Values Store in foo is %d\n",&foo, foo);
printf("Address of *bar is %x, Values Store in *bar is %x, Values Point by *bar is %d", &bar, bar, *bar);


ผลลัพธ์ที่ได้ก็คือ

Address of foo is 240ff58 , Values Store in foo is 21
Address of *bar is 240ff5c , Values Store in *bar is 240ff58 , Values Point by *bar is 21



จะเห็นว่าเมื่อเราสั่งให้ Pointer ชี้ไปยังตัวแปรที่ต้องการ ค่าที่เก็บอยู่ในตัวแปร Pointer ก็คือ Address ของตัวแปรที่มันชี้อยู่ันั่นเอง ส่วนใน field * ของ Pointer นั้น เมื่อเราอ้างถึง fieldนี้ ก็จะหมายถึงการอ้างถึงค่าซื่งเก็บอยู่ในตัวแปรที่ Pointer ชี้อยู่ (ในที่นี้คือค่า 21 ที่เก็บอยู่ในตัวแปร foo) ดังนั้นถ้าเราพิมพ์ค่า bar ออกมา ก็จะได้ผลลัพธ์เป็นค่าในตัวแปร foo

และถ้าหากเราแก้ไขค่าโดยการอ้าง fild * ของ Pointer จะส่งผลให้ค่าในตัวแปรที่ Pointer ชี้อยู่ เปลี่ยนแปลงไปด้วย เช่น

*bar = 3;
printf("*bar = %d foo = %d", *bar, foo);


ผลลัพธ์ที่ได้ก็คือ

*bar = 3
foo = 3


คงได้ทบทวนกันไปพอเป็นน้ำจิ้มนะครับ สำหรับเรื่อง Pointer ในภาษาซี การใช้งานจริงของ Pointer นั้นถ้าเราเข้าใจพื้นฐานแล้ว รับรองว่าไม่ยากครับ มีข้อแนะนำนิดนึงสำหรับเวลาเขียนโปรแกรมที่ต้องใช้โครงสร้างข้อมูล หรือเวลาเขียนโปรแกรมอะไรก็ตาม อยากให้วาดรูปโครงสร้างที่ใช้ในโปรแกรมขึ้นมาก่อน พยายามออกแบบก่อน จะทำให้เวลา coding จริงๆ จะง่ายขึ้น debug ก็ง่ายขึ้นด้วย

ไปก่อนนะครับ ^ ^



แอนดรอยจะช่วยกูเกิ้ลครองโลกโดยที่ท่านไม่รู้ตัว!

เ็ป็นบทความที่พี่มิ้วค์ (@kanatorn) บรรยายไว้ในงาน Droidsans Meeting ครั้งที่ 1 แล้วพี่มิ้วค์ก็ได้เขียนไว้ใน Droidsans ด้วย เป็นบทความที่น่าสนใจทีเดียว ลองอ่านกันดูนะครับ




ชื่อบล๊อกนี้ผมได้แต่ใดมา....
จริงๆแล้วผมไม่ได้คิดเอง แต่เอามาจากทวีตของ @nuuneoi เห็นมีคนรีทวีตกันพอสมควร แสดงว่าน่าจะมีคนแอบคิดแบบนี้อยู่หลายคนเหมือนกัน ตึ่ง! (ตอนหลัง พี่ @nuuneoi มาบอกว่าเอาประโยคนี้มาจากผม ตอน Meeting DroidSans ตึ่งๆๆๆ!!! จำไม่ได้แหะๆ)
วันนี้จะมาเขียนเรื่องในจินตนาการล้วนๆ อย่ามาว่าผมเพ้อเจ้อนะ ออกตัวไว้แต่แรกแล้วนะจ๊ะ จริงๆก็คงจะคล้ายๆกับตอนพรีเซนต์เรื่อง อนาคตของแอนดรอย ในงาน DroidSans Meeting

เริ่มด้วย กูเกิ้ลทำธุรกิจที่หากำไรจากอะไร?
ติ๊กต็อก ติ๊กต็อก......
คำตอบคือ "โฆษณา" นั่นเอง
ก็แค่ "โฆษณา" !!! (ตกใจทำไม)

การทำธุรกิจโฆษณา สิ่งที่สำคัญที่สุดก็คือการรู้ใจลูกค้าว่าลูกค้าต้องการอะไร ณ ช่วงเวลานั้นๆ แล้วก็ป้อนข้อมูลโฆษณาที่ตรงกับความต้องการให้ลูกค้าได้รับรู้ในช่วงเวลา นั้น รับประกันว่าได้ผล!! ต่อให้ไม่มีเงินก็อาจจะยืมเงินเพื่อนเพื่อซื้อสินค้าได้ (อิอิ เคยเป็น)

ตอนนี้กูเกิ้ลเริ่มจะรู้ถึงพฤติกรรมการใช้ชีวิตประจำวันของเรามากขึ้นจากบริการฟรีที่พวกเราใช้กันอยู่

  • GMail กูเกิ้ลทำ Index ข้อความสนทนาเราไว้หมด และปล่อยโฆษณาที่ค่อนข้างเกี่ยวข้องกับเนื้อหาในเมลล์
  • Web History ถ้าใครล็อกอิน Google Account แน่นอนว่ากูเกิ้ลจะเก็บประวัติไว้หมดว่าในแต่ละวันเราเข้าเว็บอะไรกันบ้าง ข้อมูลตรงนี้เป็นประโยชน์มหาศาลในการโฆษณา เพราะเราสนใจอะไรก็มักจะเข้าเว็บที่มีเนื้อหาเกี่ยวกับเรื่องนั้นๆอยู่แล้ว

สองข้อนี้เป็นข้อมูลพื้นฐานที่น่าจะเพียงพอต่อการโฆษณาแล้วใช่มั้ย?
แต่ยังมีอีก!!!
  • Picasa Album ทำให้รู้ตำแหน่งของสถานที่ที่คนไปถ่ายรูปและเที่ยวกันมากๆ
  • Picasa Face Detection ทำให้ทราบถึงความมีปฏิสัมพันธ์กันระหว่างบุคคล ว่าอย่างน้อยก็เคยทำกิจกรรมร่วมกันในรูปที่ถ่าย และก็ทราบตำแหน่งด้วยว่าไปที่ไหนกันมา เช่น รูปถ่ายในงาน DroidSans Meeting ทำให้กูเกิ้ลรู้ว่าอย่างน้อยคนที่มีหน้าอยู่ในรูปทั้งหมด 45 คนเคยมาพบปะสังสรรค์กันที่ Au Bon Pain สาขาสยาม เวลา 13.00-16.00 น.
  • Google Contact ทำให้รู้ว่าใครรู้จักกันบ้าง มีที่อยู่อยู่ที่ไหน มีเว็บไซต์ของตัวเองชื่ออะไร อีเมลล์อะไร เบอร์โทรอะไร IM อะไรบ้าง ฯลฯ
  • Google Docs ทำให้เห็นเนื้อหาข้อความที่เราใส่เข้าไป และยังรู้ด้วยว่าเนื้อหานี้มีใครใช้ร่วมกันอยู่บ้าง
  • Google Calendar ทำให้รู้ว่าใครจะทำอะไร ที่ไหน เมื่อไหร่ คนเดียว หรือเป็นกลุ่ม กับใครบ้าง (รู้ล่วงหน้าด้วยซ้ำไป)
  • Google Maps มีฟีเจอร์ให้เราบันทึกหรือบุ๊คมาร์คสถานที่ที่เราต้องการได้ แค่นี้ก็รู้แล้วว่าที่ไหนคนนิยมไปกัน
  • Google Health มีการป้อนข้อมูลยาในการไปหาหมอครั้งหนึ่งๆ มีข้อมูลแพ้ยา จะเป็นอย่างไรถ้าคนใช้บริการเยอะๆ แล้วก็เอาข้อมูลการใช้ยาเหล่านี้ไปขายบริษัทขายยา (รวยเห็นๆ) หรือจะเอามาโฆษณายาก็ยังได้
  • Google Wave กูเกิ้ลกำลังสร้างมาตรฐานการสื่อสารใหม่ ที่ทำให้ทุกคนรู้สึกว่าถ้าจะคุยปรึกษางานกัน ประชุมงานกัน ต้องมาคุยกันใน Wave เพราะข้อมูลจะไม่สูญหาย เรียกดูเมื่อไหร่ก็ได้ สามารถ playback ได้เหมือนมีเลขามาบันทึกการประชุมไว้ตลอดเวลา การสื่อสารก็ sync ข้อมูลกันเรียกว่าแทบจะเรียลไทม์ ถ้าคนจำนวนมากติดใจ Wave อย่างที่ว่าจริงๆ แสดงว่ากูเกิ้ลแทบจะรู้ทันทีทันใดเลยว่า Talk of the town ตอนนี้คือเรื่องอะไร(คล้ายๆกับทวิตเตอร์ แต่ลึกซึ้งกว่า) คนกลุ่มไหนบ้างที่กำลังสนใจเรื่องนั้นๆ แล้วโฆษณาแบบโดนใจไก่คั่วจะไปไหนเสีย!!!
  • อื่นๆ อีกเป็นกะตั๊ก ลองไปดูใน Google Labs สิครับ

ถ้ามาลองวิเคราะห์ดูจริงๆแล้วข้อมูลที่ได้มาจากบริการเหล่านี้มีเพียงไม่กี่รูปแบบ

  1. ตำแหน่ง
  2. ความสัมพันธ์ของกลุ่มบุคคล
  3. เวลา
  4. เนื้อหา
*อย่าลืมด้วยนะว่าข้อมูลทั้ง 4 อย่างนี้กูเกิ้ลรู้ว่าเป็นข้อมูลของใคร(ทุกอย่างต้อง login)

ชักจะยาวเกินไปแล้ว ยังไม่พูดถึงแอนดรอยสักนิด
แล้วแอนดรอยมาเติมเต็มอะไรให้กับกูเกิ้ล?

  1. เติมเต็มข้อมูลทางด้าน ตำแหน่งบนพื้นโลก เพราะแอนดรอยมี GPS ทุกรุ่น รู้หมดตอนนี้คุณอยู่ที่ไหนกันบ้าง
  2. เติม เต็มการใช้บริการ Google Contact เพราะคนส่วนใหญ่น่าจะติดใจการ Sync Contact กับ Google (อย่างน้อยผมก็คนนึง) จากเมื่อก่อนผมไม่เคยสนใจ Google Contact เลย ตอนนี้แทบขาดไม่ได้
  3. เติมเต็มบริการทุกอย่างที่มือ ถือสามารถทำได้ เพราะการใช้งานแอนดรอยทุกเครื่องต้องมีการล็อกอิน เป็นการบังคับให้เราทุกคนช่วยกันใช้บริการต่างๆที่ได้กล่าวมาแล้วอย่างเอา จริงเอาจังมากขึ้น เช่น YouTube Picasa Calendar Google Maps เป็นต้น (อยากเอาข้อมูลไรก็ทำแอพพลิเคชันมา ยังไงเราก็ใช้ เพราะฟรี!! :D)

แอนดรอยช่วยได้แค่นี้เองหรือ???
ใช่แล้ว (ถ้าแอนดรอยเป็นเพียงแค่ระบบปฏิบัติการสำหรับมือถือ!!!)
!แต่....... แอนดรอยถูกออกแบบมาสำหรับ Embeded Device ที่ไม่ใช่เฉพาะมือถือเพียงอย่างเดียว!
ตอนนี้ที่เห็นๆกันอยู่ก็จะมี

  • E-Reader -> รู้นะว่าคุณชอบอ่านหนังสือแนวไหน
  • Netbook -> รู้นะว่าเล่นเว็บอะไรบ้าง
  • Media Player -> รู้นะชอบฟังเพลงแนวไหน ชอบหนังแนวไหน ใครเล่นเป็นนางเอก
*อย่าลืมนะว่าทุกอย่างมี Google Account ไม่มีทางพลาดว่าคุณเป็นใคร ฮ่าๆๆๆ

แล้วถ้าอุปกรณ์ต่อไปนี้รันด้วย "แอนดรอย" และมี "Google Account" กันทุกตัวละ!

  • ชักโครก -> วัดปริมาณน้ำตาลในปัจสาวะ แล้วส่งข้อมูลเรียลไทม์เก็บไว้ใน Google Health (คนแรกที่รู้ว่าคุณเป็นเบาหวานไม่ใช่หมออีกต่อไป แต่เป็น Google)
  • เครื่องปิ้งขนมปัง -> อย่างน้อยก็ทำให้รู้ว่าคุณชอบกินขนมปังบ่อยแค่ไหน
  • โทรทัศน์ -> คุณชอบดูรายการแบบไหน ละครแบบไหน รับรองกูเกิ้ลไม่พลาดแน่
  • ตู้เย็นอัจฉริยะ -> ถ้าใข่ไก่ในถาดด้านข้างตู้หมด อาจจะมีโฆษณาไข่ไก่สดลดราคาของ CPF มาโผล่ที่ด้านล่างหน้าจอทีวี และหน้าจอมือถือแอนดรอยของคุณ
  • นาฬิกาปลุก -> คุณไม่ต้องตั้งนาฬิกาปลุกอีกต่อไป เพราะมันจะ Sync กับ Google Calendar ทำให้คุณอยากใช้ Google Calendar มากขึ้นเพราะสะดวก และอาจจะมีโฆษณา โจ๊กกองปราบมาโผล่ที่หน้าจอนาฬิกาปลุกตอนเช้าๆ อิอิ (ตอนนี้ตารางชีวิตคุณโดนกำหนดโดย Google Calendar เรียบร้อยแล้ว อิอิ)
  • พริ้นเตอร์ -> พิมพ์รูปง่ายๆผ่าน Picasa ทำให้ไม่อยากเก็บรูปไว้ในที่อื่นอีกต่อไป เพราะไม่มีที่ใดสะดวกเท่าการเก็บไว้ใน Picasa ไม่ต้องกลัวหาย ฮาร์ดดิสก์เจ๊ง หรือแม้แต่หารูปไม่เจอ แถมยังพริ้นได้ทันทีที่ต้องการที่ไหนก็ได้
  • กรอบรูปดิจิตอล ประดับห้อง -> Random รูปจาก Picasa และ YouTube Account ของคุณมาแสดงย้อนเวลาประทับใจ (ถ้ามันดีขนาดนี้แล้วจะมีเหตุผลใดที่จะไปอัพโหลดรูปไว้ที่เว็บอื่น)
  • Car Multimedia Systems -> ทำได้ทั้ง Navigator ดูหนัง ฟังเพลง วิทยุออนไลน์ อ่านเมลล์ให้ฟังตอนขับรถ สนทนาผ่าน Google Voice กับเพื่อนได้ทันที แต่ทั้งหมดมีโฆษณาแอบแฝงมาด้วย (แต่ทำไงได้ก็เราใช้บริการของ Google ทุกอย่างแล้วนี่ ไม่มีเหตุผลที่จะไม่ใช้ ก็แค่โฆษณานิดเดียวเอง:D)
  • Car Maintenance System -> ตรวจสอบสถานะรถของเรา เช่น ลมยางอ่อน ถ้าอ่อนก็โฆษณาว่าบีควิกมีลดราคา, เตือนว่าถึงเวลาเปลี่ยนน้ำมันเครื่อง พร้อมกับบอกว่า PTT Performa น่าจะเหมาะกับรถของคุณ ฯลฯ
  • Travel System -> แค่มีรถยนต์แอนดรอย กับมือถือแอนดรอย คุณก็ไปท่องเที่ยวได้โดยไม่ต้องกังวลอะไรอีกต่อไป จะพักที่ไหน กูเกิ้ลบอกได้ จะหาอะไรทานอร่อยๆกูเกิ้ลบอกได้ เพื่อนๆที่ไปกับคุณอยู่ตรงไหนบ้าง กูเกิ้ลบอกได้ (แต่โรงแรมที่กูเกิ้ลแนะนำให้คุณพัก เค้าต้องจ่ายค่าโฆษณาให้กูเกิ้ลนะรู้รึปล่าว อิอิ) นี่ยังไม่รวมถึงการใช้กล้องถ่ายรูปหรือมือถือแอนดรอย ถ่ายรูปแล้วอัพรูปเข้า Picasa อีกด้วยนะจ๊ะ

!!! อนาคตอันใกล้นี้ ในวันหนึ่งๆ จะมีสักกี่นาทีที่กูเกิ้ลไม่ได้มีอิทธิพลกับชีวิตคุณ

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

ฉะเอิ่งเองเอย ชวึ้ง ปายละค้าบ


Source Droidsans