1 00:00:00,000 --> 00:00:02,395 >> [เล่นเพลง] 2 00:00:02,395 --> 00:00:05,750 3 00:00:05,750 --> 00:00:06,506 >> DOUG LLOYD: OK 4 00:00:06,506 --> 00:00:08,880 เราได้ทำงานร่วมกับจำนวนเต็ม เราได้ทำงานร่วมกับตัวอักษร 5 00:00:08,880 --> 00:00:11,930 เราได้ทำงานลอย คู่สายและ bools 6 00:00:11,930 --> 00:00:14,870 เราได้หมดสวยมากทุก ของ [ไม่ได้ยิน] ประเภทที่ 7 00:00:14,870 --> 00:00:17,100 ได้รับการบริการให้กับเรามาตลอด 8 00:00:17,100 --> 00:00:19,430 แต่ตอนนี้เราต้องการที่จะทำบางสิ่งบางอย่างมากขึ้น 9 00:00:19,430 --> 00:00:20,210 เราจะทำอย่างนั้นได้อย่างไร? 10 00:00:20,210 --> 00:00:22,560 เราจะสร้างรูปแบบข้อมูลที่แตกต่างอย่างไร 11 00:00:22,560 --> 00:00:26,130 เราสามารถทำได้โดยการใช้โครงสร้าง 12 00:00:26,130 --> 00:00:30,180 ดังนั้นโครงสร้างช่วยให้เราสามารถที่จะรวมกัน ตัวแปรที่แตกต่างกัน 13 00:00:30,180 --> 00:00:34,810 เป็นหนึ่งชนิดตัวแปรใหม่ ที่เราสามารถกำหนดชื่อประเภทของตัวเอง 14 00:00:34,810 --> 00:00:37,570 นี้เป็นที่ดีจริงๆ สิ่งที่จะสามารถที่จะทำ 15 00:00:37,570 --> 00:00:40,900 เพราะเราสามารถจัดกลุ่มในขณะนี้ องค์ประกอบของชนิดข้อมูลที่แตกต่าง 16 00:00:40,900 --> 00:00:43,910 ร่วมกันที่มีการเชื่อมต่อเชิงตรรกะ 17 00:00:43,910 --> 00:00:46,440 เราได้รับสามารถที่จะทำเช่นนี้ กับอาร์เรย์ที่จัดเรียงของใช่มั้ย? 18 00:00:46,440 --> 00:00:49,540 เราสามารถตัวแปรกลุ่ม ประเภทข้อมูลเดียวกัน 19 00:00:49,540 --> 00:00:53,410 ร่วมกันในหน่วยที่มีขนาดใหญ่ ของหน่วยความจำอาร์เรย์ 20 00:00:53,410 --> 00:00:56,660 >> แต่เรายังไม่ได้รับสามารถที่จะผสม ขึ้นชนิดข้อมูลที่แตกต่างเข้าด้วยกัน 21 00:00:56,660 --> 00:01:02,610 เราไม่สามารถพูดว่าคู่จำนวนเต็ม และตัวอักษรและทุกคู่ 22 00:01:02,610 --> 00:01:05,330 ในสิ่งเดียวกันและ เรียกว่าเป็นหน่วยเดียว 23 00:01:05,330 --> 00:01:08,830 แต่ด้วยโครงสร้างหรือ บ่อยครั้งเรียกว่า structs, 24 00:01:08,830 --> 00:01:09,585 เราสามารถจริง 25 00:01:09,585 --> 00:01:12,370 ดังนั้นโครงสร้างคือการจัดเรียง เช่นตัวแปรสุด 26 00:01:12,370 --> 00:01:16,530 มันเป็นตัวแปรที่มี ตัวแปรอื่น ๆ ภายในของมัน 27 00:01:16,530 --> 00:01:19,650 ดังนั้นนี่คือตัวอย่างของ โครงสร้างที่เรียบง่ายมาก 28 00:01:19,650 --> 00:01:23,380 นี่คือสิ่งที่ไวยากรณ์จะมีลักษณะ ต้องการสร้างโครงสร้างสำหรับรถ 29 00:01:23,380 --> 00:01:25,250 ตอนนี้ขอไปถึงไวยากรณ์ที่นี่ 30 00:01:25,250 --> 00:01:27,400 โครงสร้างที่เป็น คำหลักที่บ่งชี้ว่า 31 00:01:27,400 --> 00:01:30,270 ที่ฉันสร้างชนิดข้อมูลใหม่ที่นี่ 32 00:01:30,270 --> 00:01:33,860 โดยเฉพาะอย่างยิ่งชื่อชนิดข้อมูลที่เป็น จะเป็นรถ struct ที่เราจะเห็น 33 00:01:33,860 --> 00:01:36,640 แต่นี้คือการจัดเรียงของปลาย ออกไปคอมไพเลอร์ที่ว่านี้ 34 00:01:36,640 --> 00:01:42,440 เป็นกลุ่มของตัวแปรที่เป็นไป ที่จะได้รับการพิจารณาเป็นส่วนหนึ่งของประเภทเดียวกัน 35 00:01:42,440 --> 00:01:44,010 ในนาทีที่ 36 00:01:44,010 --> 00:01:46,340 >> รถยนต์, เพียงแค่ชื่อของโครงสร้าง 37 00:01:46,340 --> 00:01:50,590 อีกครั้งชนิดข้อมูลที่นี่เป็นไป จะเป็นรถ struct ไม่เพียงรถ 38 00:01:50,590 --> 00:01:53,060 แต่ถ้าคุณมี different-- ถ้าคุณสร้าง structs หลาย 39 00:01:53,060 --> 00:01:56,950 ในโปรแกรมเดียวกันคุณจะต้อง ความแตกต่างระหว่างโครงสร้างและโครงสร้าง 40 00:01:56,950 --> 00:02:00,140 รถ struct ดังนั้นผมก็อาจจะมี นักเรียน struct ยกตัวอย่างเช่น 41 00:02:00,140 --> 00:02:01,790 ในโปรแกรมเดียวกัน 42 00:02:01,790 --> 00:02:05,980 ภายในวงเล็บปีกกาที่มี ทั้งหมดของเขตที่เรียกว่า 43 00:02:05,980 --> 00:02:07,954 หรือสมาชิกของโครงสร้าง 44 00:02:07,954 --> 00:02:10,370 ดังนั้นสิ่งที่มีบางสิ่งที่ ที่มีอยู่ในตัวรถหรือไม่ 45 00:02:10,370 --> 00:02:15,270 ดีก็มักจะมีปีได้ ชื่อรุ่นและแผ่นป้ายทะเบียน, 46 00:02:15,270 --> 00:02:18,000 ระยะทางที่มักจะมี จำนวนไมล์บางที่มัน 47 00:02:18,000 --> 00:02:19,225 และอาจจะมีขนาดเครื่องยนต์ 48 00:02:19,225 --> 00:02:23,570 และในขณะที่คุณสามารถดูฉันผสมขึ้น จำนวนเต็มและตัวอักษรและคู่ผสม 49 00:02:23,570 --> 00:02:26,420 พวกเขากำลังทั้งหมดไปได้ ส่วนหนึ่งของชนิดข้อมูลใหม่นี้ 50 00:02:26,420 --> 00:02:29,750 >> สุดท้ายสิ่งสุดท้ายที่ฉันต้องการจะทำ อย่าลืมนี้อัฒภาคเล็ก ๆ น้อย ๆ 51 00:02:29,750 --> 00:02:30,290 ในตอนท้าย 52 00:02:30,290 --> 00:02:34,380 หลังจากที่เราเสร็จสิ้นการกำหนดโครงสร้าง เราจะต้องใส่เครื่องหมายอัฒภาคที่สิ้นสุด 53 00:02:34,380 --> 00:02:37,325 มันเป็นประโยคที่พบบ่อยมาก ความผิดพลาดเพราะมีฟังก์ชั่น 54 00:02:37,325 --> 00:02:40,200 ตัวอย่างเช่นคุณก็จะต้อง เปิดรั้งหยิกวงเล็บปีกกาใกล้ 55 00:02:40,200 --> 00:02:42,950 คุณไม่ใส่เครื่องหมายอัฒภาคที่ ในตอนท้ายของการกำหนดฟังก์ชั่น 56 00:02:42,950 --> 00:02:46,430 นี้ดูเหมือนว่าฟังก์ชั่น ความหมาย แต่มันก็ไม่ได้ 57 00:02:46,430 --> 00:02:49,653 และเพื่อให้มีอัฒภาค เป็นเพียงการแจ้งเตือนที่คุณ 58 00:02:49,653 --> 00:02:52,440 ต้องวางไว้ที่นั่นเพราะ คอมไพเลอร์จะเป็นอย่างอื่นไม่ 59 00:02:52,440 --> 00:02:53,510 ทราบว่าจะทำอย่างไรกับมัน 60 00:02:53,510 --> 00:02:56,160 มันเป็นข้อผิดพลาดที่พบบ่อยมาก ตั้งใจทำให้ 61 00:02:56,160 --> 00:02:58,570 เมื่อคุณแรกการกำหนดโครงสร้าง 62 00:02:58,570 --> 00:02:59,500 >> ตกลง. 63 00:02:59,500 --> 00:03:02,824 ดังนั้นเราจึงมักจะกำหนดโครงสร้างของเรา ที่ด้านบนสุดของโปรแกรมของเรา 64 00:03:02,824 --> 00:03:05,490 เพราะพวกเขากำลังอาจจะ จะใช้ฟังก์ชั่นหลาย ๆ 65 00:03:05,490 --> 00:03:08,850 เราไม่ต้องการที่จะกำหนด struct ภายในของฟังก์ชั่น 66 00:03:08,850 --> 00:03:12,110 แล้วเพราะเราสามารถเท่านั้นหากต้องการดู ขอบเขตของโครงสร้างจริงๆ 67 00:03:12,110 --> 00:03:13,790 เฉพาะที่มีอยู่ภายในของฟังก์ชั่นที่ 68 00:03:13,790 --> 00:03:17,450 เราอาจต้องการที่จะกำหนดโครงสร้าง เพื่อให้เราสามารถใช้ในฟังก์ชั่นหลาย 69 00:03:17,450 --> 00:03:20,670 หรือบางทีอาจจะในหลาย ๆ ไฟล์ที่มีการเชื่อมโยงกัน 70 00:03:20,670 --> 00:03:22,920 การสร้างโปรแกรมเดียวของเรา 71 00:03:22,920 --> 00:03:24,920 บางครั้งยังแทน การกำหนดโครงสร้าง 72 00:03:24,920 --> 00:03:27,961 ที่ด้านบนมากที่คุณใส่ของคุณ ปอนด์รวมและปอนด์ของคุณที่กำหนด 73 00:03:27,961 --> 00:03:32,080 ตัวอย่างเช่นคุณอาจจะใส่ไว้ใน ไฟล์ชั่วโมงจุดที่แยกต่างหากซึ่งคุณแล้ว 74 00:03:32,080 --> 00:03:35,020 ปอนด์รวมถึงตัวคุณเอง 75 00:03:35,020 --> 00:03:37,620 >> ดังนั้นเราจึงมีโครงสร้าง แต่ตอนนี้ เราต้องได้รับภายในของพวกเขา 76 00:03:37,620 --> 00:03:39,800 เราจะได้รับภายในของวิธี โครงสร้างในการเข้าถึง 77 00:03:39,800 --> 00:03:43,530 ผู้ตัวแปรย่อยตัวแปรเหล่านั้น ที่มีอยู่ภายในโครงสร้าง? 78 00:03:43,530 --> 00:03:46,810 ดีที่เรามีสิ่งที่เรียกว่า ผู้ประกอบการจุดซึ่งช่วยให้เรา 79 00:03:46,810 --> 00:03:50,990 ในการเข้าถึงด้านของโครงสร้าง 80 00:03:50,990 --> 00:03:55,490 ดังนั้นตัวอย่างเช่นสมมติว่าผมเคยประกาศ ข้อมูลโครงสร้างของฉันพิมพ์ที่ไหนสักแห่ง 81 00:03:55,490 --> 00:03:59,020 ที่ด้านบนของโปรแกรมของฉันหรือบางทีใน แฟ้มชั่วโมงจุดที่ผมเคยปอนด์รวม 82 00:03:59,020 --> 00:04:03,360 ถ้าฉันแล้วต้องการที่จะสร้างใหม่ ตัวแปรของชนิดข้อมูลที่ฉันสามารถพูดได้ 83 00:04:03,360 --> 00:04:06,260 รถ struct รถของฉันอัฒภาค 84 00:04:06,260 --> 00:04:11,580 เช่นเดียวกับที่ผมจะพูด int x หรืออัฒภาคชื่อสตริง 85 00:04:11,580 --> 00:04:18,100 >> ชนิดข้อมูลที่นี่คือรถ struct, ชื่อของตัวแปรที่เป็นรถของฉัน 86 00:04:18,100 --> 00:04:23,770 แล้วฉันสามารถใช้ประกอบการจุดไป เข้าถึงด้านต่างๆของรถของฉัน 87 00:04:23,770 --> 00:04:27,494 ดังนั้นผมจึงสามารถพูดได้ว่ารถของฉัน ปีเท่ากับ 2,011 จุด 88 00:04:27,494 --> 00:04:28,410 ที่ดีอย่างสมบูรณ์แบบ 89 00:04:28,410 --> 00:04:34,210 ปีถ้าคุณจำได้ถูกกำหนดให้เป็น สนามจำนวนเต็มภายในของรถ struct นี้ 90 00:04:34,210 --> 00:04:35,200 ชนิดข้อมูล 91 00:04:35,200 --> 00:04:39,966 ดังนั้นตัวแปรของข้อมูลรถ struct ใด ๆ ประเภทเช่นรถของฉันที่ฉันสามารถพูดรถของฉัน 92 00:04:39,966 --> 00:04:44,030 จุดเท่ากับปีที่แล้วกำหนด มันบางค่าจำนวนเต็ม 2011 93 00:04:44,030 --> 00:04:47,290 แผ่น dot รถของผมเท่ากับ CS50 94 00:04:47,290 --> 00:04:51,180 การ์ดของฉันจุดวัดระยะทาง เท่ากับ 50,505 อัฒภาค 95 00:04:51,180 --> 00:04:53,270 ทั้งหมดเหล่านี้จะ สมบูรณ์ดีและที่ 96 00:04:53,270 --> 00:04:57,802 วิธีการที่เราเข้าถึง ด้านของโครงสร้าง 97 00:04:57,802 --> 00:05:00,260 โครงสร้าง แต่ไม่จำเป็นต้อง ถูกสร้างขึ้นในกอง 98 00:05:00,260 --> 00:05:02,950 เช่นเดียวกับตัวแปรอื่น ๆ เรา แบบไดนามิกสามารถจัดสรรให้พวกเขา 99 00:05:02,950 --> 00:05:06,309 ถ้าเรามีโปรแกรมที่อาจจะ ได้รับการสร้างโครงสร้างจำนวนมาก 100 00:05:06,309 --> 00:05:08,100 เราไม่ทราบจำนวน เรากำลังจะต้อง 101 00:05:08,100 --> 00:05:10,800 แล้วเราต้องแบบไดนามิก จัดสรรโครงสร้างเหล่านั้น 102 00:05:10,800 --> 00:05:12,960 เป็นโปรแกรมของเรากำลังทำงานอยู่ 103 00:05:12,960 --> 00:05:16,600 และดังนั้นถ้าเรากำลังจะเข้าสู่ ด้านของโครงสร้างในบริบทที่ 104 00:05:16,600 --> 00:05:20,660 จำได้ว่าครั้งแรกที่เราต้อง dereference ตัวชี้ไปยังโครงสร้าง 105 00:05:20,660 --> 00:05:24,810 และจากนั้นเมื่อเรา dereference ตัวชี้แล้วเราสามารถเข้าถึงฟิลด์ 106 00:05:24,810 --> 00:05:26,830 ถ้าเรามีเพียง ตัวชี้ไปยังโครงสร้าง 107 00:05:26,830 --> 00:05:32,120 เราไม่สามารถเพียงแค่พูดว่าสนามชี้จุด ชื่อและได้รับสิ่งที่เรากำลังมองหา 108 00:05:32,120 --> 00:05:34,259 มีขั้นตอนพิเศษของ dereferencing เป็น 109 00:05:34,259 --> 00:05:36,050 ดังนั้นขอบอกว่า แทนการ previous-- 110 00:05:36,050 --> 00:05:38,770 เช่นเดียวกับตัวอย่างก่อนหน้านี้ แทนการประกาศว่า 111 00:05:38,770 --> 00:05:43,680 ในกองรถ struct ของฉัน รถอัฒภาคผมว่ารถ struct, 112 00:05:43,680 --> 00:05:48,020 ดาวตัวชี้ไปยัง รถ struct เรียกว่ารถของฉัน 113 00:05:48,020 --> 00:05:51,250 เท่ากับขนาดของรถ malloc struct 114 00:05:51,250 --> 00:05:54,950 ขนาดของเราจะคิดออกกี่ ไบต์ชนิดข้อมูลใหม่ของคุณจะขึ้น 115 00:05:54,950 --> 00:05:58,570 คุณไม่จำเป็นจะต้องใช้ ขนาดของความกว้าง int หรือถ่านหรือ 116 00:05:58,570 --> 00:05:59,715 ของในตัวชนิดข้อมูล 117 00:05:59,715 --> 00:06:02,090 คอมไพเลอร์จะฉลาดพอ ที่จะคิดออกว่าหลายไบต์ 118 00:06:02,090 --> 00:06:04,170 ถูกต้องตามโครงสร้างใหม่ของคุณ 119 00:06:04,170 --> 00:06:09,610 ดังนั้นผมจึง malloc ตัวเองหน่วยของหน่วยความจำ ขนาดใหญ่พอที่จะถือรถ struct ที่ 120 00:06:09,610 --> 00:06:12,410 และฉันได้รับตัวชี้กลับ บล็อกของหน่วยความจำที่ 121 00:06:12,410 --> 00:06:16,090 และตัวชี้ที่กำหนดให้กับรถของฉัน 122 00:06:16,090 --> 00:06:18,050 >> ตอนนี้ถ้าผมต้องการที่จะเข้าถึง ด้านของรถของฉัน 123 00:06:18,050 --> 00:06:22,615 ครั้งแรกที่ผม dereference รถของฉันใช้ ผู้ประกอบการ dereference ดาว 124 00:06:22,615 --> 00:06:26,620 ที่เราได้เห็นจากตัวชี้ วิดีโอและแล้วหลังจากที่ผม dereference, 125 00:06:26,620 --> 00:06:32,200 แล้วฉันจะใช้ตัวดำเนินการจุดไป เข้าถึงด้านต่างๆของรถของฉัน 126 00:06:32,200 --> 00:06:35,490 ดาวรถของฉันจุดเท่ากับปี 2011 127 00:06:35,490 --> 00:06:38,480 ที่จะมีผลกระทบ เราต้องการในกรณีนี้ 128 00:06:38,480 --> 00:06:41,960 เพราะเราได้แบบไดนามิก จัดสรรรถของฉัน 129 00:06:41,960 --> 00:06:43,610 >> นั่นเป็นชนิดที่น่ารำคาญ แต่ใช่มั้ย? 130 00:06:43,610 --> 00:06:44,818 มีกระบวนการขั้นตอนที่ 2 ตอนนี้ 131 00:06:44,818 --> 00:06:47,460 ตอนนี้เราต้อง dereference-- เรามีผู้ประกอบการดาว 132 00:06:47,460 --> 00:06:48,910 และเรามีผู้ประกอบการจุด 133 00:06:48,910 --> 00:06:51,660 และในขณะที่คุณอาจคาดหวังเพราะ โปรแกรมเมอร์ C รักวิธีที่สั้นกว่า 134 00:06:51,660 --> 00:06:53,740 จะทำสิ่งที่มี ทางที่สั้นกว่าการทำเช่นนี้ 135 00:06:53,740 --> 00:06:57,790 มีผู้ประกอบการอื่นที่เรียกว่าลูกศรคือ ซึ่งจะทำให้กระบวนการนี​​้ง่ายขึ้นมาก 136 00:06:57,790 --> 00:07:00,750 ทำงานลูกศรวิธีคือ มัน dereferences แรก 137 00:07:00,750 --> 00:07:03,560 ตัวชี้ด้านซ้าย ด้านข้างของผู้ประกอบการ 138 00:07:03,560 --> 00:07:06,620 แล้วหลังจากที่ได้ dereferenced ตัวชี้ด้านซ้าย 139 00:07:06,620 --> 00:07:09,620 มันเข้าถึงสนามด้านขวา 140 00:07:09,620 --> 00:07:14,170 และอื่น ๆ ก่อนหน้านี้เรามีการจัดเรียงนี้ สตาร์ดอทรถของฉันทุกสิ่งนี้ 141 00:07:14,170 --> 00:07:15,880 เหมือนมีเป็นจำนวนมากที่เกิดขึ้นมี 142 00:07:15,880 --> 00:07:22,040 แต่สิ่งที่เราแทนสามารถทำได้คือ this-- ปีที่ลูกศรรถของฉันเท่ากับ 2,011 143 00:07:22,040 --> 00:07:23,580 >> อีกครั้งสิ่งที่เกิดขึ้นที่นี่? 144 00:07:23,580 --> 00:07:25,720 ครั้งแรกที่ฉัน dereferencing รถของฉัน 145 00:07:25,720 --> 00:07:27,810 อีกครั้งซึ่งเป็นตัวชี้ที่นี่ 146 00:07:27,810 --> 00:07:31,270 จากนั้นหลังจากที่มี dereferenced รถของฉันฉัน 147 00:07:31,270 --> 00:07:35,130 จากนั้นสามารถเข้าถึงฟิลด์ ปีจานและวัดระยะทาง 148 00:07:35,130 --> 00:07:40,020 เพียงเท่าที่จะทำได้ก่อนที่จะมีครั้งแรก ดาวที่ใช้ในการ dereference รถของฉัน 149 00:07:40,020 --> 00:07:42,020 และจุดที่จะเข้าถึงสนาม 150 00:07:42,020 --> 00:07:45,290 ดังนั้นคุณจึงสามารถมีโครงสร้างที่คุณ สามารถมีตัวชี้ไปยังโครงสร้าง 151 00:07:45,290 --> 00:07:48,360 และคุณมีวิธีที่จะเข้าถึง ด้านของโครงสร้างเหล่านั้น 152 00:07:48,360 --> 00:07:52,600 ว่าคุณมีตัวชี้ไปยัง พวกเขาหรือตัวแปรตัวเอง 153 00:07:52,600 --> 00:07:57,640 Dot หรือลูกศรขึ้นอยู่กับ ว่าตัวแปรที่มีการประกาศ 154 00:07:57,640 --> 00:08:00,510 ฉันลอยด์ดั๊กนี้เป็น CS50 155 00:08:00,510 --> 00:08:01,975