>> [เล่นเพลง]
>> DOUG LLOYD: OK
เราได้ทำงานร่วมกับจำนวนเต็ม เราได้ทำงานร่วมกับตัวอักษร
เราได้ทำงานลอย คู่สายและ bools
เราได้หมดสวยมากทุก ของ [ไม่ได้ยิน] ประเภทที่
ได้รับการบริการให้กับเรามาตลอด
แต่ตอนนี้เราต้องการที่จะทำบางสิ่งบางอย่างมากขึ้น
เราจะทำอย่างนั้นได้อย่างไร?
เราจะสร้างรูปแบบข้อมูลที่แตกต่างอย่างไร
เราสามารถทำได้โดยการใช้โครงสร้าง
ดังนั้นโครงสร้างช่วยให้เราสามารถที่จะรวมกัน ตัวแปรที่แตกต่างกัน
เป็นหนึ่งชนิดตัวแปรใหม่ ที่เราสามารถกำหนดชื่อประเภทของตัวเอง
นี้เป็นที่ดีจริงๆ สิ่งที่จะสามารถที่จะทำ
เพราะเราสามารถจัดกลุ่มในขณะนี้ องค์ประกอบของชนิดข้อมูลที่แตกต่าง
ร่วมกันที่มีการเชื่อมต่อเชิงตรรกะ
เราได้รับสามารถที่จะทำเช่นนี้ กับอาร์เรย์ที่จัดเรียงของใช่มั้ย?
เราสามารถตัวแปรกลุ่ม ประเภทข้อมูลเดียวกัน
ร่วมกันในหน่วยที่มีขนาดใหญ่ ของหน่วยความจำอาร์เรย์
>> แต่เรายังไม่ได้รับสามารถที่จะผสม ขึ้นชนิดข้อมูลที่แตกต่างเข้าด้วยกัน
เราไม่สามารถพูดว่าคู่จำนวนเต็ม และตัวอักษรและทุกคู่
ในสิ่งเดียวกันและ เรียกว่าเป็นหน่วยเดียว
แต่ด้วยโครงสร้างหรือ บ่อยครั้งเรียกว่า structs,
เราสามารถจริง
ดังนั้นโครงสร้างคือการจัดเรียง เช่นตัวแปรสุด
มันเป็นตัวแปรที่มี ตัวแปรอื่น ๆ ภายในของมัน
ดังนั้นนี่คือตัวอย่างของ โครงสร้างที่เรียบง่ายมาก
นี่คือสิ่งที่ไวยากรณ์จะมีลักษณะ ต้องการสร้างโครงสร้างสำหรับรถ
ตอนนี้ขอไปถึงไวยากรณ์ที่นี่
โครงสร้างที่เป็น คำหลักที่บ่งชี้ว่า
ที่ฉันสร้างชนิดข้อมูลใหม่ที่นี่
โดยเฉพาะอย่างยิ่งชื่อชนิดข้อมูลที่เป็น จะเป็นรถ struct ที่เราจะเห็น
แต่นี้คือการจัดเรียงของปลาย ออกไปคอมไพเลอร์ที่ว่านี้
เป็นกลุ่มของตัวแปรที่เป็นไป ที่จะได้รับการพิจารณาเป็นส่วนหนึ่งของประเภทเดียวกัน
ในนาทีที่
>> รถยนต์, เพียงแค่ชื่อของโครงสร้าง
อีกครั้งชนิดข้อมูลที่นี่เป็นไป จะเป็นรถ struct ไม่เพียงรถ
แต่ถ้าคุณมี different-- ถ้าคุณสร้าง structs หลาย
ในโปรแกรมเดียวกันคุณจะต้อง ความแตกต่างระหว่างโครงสร้างและโครงสร้าง
รถ struct ดังนั้นผมก็อาจจะมี นักเรียน struct ยกตัวอย่างเช่น
ในโปรแกรมเดียวกัน
ภายในวงเล็บปีกกาที่มี ทั้งหมดของเขตที่เรียกว่า
หรือสมาชิกของโครงสร้าง
ดังนั้นสิ่งที่มีบางสิ่งที่ ที่มีอยู่ในตัวรถหรือไม่
ดีก็มักจะมีปีได้ ชื่อรุ่นและแผ่นป้ายทะเบียน,
ระยะทางที่มักจะมี จำนวนไมล์บางที่มัน
และอาจจะมีขนาดเครื่องยนต์
และในขณะที่คุณสามารถดูฉันผสมขึ้น จำนวนเต็มและตัวอักษรและคู่ผสม
พวกเขากำลังทั้งหมดไปได้ ส่วนหนึ่งของชนิดข้อมูลใหม่นี้
>> สุดท้ายสิ่งสุดท้ายที่ฉันต้องการจะทำ อย่าลืมนี้อัฒภาคเล็ก ๆ น้อย ๆ
ในตอนท้าย
หลังจากที่เราเสร็จสิ้นการกำหนดโครงสร้าง เราจะต้องใส่เครื่องหมายอัฒภาคที่สิ้นสุด
มันเป็นประโยคที่พบบ่อยมาก ความผิดพลาดเพราะมีฟังก์ชั่น
ตัวอย่างเช่นคุณก็จะต้อง เปิดรั้งหยิกวงเล็บปีกกาใกล้
คุณไม่ใส่เครื่องหมายอัฒภาคที่ ในตอนท้ายของการกำหนดฟังก์ชั่น
นี้ดูเหมือนว่าฟังก์ชั่น ความหมาย แต่มันก็ไม่ได้
และเพื่อให้มีอัฒภาค เป็นเพียงการแจ้งเตือนที่คุณ
ต้องวางไว้ที่นั่นเพราะ คอมไพเลอร์จะเป็นอย่างอื่นไม่
ทราบว่าจะทำอย่างไรกับมัน
มันเป็นข้อผิดพลาดที่พบบ่อยมาก ตั้งใจทำให้
เมื่อคุณแรกการกำหนดโครงสร้าง
>> ตกลง.
ดังนั้นเราจึงมักจะกำหนดโครงสร้างของเรา ที่ด้านบนสุดของโปรแกรมของเรา
เพราะพวกเขากำลังอาจจะ จะใช้ฟังก์ชั่นหลาย ๆ
เราไม่ต้องการที่จะกำหนด struct ภายในของฟังก์ชั่น
แล้วเพราะเราสามารถเท่านั้นหากต้องการดู ขอบเขตของโครงสร้างจริงๆ
เฉพาะที่มีอยู่ภายในของฟังก์ชั่นที่
เราอาจต้องการที่จะกำหนดโครงสร้าง เพื่อให้เราสามารถใช้ในฟังก์ชั่นหลาย
หรือบางทีอาจจะในหลาย ๆ ไฟล์ที่มีการเชื่อมโยงกัน
การสร้างโปรแกรมเดียวของเรา
บางครั้งยังแทน การกำหนดโครงสร้าง
ที่ด้านบนมากที่คุณใส่ของคุณ ปอนด์รวมและปอนด์ของคุณที่กำหนด
ตัวอย่างเช่นคุณอาจจะใส่ไว้ใน ไฟล์ชั่วโมงจุดที่แยกต่างหากซึ่งคุณแล้ว
ปอนด์รวมถึงตัวคุณเอง
>> ดังนั้นเราจึงมีโครงสร้าง แต่ตอนนี้ เราต้องได้รับภายในของพวกเขา
เราจะได้รับภายในของวิธี โครงสร้างในการเข้าถึง
ผู้ตัวแปรย่อยตัวแปรเหล่านั้น ที่มีอยู่ภายในโครงสร้าง?
ดีที่เรามีสิ่งที่เรียกว่า ผู้ประกอบการจุดซึ่งช่วยให้เรา
ในการเข้าถึงด้านของโครงสร้าง
ดังนั้นตัวอย่างเช่นสมมติว่าผมเคยประกาศ ข้อมูลโครงสร้างของฉันพิมพ์ที่ไหนสักแห่ง
ที่ด้านบนของโปรแกรมของฉันหรือบางทีใน แฟ้มชั่วโมงจุดที่ผมเคยปอนด์รวม
ถ้าฉันแล้วต้องการที่จะสร้างใหม่ ตัวแปรของชนิดข้อมูลที่ฉันสามารถพูดได้
รถ struct รถของฉันอัฒภาค
เช่นเดียวกับที่ผมจะพูด int x หรืออัฒภาคชื่อสตริง
>> ชนิดข้อมูลที่นี่คือรถ struct, ชื่อของตัวแปรที่เป็นรถของฉัน
แล้วฉันสามารถใช้ประกอบการจุดไป เข้าถึงด้านต่างๆของรถของฉัน
ดังนั้นผมจึงสามารถพูดได้ว่ารถของฉัน ปีเท่ากับ 2,011 จุด
ที่ดีอย่างสมบูรณ์แบบ
ปีถ้าคุณจำได้ถูกกำหนดให้เป็น สนามจำนวนเต็มภายในของรถ struct นี้
ชนิดข้อมูล
ดังนั้นตัวแปรของข้อมูลรถ struct ใด ๆ ประเภทเช่นรถของฉันที่ฉันสามารถพูดรถของฉัน
จุดเท่ากับปีที่แล้วกำหนด มันบางค่าจำนวนเต็ม 2011
แผ่น dot รถของผมเท่ากับ CS50
การ์ดของฉันจุดวัดระยะทาง เท่ากับ 50,505 อัฒภาค
ทั้งหมดเหล่านี้จะ สมบูรณ์ดีและที่
วิธีการที่เราเข้าถึง ด้านของโครงสร้าง
โครงสร้าง แต่ไม่จำเป็นต้อง ถูกสร้างขึ้นในกอง
เช่นเดียวกับตัวแปรอื่น ๆ เรา แบบไดนามิกสามารถจัดสรรให้พวกเขา
ถ้าเรามีโปรแกรมที่อาจจะ ได้รับการสร้างโครงสร้างจำนวนมาก
เราไม่ทราบจำนวน เรากำลังจะต้อง
แล้วเราต้องแบบไดนามิก จัดสรรโครงสร้างเหล่านั้น
เป็นโปรแกรมของเรากำลังทำงานอยู่
และดังนั้นถ้าเรากำลังจะเข้าสู่ ด้านของโครงสร้างในบริบทที่
จำได้ว่าครั้งแรกที่เราต้อง dereference ตัวชี้ไปยังโครงสร้าง
และจากนั้นเมื่อเรา dereference ตัวชี้แล้วเราสามารถเข้าถึงฟิลด์
ถ้าเรามีเพียง ตัวชี้ไปยังโครงสร้าง
เราไม่สามารถเพียงแค่พูดว่าสนามชี้จุด ชื่อและได้รับสิ่งที่เรากำลังมองหา
มีขั้นตอนพิเศษของ dereferencing เป็น
ดังนั้นขอบอกว่า แทนการ previous--
เช่นเดียวกับตัวอย่างก่อนหน้านี้ แทนการประกาศว่า
ในกองรถ struct ของฉัน รถอัฒภาคผมว่ารถ struct,
ดาวตัวชี้ไปยัง รถ struct เรียกว่ารถของฉัน
เท่ากับขนาดของรถ malloc struct
ขนาดของเราจะคิดออกกี่ ไบต์ชนิดข้อมูลใหม่ของคุณจะขึ้น
คุณไม่จำเป็นจะต้องใช้ ขนาดของความกว้าง int หรือถ่านหรือ
ของในตัวชนิดข้อมูล
คอมไพเลอร์จะฉลาดพอ ที่จะคิดออกว่าหลายไบต์
ถูกต้องตามโครงสร้างใหม่ของคุณ
ดังนั้นผมจึง malloc ตัวเองหน่วยของหน่วยความจำ ขนาดใหญ่พอที่จะถือรถ struct ที่
และฉันได้รับตัวชี้กลับ บล็อกของหน่วยความจำที่
และตัวชี้ที่กำหนดให้กับรถของฉัน
>> ตอนนี้ถ้าผมต้องการที่จะเข้าถึง ด้านของรถของฉัน
ครั้งแรกที่ผม dereference รถของฉันใช้ ผู้ประกอบการ dereference ดาว
ที่เราได้เห็นจากตัวชี้ วิดีโอและแล้วหลังจากที่ผม dereference,
แล้วฉันจะใช้ตัวดำเนินการจุดไป เข้าถึงด้านต่างๆของรถของฉัน
ดาวรถของฉันจุดเท่ากับปี 2011
ที่จะมีผลกระทบ เราต้องการในกรณีนี้
เพราะเราได้แบบไดนามิก จัดสรรรถของฉัน
>> นั่นเป็นชนิดที่น่ารำคาญ แต่ใช่มั้ย?
มีกระบวนการขั้นตอนที่ 2 ตอนนี้
ตอนนี้เราต้อง dereference-- เรามีผู้ประกอบการดาว
และเรามีผู้ประกอบการจุด
และในขณะที่คุณอาจคาดหวังเพราะ โปรแกรมเมอร์ C รักวิธีที่สั้นกว่า
จะทำสิ่งที่มี ทางที่สั้นกว่าการทำเช่นนี้
มีผู้ประกอบการอื่นที่เรียกว่าลูกศรคือ ซึ่งจะทำให้กระบวนการนี​​้ง่ายขึ้นมาก
ทำงานลูกศรวิธีคือ มัน dereferences แรก
ตัวชี้ด้านซ้าย ด้านข้างของผู้ประกอบการ
แล้วหลังจากที่ได้ dereferenced ตัวชี้ด้านซ้าย
มันเข้าถึงสนามด้านขวา
และอื่น ๆ ก่อนหน้านี้เรามีการจัดเรียงนี้ สตาร์ดอทรถของฉันทุกสิ่งนี้
เหมือนมีเป็นจำนวนมากที่เกิดขึ้นมี
แต่สิ่งที่เราแทนสามารถทำได้คือ this-- ปีที่ลูกศรรถของฉันเท่ากับ 2,011
>> อีกครั้งสิ่งที่เกิดขึ้นที่นี่?
ครั้งแรกที่ฉัน dereferencing รถของฉัน
อีกครั้งซึ่งเป็นตัวชี้ที่นี่
จากนั้นหลังจากที่มี dereferenced รถของฉันฉัน
จากนั้นสามารถเข้าถึงฟิลด์ ปีจานและวัดระยะทาง
เพียงเท่าที่จะทำได้ก่อนที่จะมีครั้งแรก ดาวที่ใช้ในการ dereference รถของฉัน
และจุดที่จะเข้าถึงสนาม
ดังนั้นคุณจึงสามารถมีโครงสร้างที่คุณ สามารถมีตัวชี้ไปยังโครงสร้าง
และคุณมีวิธีที่จะเข้าถึง ด้านของโครงสร้างเหล่านั้น
ว่าคุณมีตัวชี้ไปยัง พวกเขาหรือตัวแปรตัวเอง
Dot หรือลูกศรขึ้นอยู่กับ ว่าตัวแปรที่มีการประกาศ
ฉันลอยด์ดั๊กนี้เป็น CS50