1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:11,261 [მუსიკის დაკვრა] 3 00:00:11,261 --> 00:00:12,640 >> დევიდ ჯ Malan: ყველა უფლება. 4 00:00:12,640 --> 00:00:14,525 ეს არის CS50. 5 00:00:14,525 --> 00:00:16,009 და ეს არის დაწყების კვირაში 5. 6 00:00:16,009 --> 00:00:18,050 და როგორც თქვენ შეიძლება არ შეამჩნია, ზოგიერთი მასალა 7 00:00:18,050 --> 00:00:21,050 დღითიდღე უფრო კომპლექსი, პატარა სქელი. 8 00:00:21,050 --> 00:00:24,560 >> და ეს ძალიან ადვილია, განსაკუთრებით მაშინ, თუ თქვენ უკვე ჩვევად გარკვეული დროის განმავლობაში, 9 00:00:24,560 --> 00:00:28,600 ცდილობთ scribble ქვემოთ საუკეთესო არაფერს ვაკეთებთ, ჩვენ ვამბობთ კლასში. 10 00:00:28,600 --> 00:00:31,626 მაგრამ ვაცნობიერებთ, რომ არ არის, ალბათ, იდეალური პედაგოგიური მიდგომა 11 00:00:31,626 --> 00:00:34,250 სწავლის ამ სახის მასალა, და მატერიალური ზოგადად. 12 00:00:34,250 --> 00:00:37,250 ასე რომ, ჩვენ მოხარულები ვართ, რომ განვაცხადო, რომ CS50 საკუთარი Gheng 13 00:00:37,250 --> 00:00:39,780 Gong დაიწყო მომზადება კანონიკური კომპლექტი შენიშვნები 14 00:00:39,780 --> 00:00:42,100 , რა თქმა უნდა, იმ იმედით, რომელიც არის ის, რომ ერთი, ამ 15 00:00:42,100 --> 00:00:44,030 არა მხოლოდ როგორც მითითება და რესურსი 16 00:00:44,030 --> 00:00:47,410 განხილვის მასალა და აპირებს უკან მეშვეობით მასალა, რომელიც შესაძლოა, 17 00:00:47,410 --> 00:00:51,230 გაიქცა თქვენ პირველად გარშემო, მაგრამ ასევე, ასე რომ თქვენი თავები შეიძლება იყოს უფრო 18 00:00:51,230 --> 00:00:53,740 up-ზე ქვემოთ, როდესაც ის მოდის დრო, ლექცია, 19 00:00:53,740 --> 00:00:56,960 ასე რომ თქვენ შეიძლება ჩაერთოს მეტი thoughtfully, როგორც 20 00:00:56,960 --> 00:00:59,170 განსხვავებით უფრო Scribbly. 21 00:00:59,170 --> 00:01:02,510 >> რომ განაცხადა, ის, რაც თქვენ იპოვით საიტი არ არის ისეთი დოკუმენტები, როგორც ეს. 22 00:01:02,510 --> 00:01:04,660 და შეამჩნია, ზედა მარცხენა, არსებობს არა მხოლოდ სარჩევი, 23 00:01:04,660 --> 00:01:06,920 არამედ დრო კოდები, მაშინვე აირჩიე თქვენ 24 00:01:06,920 --> 00:01:09,077 შესაბამის ნაწილში ამ ვიდეო ონლაინ რეჟიმში. 25 00:01:09,077 --> 00:01:11,410 და რა Chang აქ გააკეთა არსებითად, დოკუმენტურად 26 00:01:11,410 --> 00:01:13,340 რა მოხდა ამ კერძოდ ლექცია. 27 00:01:13,340 --> 00:01:16,370 და ბევრი ლექციები უკვე ამჟამად ამ URL. 28 00:01:16,370 --> 00:01:20,110 და ჩვენ გავაგრძელებთ დატოვე დანარჩენი იმ ბოლოსთვის ამ კვირაში, 29 00:01:20,110 --> 00:01:22,380 ასე რომ ისარგებლოს, რომ რესურსი. 30 00:01:22,380 --> 00:01:25,740 >> ასე გარეშე ado, ჩვენ დავიწყეთ კანი უკან 31 00:01:25,740 --> 00:01:28,180 ფენას, რომელიც უკვე string გარკვეული დროის განმავლობაში. 32 00:01:28,180 --> 00:01:30,670 და რა მივიღეთ ამბობენ სიმებიანი რეალურად არის გასულ კვირას? 33 00:01:30,670 --> 00:01:31,720 34 00:01:31,720 --> 00:01:32,900 ასე რომ char ვარსკვლავი. 35 00:01:32,900 --> 00:01:34,900 და char ვარსკვლავი, ასევე, რა საერთოდ, რომ ნამდვილად ნიშნავს? 36 00:01:34,900 --> 00:01:37,150 ასევე, ყველა ამ დროს, თუ ჩვენ უკვე მოუწოდებენ ფუნქცია 37 00:01:37,150 --> 00:01:40,450 როგორიცაა getString, და შენახვა ე.წ. დაბრუნება 38 00:01:40,450 --> 00:01:42,910 ღირებულება getString წელს ცვლადი ეს ე.წ. 39 00:01:42,910 --> 00:01:47,721 s ტიპის სიმებიანი ჩვენ წერილობით ხაზი კოდი up there ზემოთ. 40 00:01:47,721 --> 00:01:49,970 და ეს მხოლოდ მაშინ, როცა ვხედავ, რომ ჩემი ხელწერა განადიდა აქ 41 00:01:49,970 --> 00:01:51,930 მე გააცნობიეროს, თუ რამდენად ბარბაროსულ ეს. 42 00:01:51,930 --> 00:01:54,180 >> თუმცა, მოდით ვივარაუდოთ, რომ, მარჯვენა მხარეს 43 00:01:54,180 --> 00:01:57,070 , მიუხედავად ამისა, გონივრული გამოსახულებებით რა არის 44 00:01:57,070 --> 00:01:58,880 უკვე მიმდინარეობს ეს ყველაფერი დრო getString. 45 00:01:58,880 --> 00:02:00,380 getString, რა თქმა უნდა, იღებს ტექსტი. 46 00:02:00,380 --> 00:02:01,691 მაგრამ რას ნიშნავს, ნამდვილად? 47 00:02:01,691 --> 00:02:04,190 ეს იმას ნიშნავს, რომ იგი იღებს ბლოკი მეხსიერების საწყისი ოპერაციული სისტემა 48 00:02:04,190 --> 00:02:06,040 დარეკვით ფუნქცია მოუწოდა malloc. 49 00:02:06,040 --> 00:02:07,390 მაგრამ ამაზე მოგვიანებით. 50 00:02:07,390 --> 00:02:09,139 და შემდეგ ეს populates რომ ბლოკი მეხსიერება 51 00:02:09,139 --> 00:02:11,764 წერილები მომხმარებელს აქვს აკრეფილი, რასაც მოჰყვა, რა თქმა უნდა, 52 00:02:11,764 --> 00:02:14,800 null ხასიათი, ან წარმატებული ნულოვანი ბოლომდე. 53 00:02:14,800 --> 00:02:18,280 >> იმავდროულად, მარცხენა მხარეს ეს ამბავი, მთელი ამ დროის განმავლობაში, 54 00:02:18,280 --> 00:02:20,850 ჩვენ ვაცხადებთ, რომ ცვლადი, როგორიცაა s. 55 00:02:20,850 --> 00:02:24,770 და რომ ცვლადი რა არის დაიწყება მოუწოდებენ მაჩვენებელი. 56 00:02:24,770 --> 00:02:29,190 ეს არ არის ყუთის შიგნით რომელიც ჩვენ დააყენა სიმებიანი, Daven, თავისთავად, 57 00:02:29,190 --> 00:02:32,550 არამედ ჩვენ დააყენა, რომ მოედანზე ყუთი მარცხენა რა? 58 00:02:32,550 --> 00:02:34,890 59 00:02:34,890 --> 00:02:35,390 ჰო? 60 00:02:35,390 --> 00:02:37,118 >> აუდიტორია: მისამართი სადაც ის მდებარეობს მეხსიერებაში. 61 00:02:37,118 --> 00:02:38,118 >> დევიდ ჯ Malan: ზუსტად. 62 00:02:38,118 --> 00:02:40,690 მისამართი სადაც Daven მდებარეობს მეხსიერებაში. 63 00:02:40,690 --> 00:02:44,650 და არა იქ, სადაც ყველა Daven მდებარეობს, თავისთავად, მაგრამ კონკრეტულად მისამართი 64 00:02:44,650 --> 00:02:45,150 რა? 65 00:02:45,150 --> 00:02:46,311 66 00:02:46,311 --> 00:02:46,810 ჰო? 67 00:02:46,810 --> 00:02:47,460 >> აუდიტორია: პირველი ხასიათი. 68 00:02:47,460 --> 00:02:50,209 >> დევიდ ჯ Malan: პირველი სიმბოლო in Daven, რომელიც, ამ შემთხვევაში, 69 00:02:50,209 --> 00:02:53,820 მე შევთავაზე, იყო თვითნებურად და არარეალურად 1, OX1, 70 00:02:53,820 --> 00:02:55,910 რომელიც მხოლოდ იმას ნიშნავს, რიცხვი 1. 71 00:02:55,910 --> 00:02:57,993 მაგრამ ეს, ალბათ, უნდა ბევრად უფრო დიდი რაოდენობის 72 00:02:57,993 --> 00:03:01,260 შეგვიძლია ერთად 0x როგორც პრეფიქსი, 73 00:03:01,260 --> 00:03:02,806 წარმოადგენს თექვსმეტობითი ხასიათი. 74 00:03:02,806 --> 00:03:05,930 და რადგან ჩვენ არ უნდა ვიცოდეთ, სად დანარჩენი გმირები Daven 75 00:03:05,930 --> 00:03:09,860 არიან, რადგან ის, რაც მარტივი დიზაინი გადაწყვეტილება, რომ გაკეთდა მრავალი წლის წინ? 76 00:03:09,860 --> 00:03:10,548 ჰო? 77 00:03:10,548 --> 00:03:11,651 >> აუდიტორია: Backslash 0. 78 00:03:11,651 --> 00:03:12,900 დევიდ ჯ Malan: ჰო, ზუსტად. 79 00:03:12,900 --> 00:03:18,100 წარმატებული 0 საშუალებას გაძლევთ, თუმცა ხაზოვანი დროს, უნდა traverse string, 80 00:03:18,100 --> 00:03:20,400 ფეხით მარცხნიდან მარჯვნივ, ამისთვის მარყუჟის, ან მაშინ, როცა 81 00:03:20,400 --> 00:03:22,608 მარყუჟის, ან რაღაც რომ, და განსაზღვრავს, რა, აქ 82 00:03:22,608 --> 00:03:24,751 არის ბოლომდე ამ კონკრეტულ სიმებიანი. 83 00:03:24,751 --> 00:03:27,000 ასე რომ მხოლოდ მისამართი at დასაწყისში სიმებიანი, 84 00:03:27,000 --> 00:03:30,290 ჩვენ შეგვიძლია წვდომის მთლიანობაში ეს იმიტომ, რომ მთელი ამ დროის, 85 00:03:30,290 --> 00:03:32,030 სიმებიანი ახლახანს char ვარსკვლავი. 86 00:03:32,030 --> 00:03:36,370 >> ასე რომ, ეს, რა თქმა უნდა ჯარიმა გამოყენება და გაგრძელება CS50 ბიბლიოთეკა და ამ აბსტრაქციის 87 00:03:36,370 --> 00:03:38,440 ასე ვთქვათ, მაგრამ ჩვენ დაიწყოს ზუსტად 88 00:03:38,440 --> 00:03:41,230 რა ხდება on ქვეშ მთელი ამ ხნის. 89 00:03:41,230 --> 00:03:45,260 ასე, რომ თქვენ შეიძლება გავიხსენოთ ამ მაგალითად, ძალიან, ბოლო დროს, შედარების 0, 90 00:03:45,260 --> 00:03:47,300 რომელიც პრაქტიკულად არ არის შედარების. 91 00:03:47,300 --> 00:03:49,070 მაგრამ ჩვენ დავიწყეთ გადაჭრის ამ. 92 00:03:49,070 --> 00:03:52,020 >> მაგრამ, ალბათ, ცოდნის გასაახლებლად, შეიძლება მე დაგაინტერესოთ ვინმე 93 00:03:52,020 --> 00:03:54,261 ვარდისფერი სპილო დღეს, ასევე გააკეთა Chang? 94 00:03:54,261 --> 00:03:55,760 როგორ შესახებ თქვენ წინაშე? [INAUDIBLE]. 95 00:03:55,760 --> 00:03:56,660 მოდის up. 96 00:03:56,660 --> 00:03:58,740 >> და იმავდროულად, როგორც თქვენ ამუშავება, მოდით 97 00:03:58,740 --> 00:04:01,670 განიხილოს მხოლოდ ერთი წუთით რა ეს კოდი იყო რეალურად აკეთებს. 98 00:04:01,670 --> 00:04:04,917 ეს გამოცხადების ორი ცვლადი up ზედა, და ტ, ხოლო getString. 99 00:04:04,917 --> 00:04:08,250 ეს არ არის ძალიან მოსახერხებელი პროგრამა, იმიტომ, რომ ეს არ გითხრათ რა უნდა გააკეთოს. 100 00:04:08,250 --> 00:04:10,541 მაგრამ მოდით უბრალოდ ვივარაუდოთ, რომ ჩვენ აქცენტი წვნიანი ნაწილი. 101 00:04:10,541 --> 00:04:14,470 და მაშინ ჩვენ გავაკეთოთ, თუ ტოლია შეადგენს t, უნდა ვთქვა printf, 102 00:04:14,470 --> 00:04:16,170 თქვენ აკრეფილი იგივე. 103 00:04:16,170 --> 00:04:16,670 Hello. 104 00:04:16,670 --> 00:04:17,050 რა გქვია? 105 00:04:17,050 --> 00:04:17,779 >> Janelle: Janelle. 106 00:04:17,779 --> 00:04:19,529 დევიდ ჯ Malan: Janelle, კარგია თქვენთან შეხვედრა. 107 00:04:19,529 --> 00:04:21,800 ასე რომ, თქვენი გამოწვევა ხელი ამ elephant 108 00:04:21,800 --> 00:04:25,230 პირველ მიაპყროს სურათს რა არის წარმოდგენილი იმ პირველი ორი 109 00:04:25,230 --> 00:04:25,970 ხაზები. 110 00:04:25,970 --> 00:04:28,139 ასე და ტ შეიძლება იყოს წარმოდგენილია, თუ როგორ ეკრანზე? 111 00:04:28,139 --> 00:04:30,680 და თქვენ შეგიძლიათ უბრალოდ შევაჩერო იგი თითის ამ დიდ ეკრანზე. 112 00:04:30,680 --> 00:04:31,780 113 00:04:31,780 --> 00:04:34,510 >> ასე რომ, არსებობს ორი halves to თითოეულ მხარეს, რომ განტოლება. 114 00:04:34,510 --> 00:04:37,760 ასე რომ იქ s მარცხენა და მაშინ getString უფლება. 115 00:04:37,760 --> 00:04:40,540 და მერე t მარცხენა, და შემდეგ getString უფლება. 116 00:04:40,540 --> 00:04:42,630 ასე როგორ შეიძლება ჩვენ ვიწყებთ ნახატი, რომელიც 117 00:04:42,630 --> 00:04:46,340 წარმოადგენს რა ხდება აქ მეხსიერება, იტყვით? 118 00:04:46,340 --> 00:04:49,150 და ნება მომეცით ნება თქვენ ახსნას თუ რას აკეთებს, როგორც თქვენ. 119 00:04:49,150 --> 00:04:49,820 >> Janelle: OK. 120 00:04:49,820 --> 00:04:58,890 ისე, პირველი, ეს იქნებოდა ითხოვს თქვენ შემავალი სიმებიანი. 121 00:04:58,890 --> 00:05:00,439 და ეს იქნებოდა store-- OH, უკაცრავად. 122 00:05:00,439 --> 00:05:01,230 დევიდ ჯ Malan: OK. 123 00:05:01,230 --> 00:05:01,730 კარგი. 124 00:05:01,730 --> 00:05:03,330 და ეს ჰქვია, რა? 125 00:05:03,330 --> 00:05:03,950 ოჰ, OK. 126 00:05:03,950 --> 00:05:04,450 შენარჩუნებას აპირებს. 127 00:05:04,450 --> 00:05:05,575 მე არ ნიშნავს, ხელი შეუშალოს. 128 00:05:05,575 --> 00:05:07,060 Janelle: Sorry. 129 00:05:07,060 --> 00:05:14,237 ასე რომ შეყვანის ის მისამართი of-- არ ვარ დარწმუნებული. 130 00:05:14,237 --> 00:05:17,320 მე ვერ ზუსტად არ მახსოვს ნომერი, მაგრამ მე მჯერა, რომ ეს, დაწყებული 0. 131 00:05:17,320 --> 00:05:18,420 >> დევიდ ჯ Malan: ეს ყველა უფლება, იმიტომ, რომ მე გააკეთა ნომრები up, 132 00:05:18,420 --> 00:05:19,650 ასე რომ არ არის სწორი პასუხი. 133 00:05:19,650 --> 00:05:22,105 >> Janelle: დაწყებული 0 რკალი. 134 00:05:22,105 --> 00:05:24,000 >> დევიდ ჯ Malan: OK, ასე ელემენტს 0. 135 00:05:24,000 --> 00:05:24,765 რა თქმა უნდა. 136 00:05:24,765 --> 00:05:28,295 >> Janelle: და თუ იყო ისევე როგორც მხოლოდ ორი letter-- 137 00:05:28,295 --> 00:05:30,496 >> დევიდ ჯ Malan: OK, უკან თქვენ. 138 00:05:30,496 --> 00:05:33,629 >> Janelle: So ელემენტი 0, და მაშინ ელემენტს 1 ან ელემენტი, 2. 139 00:05:33,629 --> 00:05:36,670 დევიდ ჯ Malan: და რომელი სურათზე ხატავ ახლა? 140 00:05:36,670 --> 00:05:37,690 ზარი getString? 141 00:05:37,690 --> 00:05:38,830 ან დეკლარაცია s? 142 00:05:38,830 --> 00:05:42,890 >> Janelle დეკლარაცია s, მე მჯერა. 143 00:05:42,890 --> 00:05:45,980 ოჰ, getString, რადგან ეს იქნებოდა შეიძლება შეყვანა თითოეული [? სფეროში. ?] 144 00:05:45,980 --> 00:05:46,510 >> დევიდ ჯ Malan: კარგი. 145 00:05:46,510 --> 00:05:47,051 ზუსტად. 146 00:05:47,051 --> 00:05:49,300 მიუხედავად იმისა, რომ ეს ეფექტურად ბრუნდება მასივი, გავიხსენოთ, 147 00:05:49,300 --> 00:05:53,300 როდესაც ჩვენ დავუბრუნდეთ სიმებიანი, ჩვენ შეგვიძლია ინდექსი, რომ სიმებიანი გამოყენებით 01 და 2. 148 00:05:53,300 --> 00:05:56,180 ტექნიკურად, ეს, ალბათ, წარმოდგენილია ინდივიდუალური მისამართები, 149 00:05:56,180 --> 00:05:57,100 მაგრამ ეს ჯარიმა. 150 00:05:57,100 --> 00:06:00,170 >> ასე რომ, ვფიქრობ, თუ მე შემიძლია უბრალოდ სწრაფი ველით, სადაც ჩვენ შეჩერდით 151 00:06:00,170 --> 00:06:04,320 ბოლო დროს, თუ ერთი სიმები იყო გ ა ბ e, 152 00:06:04,320 --> 00:06:10,337 წარმატებული 0, ამით წარმოადგენს Gabe მიერ input, როგორ შეიძლება ჩვენ წარმოვადგენთ ახლა? 153 00:06:10,337 --> 00:06:12,670 თუ ეს მეხსიერება რომ დაუბრუნა getString? 154 00:06:12,670 --> 00:06:14,415 155 00:06:14,415 --> 00:06:17,610 >> Janelle: უნდა იყოს წარმოდგენილია რკალი? 156 00:06:17,610 --> 00:06:18,750 >> დევიდ ჯ Malan: By რკალი? 157 00:06:18,750 --> 00:06:19,130 კარგად, არ. 158 00:06:19,130 --> 00:06:21,171 მოდით უბრალოდ, ვამბობთ, pictorially, ნება მომეცით წავიდეთ წინ 159 00:06:21,171 --> 00:06:25,710 და შესთავაზოს, რომ თუ ეს s, ეს დაბრუნებული მნიშვნელობა getString. 160 00:06:25,710 --> 00:06:29,482 და თქვენ შედგენილი ეს როგორც 0, 1, 2, სრულიად სამართლიანია, რადგან ჩვენ 161 00:06:29,482 --> 00:06:30,940 ინდექსი სიმებიანი, როგორც ასეთი. 162 00:06:30,940 --> 00:06:33,340 მაგრამ უნდა იყოს თანმიმდევრული ბოლო დროს, ნება მომეცით წავიდეთ წინ 163 00:06:33,340 --> 00:06:37,310 და თვითნებურად შესთავაზოს, რომ ეს არის მისამართი 1, ეს არის მისამართი 2, 164 00:06:37,310 --> 00:06:39,597 ეს არის მისამართი 3, და სხვ. 165 00:06:39,597 --> 00:06:41,430 და ასე, უბრალოდ უნდა იყოს სუპერ ნათელია, თუ რა ხდება 166 00:06:41,430 --> 00:06:44,580 წავიდეთ წინ, შედეგად, რომ პირველი ხაზი კოდი, იტყვით? 167 00:06:44,580 --> 00:06:45,420 >> Janelle: მისამართი 1? 168 00:06:45,420 --> 00:06:46,420 >> დევიდ ჯ Malan: ზუსტად. 169 00:06:46,420 --> 00:06:47,190 ასე მიმართავენ 0x1. 170 00:06:47,190 --> 00:06:48,220 171 00:06:48,220 --> 00:06:51,230 და იმავდროულად, ნება მომეცით წავიდეთ წინ და დუბლიკატი ბევრი, რას ვაკეთებ 172 00:06:51,230 --> 00:06:52,740 და დაამატოთ საკუთარი t აქ. 173 00:06:52,740 --> 00:06:56,340 თუ მე აკრიფოთ Gabe ერთხელ, მეორედ, 174 00:06:56,340 --> 00:07:01,530 როდესაც აიძულა getString, სადაც, რა თქმა უნდა, Gabe აპირებს? 175 00:07:01,530 --> 00:07:02,280 ასევე, presumably-- 176 00:07:02,280 --> 00:07:04,935 177 00:07:04,935 --> 00:07:05,975 >> Janelle: Like აქ? 178 00:07:05,975 --> 00:07:06,850 დევიდ ჯ Malan: ჰო. 179 00:07:06,850 --> 00:07:08,516 Janelle: ან ის ასევე იგივე ყუთები? 180 00:07:08,516 --> 00:07:11,940 დევიდ ჯ Malan: ნება მომეცით შესთავაზოს, yeah, ზუსტად, ისე ამ დამატებითი საშუალებები. 181 00:07:11,940 --> 00:07:15,230 მაგრამ რა არის გასაღები არის, რომ, მაშინაც კი, თუმცა მე შედგენილი ამ საკმაოდ ახლოს 182 00:07:15,230 --> 00:07:18,650 together-- 0x1, ამ არის 0x2-- სინამდვილეში, 183 00:07:18,650 --> 00:07:25,750 ეს ახლა, შესაძლოა, მისამართზე 0x10, მაგალითად, და 0x11 და 0x12, 184 00:07:25,750 --> 00:07:26,870 და სხვ. 185 00:07:26,870 --> 00:07:29,955 ასე რომ, თუ ეს საქმე, რა დასრულდება მდე აქ t? 186 00:07:29,955 --> 00:07:30,830 >> Janelle: 0x10? 187 00:07:30,830 --> 00:07:31,830 დევიდ ჯ Malan: ზუსტად. 188 00:07:31,830 --> 00:07:33,180 ასე 0x10. 189 00:07:33,180 --> 00:07:34,570 და ახლა, საბოლოო კითხვას. 190 00:07:34,570 --> 00:07:37,510 თქვენ არ, გაცილებით, უწევდათ მუშაობა უმძიმესი სპილო დღემდე. 191 00:07:37,510 --> 00:07:42,650 ახლა, თუ მე დახევის up კოდი ერთხელ, როცა ამის გაკეთება, შესაბამისად, სამი, 192 00:07:42,650 --> 00:07:47,630 თუ ტოლია ტოლია t, რა ვარ მე რეალურად შედარებით, რომ ჩვენ შედგენილი აქ? 193 00:07:47,630 --> 00:07:49,271 >> Janelle: ორი მისამართები? 194 00:07:49,271 --> 00:07:50,270 დევიდ ჯ Malan: ზუსტად. 195 00:07:50,270 --> 00:07:53,350 ამიტომ მე ვამბობ, არის ის თანაბარი ტოლია t? 196 00:07:53,350 --> 00:07:56,210 სხვა სიტყვებით რომ ვთქვათ, 1 თანაბარი ტოლია 10? 197 00:07:56,210 --> 00:07:59,710 და რა თქმა უნდა, ცხადია პასუხი, ახლა არის, არ არსებობს. 198 00:07:59,710 --> 00:08:02,920 და ასე რომ ეს პროგრამა არის საბოლოო აპირებს ბეჭდვა რა, იტყვით? 199 00:08:02,920 --> 00:08:05,770 200 00:08:05,770 --> 00:08:08,405 >> Janelle: იქნება ეს, თქვენ აკრეფილი იგივე? 201 00:08:08,405 --> 00:08:11,446 >> დევიდ ჯ Malan: ასე რომ, თუ s არის 1 და t არის 10? 202 00:08:11,446 --> 00:08:13,320 >> Janelle თქვენ აკრეფილი სხვადასხვა რამ. 203 00:08:13,320 --> 00:08:13,570 >> დევიდ ჯ Malan: ზუსტად. 204 00:08:13,570 --> 00:08:14,480 თქვენ აკრეფილი სხვადასხვა რამ. 205 00:08:14,480 --> 00:08:14,850 ყველა უფლება. 206 00:08:14,850 --> 00:08:16,714 ასე რაუნდი ტაში, თუ ჩვენ შეგვიძლია, აქ. 207 00:08:16,714 --> 00:08:17,214 [ტაში] 208 00:08:17,214 --> 00:08:17,708 რომ იყო მტკივნეული. 209 00:08:17,708 --> 00:08:18,208 მე ვიცი. 210 00:08:18,208 --> 00:08:19,684 ლამაზად კეთდება. 211 00:08:19,684 --> 00:08:24,690 ასე რომ, ახლა ვნახოთ, თუ ჩვენ არ შეგვიძლია აჯავრებენ გარდა რა სარემონტო იყო. 212 00:08:24,690 --> 00:08:28,040 და რა თქმა უნდა, როდესაც ჩვენ დაფიქსირდა გაკეთება რომელიც მე ახლა წარმოადგენენ green-- 213 00:08:28,040 --> 00:08:29,690 ჩვენ გავაკეთეთ რამდენიმე გაუმჯობესებებს აქ. 214 00:08:29,690 --> 00:08:32,409 პირველი, როგორც საღი აზრის შეამოწმეთ, მე პირველი შემოწმების 215 00:08:32,409 --> 00:08:35,110 თუ ტოლია null და t = null. 216 00:08:35,110 --> 00:08:39,440 და უბრალოდ უნდა იყოს წმინდა, როდესაც შეიძლება ან უ null კოდის მსგავსად? 217 00:08:39,440 --> 00:08:43,140 218 00:08:43,140 --> 00:08:44,490 როდესაც შესაძლოა ან უ null. 219 00:08:44,490 --> 00:08:44,990 ჰო? 220 00:08:44,990 --> 00:08:45,990 >> აუდიტორია: [INAUDIBLE]. 221 00:08:45,990 --> 00:08:49,490 222 00:08:49,490 --> 00:08:50,510 >> დევიდ ჯ Malan: ზუსტად. 223 00:08:50,510 --> 00:08:52,840 თუ სტრიქონი აკრეფილი არის ძალიან დიდი ხნის განმავლობაში 224 00:08:52,840 --> 00:08:56,140 ჯდება მეხსიერებაში, ან უცნაური კუთხეში შემთხვევაში, როგორც, რომ, 225 00:08:56,140 --> 00:08:59,010 getString, როგორც ვნახავთ, ფაქტიურად დღეს, მისი დოკუმენტაცია, 226 00:08:59,010 --> 00:09:02,330 ამბობს, რომ დაბრუნების null როგორც სპეციალური Sentinel ღირებულებით, 227 00:09:02,330 --> 00:09:05,417 ან უბრალოდ ერთგვარი სპეციალური სიმბოლო ეს ნიშნავს, რომ რაღაც წავიდა არასწორი. 228 00:09:05,417 --> 00:09:07,500 ასე რომ, ჩვენ გვინდა შევამოწმოთ რომ, იმიტომ, რომ თურმე 229 00:09:07,500 --> 00:09:09,720 რომ null არის ძალიან საშიში ღირებულება. 230 00:09:09,720 --> 00:09:14,250 >> ხშირად, თუ თქვენ ცდილობენ, რომ რამე null ჩართვის ფუნქცია გავლის 231 00:09:14,250 --> 00:09:17,470 როგორც შეყვანა, instance-- რომ ფუნქცია შეიძლება ძალიან ავარიის და, მასთან ერთად, 232 00:09:17,470 --> 00:09:19,090 , თქვენი მთელი პროგრამა. 233 00:09:19,090 --> 00:09:22,570 ასე რომ, ეს მესამე ხაზი ახლა მხოლოდ საღი აზრის შემოწმება, შეცდომა შემოწმება, თუ გნებავთ. 234 00:09:22,570 --> 00:09:25,450 ეს კარგი ჩვევა ახლა ჩვენთვის შეღწევას ნებისმიერ დროს ჩვენ 235 00:09:25,450 --> 00:09:28,050 ცდილობენ გამოიყენონ ღირებულება, რომელიც შესაძლოა, პოტენციურად, შეიძლება იყოს null. 236 00:09:28,050 --> 00:09:32,000 >> ახლა, მეოთხე ხაზი აქ, "თუ strcmp (s, t)," კარგად, 237 00:09:32,000 --> 00:09:33,180 რა არის, რომ გულისხმობდა? 238 00:09:33,180 --> 00:09:36,750 ასევე, ჩვენ ვთქვით, რომ ეს იყო ძალიან მოკლედ დაასახელა ფუნქცია სიმებიანი შედარებით. 239 00:09:36,750 --> 00:09:40,370 და მისი მიზანი ცხოვრებაში არის შედარება მისი პირველი არგუმენტი ის წინააღმდეგ მეორე, 240 00:09:40,370 --> 00:09:44,640 მაგრამ არა იმ თვალსაზრისით, მათი მისამართები, როგორც ჩვენ გავაკეთეთ უნებლიეთ მომენტი 241 00:09:44,640 --> 00:09:48,270 ჯერ წითელი კოდი, მაგრამ უფრო სწორად, შევადაროთ ორი 242 00:09:48,270 --> 00:09:53,210 სიმებისათვის ადამიანური ინტუიციური გზა შედარებით ეს, წინააღმდეგ, 243 00:09:53,210 --> 00:09:56,690 წინააღმდეგ, წინააღმდეგ, და მაშინ შეჩერების, თუ როდის და ერთი 244 00:09:56,690 --> 00:09:59,590 ან ორივე ჩემი თითები ჰიტები წარმატებული 0. 245 00:09:59,590 --> 00:10:04,530 ასე რომ ვინმეს წლის წინ განხორციელებული strcmp განახორციელოს us ფუნქციონალური 246 00:10:04,530 --> 00:10:08,890 ჩვენ იმედი გვქონდა, რომ უკვე მიღებული მხოლოდ შედარებით ორი მარტივი ღირებულებებს. 247 00:10:08,890 --> 00:10:14,929 >> ახლა გულწრფელად ვამბობ, მე შენარჩუნება ნახაზი ყველა ამ სხვადასხვა ნომრები. 248 00:10:14,929 --> 00:10:17,470 მაგრამ რეალობა ის არის, მე მიღების ეს მთელი დრო. 249 00:10:17,470 --> 00:10:19,580 და ნება მომეცით, უბრალოდ წავიდეთ წინ და scribble ეს, 250 00:10:19,580 --> 00:10:23,100 რათა წერტილი, რომ ბოლოს დღე და წინ მიდის, 251 00:10:23,100 --> 00:10:30,160 ჩვენ ნამდვილად არ აპირებს აინტერესებს რა მიმართავს რამ რეალურად 252 00:10:30,160 --> 00:10:30,790 მეხსიერებაში. 253 00:10:30,790 --> 00:10:34,320 ასე რომ, მე არ ვაპირებ შევაჩერო ეს სახის ნომრები იმდენად აღარ, 254 00:10:34,320 --> 00:10:38,970 მე უბრალოდ აბსტრაქტული ამ მოშორებით უფრო მეგობრული მხოლოდ ისრებით. 255 00:10:38,970 --> 00:10:42,060 >> სხვა სიტყვებით, თუ ის მაჩვენებელი, კარგად, მოდით უბრალოდ შევაჩერო ეს, ფაქტიურად, 256 00:10:42,060 --> 00:10:45,430 როგორც მაჩვენებელი, ისარი მიუთითებს თავად რაღაც, 257 00:10:45,430 --> 00:10:48,280 და არ ინერვიულოთ ძალიან ბევრი უფრო მეტი minutia ამ მისამართებზე 258 00:10:48,280 --> 00:10:49,910 რომელიც, კიდევ ერთხელ, მე მაინც. 259 00:10:49,910 --> 00:10:52,680 მაგრამ ჩვენ დავინახავთ იმ მისამართებზე, ზოგჯერ, როდესაც გამართვის კოდი. 260 00:10:52,680 --> 00:10:56,450 >> ახლა კი, რომელიც ამ პროგრამის აქ აფიქსირებს, რა თქმა უნდა, 261 00:10:56,450 --> 00:10:58,720 რომ პრობლემა შედარებით იმ ორ strings. 262 00:10:58,720 --> 00:11:00,260 მაგრამ ჩვენ შეუვარდნენ კიდევ ერთი პრობლემა. 263 00:11:00,260 --> 00:11:03,180 ეს იყო ასლი პროგრამის ბოლო დროს, 264 00:11:03,180 --> 00:11:06,880 რომლის დროსაც, მე ცდილობს, მხოლოდ პირველი პერსონაჟი სიმებიანი. 265 00:11:06,880 --> 00:11:09,620 მაგრამ რა იყო სიმპტომია ჩვენ ვნახეთ ბოლო დროს, როდესაც 266 00:11:09,620 --> 00:11:14,150 მომხმარებლის აკრეფილი ღირებულება, ისევე როგორც Gabe in ამას, s, 267 00:11:14,150 --> 00:11:19,310 მაშინ ჩვენ მიერ ს შევიდა t, როგორც მესამე ხაზი არსებობს, 268 00:11:19,310 --> 00:11:22,900 და შემდეგ მე შევეცადე კაპიტალიზაცია t bracket 0? 269 00:11:22,900 --> 00:11:25,950 რა იყო ეფექტი იცვლება t bracket 0 აქ? 270 00:11:25,950 --> 00:11:27,150 >> აუდიტორია: ეს შეიცვალა s. 271 00:11:27,150 --> 00:11:29,360 >> დევიდ ჯ Malan: ჰო, მე შეიცვალა s, ისევე. 272 00:11:29,360 --> 00:11:31,050 რადგან ის, რაც იყო სინამდვილეში? 273 00:11:31,050 --> 00:11:34,130 ასევე, ნება მომეცით ვხედავ, თუ შეიძლება სუფთა ამ სურათს, შემდეგნაირად. 274 00:11:34,130 --> 00:11:41,390 >> თუ არის, კიდევ ერთხელ, სიტყვა გ, a, b, e, წარმატებული, 0, და s 275 00:11:41,390 --> 00:11:44,084 ჩვენ გავაგრძელებთ ნახაზის ყუთი აქ, მაგრამ აღარ მისამართები. 276 00:11:44,084 --> 00:11:45,250 მოდით შევწყვიტოთ მიღების რამ up. 277 00:11:45,250 --> 00:11:47,510 მოდით უბრალოდ მიაპყროს სურათი გამარტივება მსოფლიოში. 278 00:11:47,510 --> 00:11:52,640 >> როდესაც ვაცხადებ t სიმებიანი t, რომელიც ქმნის, რომ ბლოკი მეხსიერება. 279 00:11:52,640 --> 00:11:55,850 მოედანზე ხდება, რომ იყოს 32 ბიტი ყველაზე კომპიუტერებს. 280 00:11:55,850 --> 00:11:59,530 რეალურად, თუ თქვენ ოდესმე მსმენია კომპიუტერული მქონე 32-bit არქიტექტურის, 281 00:11:59,530 --> 00:12:03,000 მართლაც ლამაზი საუბარი, რომ მხოლოდ ეს იმას ნიშნავს რომ იყენებს 32-bit მისამართები. 282 00:12:03,000 --> 00:12:05,370 და როგორც ტექნიკური გარდა, თუ თქვენ ოდესმე გვაინტერესებდა, 283 00:12:05,370 --> 00:12:09,630 რატომ ძველი კომპიუტერები, თუ რეალურად ცდილობდა წვნიანი მათ უამრავი RAM, 284 00:12:09,630 --> 00:12:12,360 შეიძლება, მაქსიმუმ ოთხი გიგაბაიტი ოპერატიული მეხსიერება, 285 00:12:12,360 --> 00:12:14,860 ასევე იმიტომ, რომ, ფაქტიურად, თქვენი ძველი კომპიუტერის შეეძლო მხოლოდ 286 00:12:14,860 --> 00:12:17,250 ითვლიან როგორც მაღალი, როგორც 4 მილიარდი, 4 მილიარდი ბაიტი, 287 00:12:17,250 --> 00:12:20,590 იმიტომ, რომ ის გამოყენებით 32-bit ნომრები მისამართები. 288 00:12:20,590 --> 00:12:23,260 >> მაგრამ ნებისმიერ შემთხვევაში, ამ მაგალითად, ამბავი ბევრად უფრო მარტივია. 289 00:12:23,260 --> 00:12:27,250 t არის კიდევ ერთი მაჩვენებელი, ან მართლაც char ვარსკვლავი, aka სიმებიანი. 290 00:12:27,250 --> 00:12:30,860 და როგორ არ მინდა, რომ განაახლოს ეს სურათი ახლა, რომ მეორე ხაზი კოდი, 291 00:12:30,860 --> 00:12:31,950 შემდეგ dot, dot, dot? 292 00:12:31,950 --> 00:12:35,845 როცა ამის გაკეთება string t = s მძიმით, როგორ ამჯამად ამ სურათს შეცვლის? 293 00:12:35,845 --> 00:12:37,500 294 00:12:37,500 --> 00:12:38,000 ჰო? 295 00:12:38,000 --> 00:12:38,916 >> აუდიტორია: [INAUDIBLE]. 296 00:12:38,916 --> 00:12:41,087 297 00:12:41,087 --> 00:12:42,020 >> დევიდ ჯ Malan: ჰო. 298 00:12:42,020 --> 00:12:42,600 ზუსტად. 299 00:12:42,600 --> 00:12:45,620 მე უბრალოდ დააყენა arrow საწყისი t ყუთი იგივე მისამართზე, 300 00:12:45,620 --> 00:12:47,570 იმავე პირველ წერილში მისცა. 301 00:12:47,570 --> 00:12:50,850 ან ტექნიკურად, თუ ამ ბიჭი იყო ჯერ კიდევ 0x1, 302 00:12:50,850 --> 00:12:53,052 ეს თითქოს მე მქონდა 0x1 აქ და 0x1 აქ. 303 00:12:53,052 --> 00:12:54,760 მაგრამ კიდევ ერთხელ, ვინც ზრუნავს შესახებ მისამართები? 304 00:12:54,760 --> 00:12:56,345 ეს არის იდეა, რომ ახლა მნიშვნელოვანია. 305 00:12:56,345 --> 00:12:57,720 ასე რომ, ეს არის ის, რაც ხდება აქ. 306 00:12:57,720 --> 00:13:02,690 ასე რომ, რა თქმა უნდა, თუ t bracket 0, რომელიც მასივი notation, 307 00:13:02,690 --> 00:13:05,650 საქართველოს რა თქმა უნდა და გულწრფელად ვამბობ, ეს გამოიყურება როგორც იქ მასივი მეტი აქ, 308 00:13:05,650 --> 00:13:07,340 მაგრამ ახლა არ არის ეს უცნაური რამ. 309 00:13:07,340 --> 00:13:11,160 ვიცი, რომ პროგრამირების ენა, C, გთავაზობთ ამ ფუნქციის, 310 00:13:11,160 --> 00:13:14,650 რომლის დროსაც, თუნდაც t არის კურსორი, ან s არის მაჩვენებელი, 311 00:13:14,650 --> 00:13:18,050 თქვენ შეგიძლიათ კვლავ გამოიყენოთ, რომ იცნობს, კომფორტული კვადრატული ფრჩხილი 312 00:13:18,050 --> 00:13:22,520 notation წასვლა პირველ ელემენტს, ან მეორე ელემენტი, ან რაიმე ელემენტი, 313 00:13:22,520 --> 00:13:26,130 რომ ეს მაჩვენებელი არის მიუთითებს იმიტომ, რომ, სავარაუდოდ, ეს 314 00:13:26,130 --> 00:13:29,410 არის, რადგან ამ შემთხვევაში, მიუთითებს რაღაც მასივი. 315 00:13:29,410 --> 00:13:30,340 >> ასე როგორ უნდა დაფიქსირება ამ? 316 00:13:30,340 --> 00:13:33,660 გულწრფელად ვამბობ, ეს არის, სადაც ეს მივიღე ცოტა გადაჭარბებული ერთი შეხედვით. 317 00:13:33,660 --> 00:13:35,340 მაგრამ აქ არის ახალი და გაუმჯობესებული ვერსია. 318 00:13:35,340 --> 00:13:37,460 >> ასე რომ, პირველი, მე მისაღებად მოშორება CS50 ბიბლიოთეკა, 319 00:13:37,460 --> 00:13:41,170 უბრალოდ გამოამჟღავნონ, რომ არის მართლაც char ვარსკვლავი, სინონიმი. 320 00:13:41,170 --> 00:13:43,540 და t ასევე char ვარსკვლავი. 321 00:13:43,540 --> 00:13:48,290 მაგრამ რა ხდება იმ მარჯვენა მხარეს, რომ ხაზი 322 00:13:48,290 --> 00:13:49,970 სადაც t ენიჭება მნიშვნელობა? 323 00:13:49,970 --> 00:13:50,790 >> რა არის malloc? 324 00:13:50,790 --> 00:13:51,630 რა რომ strlen? 325 00:13:51,630 --> 00:13:52,547 რა არის sizeof (char)? 326 00:13:52,547 --> 00:13:54,380 რატომ heck აკეთებს ამას ონლაინ სახე იმდენად რთული? 327 00:13:54,380 --> 00:13:55,713 რას აკეთებს მაღალ დონეზე? 328 00:13:55,713 --> 00:13:56,482 329 00:13:56,482 --> 00:13:57,440 რა არის ის შენახვის t? 330 00:13:57,440 --> 00:13:58,646 ჰო? 331 00:13:58,646 --> 00:14:01,104 აუდიტორია: ეს განაწილების გარკვეული მეხსიერების სივრცე. 332 00:14:01,104 --> 00:14:03,032 ეს შესანახად, ვფიქრობ, წერილები [INAUDIBLE]. 333 00:14:03,032 --> 00:14:04,032 >> დევიდ ჯ Malan: Perfect. 334 00:14:04,032 --> 00:14:04,540 სრულყოფილი. 335 00:14:04,540 --> 00:14:06,650 ის გამოყოფის გარკვეული თანხის მეხსიერების სივრცე 336 00:14:06,650 --> 00:14:08,940 შესანახად, სავარაუდოდ, მომავალი წერილები. 337 00:14:08,940 --> 00:14:11,310 კერძოდ, malloc ამიტომ დაბრუნების რა? 338 00:14:11,310 --> 00:14:13,114 339 00:14:13,114 --> 00:14:14,851 >> აუდიტორია: დავბრუნდეთ [INAUDIBLE]? 340 00:14:14,851 --> 00:14:15,850 დევიდ ჯ Malan: ზუსტად. 341 00:14:15,850 --> 00:14:18,850 დაბრუნების მისამართი, რომ მეხსიერება, რომელიც არის ლამაზი გზა ამბობდა, 342 00:14:18,850 --> 00:14:21,640 დააბრუნებს მისამართი პირველი byte, რომ მეხსიერებაში. 343 00:14:21,640 --> 00:14:25,460 Onus არის ჩემთან უნდა გვახსოვდეს რამდენი მეხსიერება მე რეალურად 344 00:14:25,460 --> 00:14:27,140 გამოყოფილი ან სთხოვა malloc for. 345 00:14:27,140 --> 00:14:28,384 >> ახლა, თუ რამდენად არის ეს? 346 00:14:28,384 --> 00:14:30,550 ასევე, მიუხედავად იმისა, რომ არსებობს ბევრი ფრჩხილებში აქ, 347 00:14:30,550 --> 00:14:32,970 malloc იღებს მხოლოდ ერთი არგუმენტი. 348 00:14:32,970 --> 00:14:37,250 და მე დაზუსტების strlen of s, ასე რომ მე, როგორც ბევრი bytes როგორც არსებობს s, 349 00:14:37,250 --> 00:14:37,800 მაგრამ დაამატოთ ერთი. 350 00:14:37,800 --> 00:14:38,300 რატომ? 351 00:14:38,300 --> 00:14:39,030 352 00:14:39,030 --> 00:14:39,530 ჰო? 353 00:14:39,530 --> 00:14:40,840 >> აუდიტორია: წარმატებული 0. 354 00:14:40,840 --> 00:14:41,840 დევიდ ჯ Malan: ზუსტად. 355 00:14:41,840 --> 00:14:43,423 ჩვენ მივიღეთ პატარა მომსახურება. 356 00:14:43,423 --> 00:14:45,970 ასე რომ, იმიტომ, რომ იქ წარმატებული 0, ჩვენ უკეთეს გახსოვდეთ, რომ. 357 00:14:45,970 --> 00:14:47,310 წინააღმდეგ შემთხვევაში, ჩვენ ვაპირებთ სტრინგის შექმნის, რომ 358 00:14:47,310 --> 00:14:49,170 არ აქვს, რომ სპეციალური terminator. 359 00:14:49,170 --> 00:14:52,640 >> იმავდროულად, მხოლოდ უნდა იყოს სუპერ anal, მაქვს sizeof (char), 360 00:14:52,640 --> 00:14:55,730 მხოლოდ იმ შემთხვევაში, ვინმე გადის ჩემი კოდი არ CS50 ელექტრო მოწყობილობების, 361 00:14:55,730 --> 00:14:58,220 მაგრამ იქნებ სხვადასხვა კომპიუტერულ საერთოდ, სადაც chars 362 00:14:58,220 --> 00:15:01,470 არის ერთ ნაწილად, კონვენციას, მაგრამ ორი ბაიტს, ან რაღაც უფრო დიდი, ვიდრე, რომ. 363 00:15:01,470 --> 00:15:04,490 ის უბრალოდ უნდა იყოს სუპერ, super averse შეცდომები. 364 00:15:04,490 --> 00:15:06,940 მიუხედავად იმისა, რომ რეალურად, ის სავარაუდოდ იქნება 1. 365 00:15:06,940 --> 00:15:11,490 >> ახლა კი, ამ დროს, წავიდეთ წინ და ასლი სიმებიანი, t bracket შეადგენს t bracket s. 366 00:15:11,490 --> 00:15:14,962 და მე თვლიან, რომ გასული კვირის კოდის ნახოთ რა ხდება. 367 00:15:14,962 --> 00:15:17,670 მაგრამ გასაღები takeaway და მიზეზი მე ზუსტად კოდი არის მწვანე, 368 00:15:17,670 --> 00:15:22,520 იმიტომ, რომ ძალიან ბოლო ხაზი, t bracket 0 უდრის toupper, 369 00:15:22,520 --> 00:15:25,230 აქვს ეფექტი capitalizing რომელიც სიმებიანი? 370 00:15:25,230 --> 00:15:26,960 t ან / და s? 371 00:15:26,960 --> 00:15:29,280 372 00:15:29,280 --> 00:15:30,580 რომ ბოლო ხაზი კოდი. 373 00:15:30,580 --> 00:15:32,930 374 00:15:32,930 --> 00:15:35,560 >> უბრალოდ t, რადგან რა მოხდა ამ დროს, 375 00:15:35,560 --> 00:15:41,500 თუ მე ოდნავ გაუქმება, რომ ბოლო ნაბიჯი, რა მოხდა არის, როდესაც მე მოვუწოდებ malloc, 376 00:15:41,500 --> 00:15:45,380 მე არსებითად მისაღებად ბლოკი მეხსიერება რომ არის იგივე ზომა, როგორც ორიგინალური, 377 00:15:45,380 --> 00:15:47,020 იმიტომ, რომ არითმეტიკული მე. 378 00:15:47,020 --> 00:15:50,920 მე შენახვის t მისამართი რომ ბლოკი მეხსიერება. 379 00:15:50,920 --> 00:15:53,370 მიუხედავად იმისა, რომ გამოიყურება ლამაზი და ლამაზი, ლამაზი და ცარიელი, 380 00:15:53,370 --> 00:15:56,882 რეალობა არსებობს, ის, რაც ჩვენ შეინახოს მოუწოდებდა, ნაგვის ღირებულებების აქ. 381 00:15:56,882 --> 00:15:59,340 რომ ბლოკი მეხსიერება, შესაძლოა, ძალიან ასევე გამოყენებულ იქნა ადრე, 382 00:15:59,340 --> 00:16:00,940 რამდენიმე წამში, რამდენიმე წუთის წინ. 383 00:16:00,940 --> 00:16:04,410 ასე რომ შეიძლება აბსოლუტურად ნომრები ან წერილებს, უბრალოდ შემთხვევით. 384 00:16:04,410 --> 00:16:08,580 მაგრამ ისინი არ არის სწორი, სანამ მე თავს ცხოვრობენ ბლოკი მეხსიერება 385 00:16:08,580 --> 00:16:12,510 ფაქტობრივი სიმბოლო, როგორც მე გავაკეთოთ, რომ მარყუჟი არსებობს. 386 00:16:12,510 --> 00:16:13,180 ყველა უფლება? 387 00:16:13,180 --> 00:16:16,180 >> ასე რომ, ახლა კულმინაციას ეს სამი მაგალითი 388 00:16:16,180 --> 00:16:20,730 , რომლებიც, როგორც ჩანს, მოტეხილობა ბოლო დროს, ამ Swap მაგალითად, ამ ფუნქციის 389 00:16:20,730 --> 00:16:23,670 მუშაობდა აზრი ის, რომ ქულების დასაგროვებლად და ბ. 390 00:16:23,670 --> 00:16:25,620 მაგრამ ეს არ იმუშავებს, თუ რა სხვა აზრი? 391 00:16:25,620 --> 00:16:27,616 392 00:16:27,616 --> 00:16:28,614 ჰო? 393 00:16:28,614 --> 00:16:29,612 >> აუდიტორია: [INAUDIBLE]. 394 00:16:29,612 --> 00:16:35,600 395 00:16:35,600 --> 00:16:36,700 >> დევიდ ჯ Malan: ზუსტად. 396 00:16:36,700 --> 00:16:39,530 თუ მე უნდა მოვუწოდებთ ამ ფუნქციის საწყისი another-- მაგალითად, 397 00:16:39,530 --> 00:16:42,870 ფუნქცია, როგორიცაა ძირითადი სადაც მაქვს ცვლადი, x და y, როგორც მე 398 00:16:42,870 --> 00:16:46,160 როგორც გასულ კვირას, იგივე კოდი, და მე კორიდორი x და y 399 00:16:46,160 --> 00:16:49,860 სვოპ, და შემდეგ Swap-- ამ, რა თქმა უნდა, არის სწორი ვერსია 400 00:16:49,860 --> 00:16:52,220 არის ის, რაც ჩვენ შესახებ ვხედავ ეს არ იმუშავებს. 401 00:16:52,220 --> 00:16:53,770 რა არის სარემონტო? 402 00:16:53,770 --> 00:16:56,850 >> კარგად, ასე რომ უბრალოდ უნდა იყოს ნათელია, ნება მომეცით წავიდეთ წინ 403 00:16:56,850 --> 00:17:05,450 and-- მომეცი ერთი მეორე აქ და ვნახავთ თუ შემიძლია გაჩვენოთ ბოლო, რომელიც 404 00:17:05,450 --> 00:17:12,464 იქნება in-- ვნახოთ, თუ ვიპოვი ეს რეალური fast-- OK, [INAUDIBLE]. 405 00:17:12,464 --> 00:17:18,440 406 00:17:18,440 --> 00:17:19,240 OK, ის არის. 407 00:17:19,240 --> 00:17:21,000 ასე იგნორირება ბრძანებები მე უბრალოდ აკრეფით. 408 00:17:21,000 --> 00:17:23,780 მე მინდა, რომ მიიღოთ ზე ბოლო წუთს მაგალითი 409 00:17:23,780 --> 00:17:27,960 ბოლო დროს, რომელიც ახლა მოუწოდა swap. 410 00:17:27,960 --> 00:17:30,200 >> ასე რომ არ Swap სადაც ჩვენ შეჩერდით ბოლო დროს, 411 00:17:30,200 --> 00:17:32,930 რომლის დროსაც, მე ინიციალიზაცია x 1 და y 2. 412 00:17:32,930 --> 00:17:35,840 მე მაშინ მოვუწოდებთ Swap გავლით 1 და 2. 413 00:17:35,840 --> 00:17:37,930 და შემდეგ ამ ფუნქციის მუშაობდა გარკვეული თვალსაზრისით, 414 00:17:37,930 --> 00:17:40,750 მაგრამ ეს არ ჰქონდა მუდმივი გავლენის x და y. 415 00:17:40,750 --> 00:17:45,430 ასე რომ, კითხვა მხრივ, თუ როგორ არის ჩვენ რეალურად დაფიქსირება ამ პრობლემას? 416 00:17:45,430 --> 00:17:47,820 რა არის გამოსავალი მხრივ? 417 00:17:47,820 --> 00:17:53,150 >> ასევე, swap.c, რომელიც ახალი დღეს, შეამჩნია რამდენიმე განსხვავებები. 418 00:17:53,150 --> 00:17:54,700 x და y იგივეა. 419 00:17:54,700 --> 00:17:57,250 მაგრამ რა არის აშკარად განსხვავებული ხაზი 25? 420 00:17:57,250 --> 00:17:58,880 421 00:17:58,880 --> 00:18:01,715 რა არის ახალი აქ, თუ გახსოვთ ის, რაც ჩანდა მეორე წინ? 422 00:18:01,715 --> 00:18:02,565 >> აუდიტორია: [INAUDIBLE]. 423 00:18:02,565 --> 00:18:03,440 >> დევიდ ჯ Malan: ჰო. 424 00:18:03,440 --> 00:18:06,680 ასე რომ, ampersands არის ახალი ნაჭერი სინტაქსი არა მხოლოდ ამ პროგრამას, 425 00:18:06,680 --> 00:18:08,560 არამედ ზოგადად CS50. 426 00:18:08,560 --> 00:18:10,680 დღემდე, არა მგონია, ჩვენ ვნახეთ რაიმე მაგალითები 427 00:18:10,680 --> 00:18:14,070 ან ნამდვილად ისაუბრა მათ ნებისმიერ დეტალურად, გარდა, შესაძლოა, წინასწარ 428 00:18:14,070 --> 00:18:16,467 ნაწილში, ampersand მოსწონს ეს. 429 00:18:16,467 --> 00:18:19,300 ასევე, თურმე ampersand არის ერთ ერთი ბოლო ცალი ახალი სინტაქსი 430 00:18:19,300 --> 00:18:20,174 ჩვენ ვაპირებთ, რომ ისწავლონ. 431 00:18:20,174 --> 00:18:23,500 ყველა ეს ნიშნავს იმას, მისამართი ზოგიერთი ცვლადი. 432 00:18:23,500 --> 00:18:25,070 რა მისამართზე ამჯამად x ცხოვრობს? 433 00:18:25,070 --> 00:18:26,510 მაგრამ რა მისამართზე Y ცხოვრობენ? 434 00:18:26,510 --> 00:18:28,700 იმიტომ, რომ თუ ფუნდამენტური პრობლემის წინაშე 435 00:18:28,700 --> 00:18:32,970 ის იყო, რომ x და y მიმდინარეობს გავიდა ასლი, რაც ჩვენ ნამდვილად გვინდა, რომ გავაკეთოთ 436 00:18:32,970 --> 00:18:38,780 არის უზრუნველყოფს Swap მოსწონს საგანძური რუკა, რომელსაც მივყავართ, სადაც x და y რეალურად 437 00:18:38,780 --> 00:18:41,910 არიან RAM, ასე რომ Swap შეუძლია დაიცვას, რომ რუკა 438 00:18:41,910 --> 00:18:47,760 და წასვლა იქ, სადაც x და y აღნიშნავს ადგილზე და შეცვალოს რეალურ ღირებულებებს 1 და 2 439 00:18:47,760 --> 00:18:48,270 არსებობს. 440 00:18:48,270 --> 00:18:50,710 >> ასე Swap უნდა შეიცვალოს ოდნავ. 441 00:18:50,710 --> 00:18:53,760 და ერთი შეხედვით, ეს შეიძლება როგორც ჩანს, ცოტა მსგავსი char ვარსკვლავი. 442 00:18:53,760 --> 00:18:54,850 და ეს ნამდვილად. 443 00:18:54,850 --> 00:18:59,635 ასე რომ მომცეთ რა სახის მონაცემები, ამ საფუძველზე ხაზგასმით ნაწილი? 444 00:18:59,635 --> 00:19:00,810 445 00:19:00,810 --> 00:19:01,620 ასე რომ, ეს int. 446 00:19:01,620 --> 00:19:04,880 >> ასე რომ აღარ არის int, ეს მისამართი int. 447 00:19:04,880 --> 00:19:07,910 და ანალოგიურად, ბ ახლა აპირებს უნდა იყოს მისამართი int. 448 00:19:07,910 --> 00:19:12,470 ასე რომ, როდესაც ახლა მოვუხმობ Swap from მთავარი მე არ ვაპირებ, რათა Swap 1 და 2. 449 00:19:12,470 --> 00:19:15,540 მე ვაპირებ, რათა ეს მოსწონს Ox-რაღაც და Ox-რამე, 450 00:19:15,540 --> 00:19:19,820 ორ მისამართს, რომელიც მიგვიყვანს Swap ფაქტობრივი ადგილას 451 00:19:19,820 --> 00:19:21,310 ჩემი კომპიუტერის მეხსიერებაში. 452 00:19:21,310 --> 00:19:25,580 >> ახლა, ჩემი დარჩენილი განხორციელების უნდა შეიცვალოს tad. 453 00:19:25,580 --> 00:19:28,650 რა არის აშკარად სხვადასხვა არის ამ სამი ხაზი კოდი? 454 00:19:28,650 --> 00:19:31,350 იქ ეს რა ვარსკვლავები ყველა მეტი ადგილი, ყველა უფლება? 455 00:19:31,350 --> 00:19:33,014 ასე რომ, რა ხდება აქ? 456 00:19:33,014 --> 00:19:33,514 ჰო? 457 00:19:33,514 --> 00:19:35,055 >> აუდიტორია: ეს აშკარად [INAUDIBLE]. 458 00:19:35,055 --> 00:19:36,832 459 00:19:36,832 --> 00:19:37,990 >> დევიდ ჯ Malan: ზუსტად. 460 00:19:37,990 --> 00:19:41,560 ასე რომ, ამ კონტექსტში და ეს არ იყო საუკეთესო დიზაინის გადაწყვეტილება, მართლაც, 461 00:19:41,560 --> 00:19:42,530 წლის წინ. 462 00:19:42,530 --> 00:19:45,110 ამ კონტექსტში, სადაც თქვენ უბრალოდ უნდა ვარსკვლავი, 463 00:19:45,110 --> 00:19:48,240 და თქვენ არ აქვს მონაცემები ტიპის, როგორიცაა int, მაშინვე მარცხენა, 464 00:19:48,240 --> 00:19:53,146 სამაგიეროდ, თანაბარი ნიშანი, ცხადია, ამ კონტექსტში, როცა ამბობენ, რომ ვარსკვლავი, 465 00:19:53,146 --> 00:19:56,980 ეს ნიშნავს, რომ წავიდეს მისამართი რომ წელს. 466 00:19:56,980 --> 00:19:58,870 დაიცავით საგანძური რუკა, ასე ვთქვათ. 467 00:19:58,870 --> 00:20:01,720 >> და იმავდროულად, ხაზი 37, ეს იმას ნიშნავს, რომ იგივე. 468 00:20:01,720 --> 00:20:05,460 გადადით მისამართზე, და ამით რა არის? 469 00:20:05,460 --> 00:20:09,520 როგორიც არ უნდა იყოს ის არის, ადგილმდებარეობა რომ ბ განსაზღვრავს. 470 00:20:09,520 --> 00:20:10,980 სხვა სიტყვებით, გადადით ბ. 471 00:20:10,980 --> 00:20:12,130 მიიღეთ, რომ ღირებულება. 472 00:20:12,130 --> 00:20:15,620 წასვლა და, თითო თანაბარი მოაწეროს, დავალება ოპერატორი, 473 00:20:15,620 --> 00:20:17,010 ვთქვათ, რომ არც არსებობს. 474 00:20:17,010 --> 00:20:19,272 >> ანალოგიურად, int temp მხოლოდ int. 475 00:20:19,272 --> 00:20:20,730 არაფერი უნდა შეცვალოს temp. 476 00:20:20,730 --> 00:20:24,810 უბრალოდ სათადარიგო მინის Annenberg ზოგიერთი რძე ან ფორთოხლის წვენი. 477 00:20:24,810 --> 00:20:27,630 მაგრამ მე უნდა ვთქვა, რომ წავიდეს ბ. 478 00:20:27,630 --> 00:20:31,449 წასვლა რომ დანიშნულების და ბოლო ღირებულების temp არსებობს. 479 00:20:31,449 --> 00:20:32,490 ასე რომ, რა ხდება სინამდვილეში? 480 00:20:32,490 --> 00:20:36,540 როდესაც მე სინამდვილეში Swap ამ დროს, თუ ეს პირველი უჯრა აქ წარმოადგენს მთავარი 481 00:20:36,540 --> 00:20:42,270 ამ მეორე უჯრა წარმოადგენს Swap, როდესაც მე გაივლის ampersand x და y ampersand 482 00:20:42,270 --> 00:20:47,150 მთავარი სვოპ, უბრალოდ უნდა იყოს წმინდა, რა არის ამ დასტის ჩარჩო მიმღები? 483 00:20:47,150 --> 00:20:48,700 484 00:20:48,700 --> 00:20:49,200 ჰო? 485 00:20:49,200 --> 00:20:50,180 >> აუდიტორია: [INAUDIBLE]. 486 00:20:50,180 --> 00:20:51,180 დევიდ ჯ Malan: ზუსტად. 487 00:20:51,180 --> 00:20:53,129 მისამართი x და მისამართი წ. 488 00:20:53,129 --> 00:20:55,170 და შეგიძლიათ წარმოიდგინოთ, რომ ეს როგორიცაა საფოსტო მისამართები. 489 00:20:55,170 --> 00:20:58,772 33 Oxford Street და 35 Oxford Street, და თქვენ 490 00:20:58,772 --> 00:21:01,230 გინდა ორი შენობა , რომლებიც იმ ადგილას. 491 00:21:01,230 --> 00:21:04,680 >> ეს ერთგვარი სასაცილოა იდეა, მაგრამ ეს ყველაფერი ნიშნავს მისამართზე. 492 00:21:04,680 --> 00:21:07,000 სად მსოფლიოში შეგიძლიათ თქვენ იმ ორი ints? 493 00:21:07,000 --> 00:21:09,470 სად მსოფლიოში შეგიძლიათ მოვძებნოთ იმ ორ შენობაში? 494 00:21:09,470 --> 00:21:15,170 ასე რომ, თუ ბოლოს და ბოლოს, მას შემდეგ, რაც ყველა, ეს დრო წასვლას დღევანდელი კოდის და შეადგინონ 495 00:21:15,170 --> 00:21:22,110 Swap და აწარმოებს ./swap ბოლოს, პირველად ჩვენ რეალურად ვხედავთ, რომ 496 00:21:22,110 --> 00:21:25,330 ჩემი ღირებულებები მართლაც უკვე გაცვალეს წარმატებით. 497 00:21:25,330 --> 00:21:30,860 და ახლა, ჩვენ კი მიიღოს ჩაინიშნეთ ეს, ვთქვათ, GDB. 498 00:21:30,860 --> 00:21:32,740 >> ნება მომეცით წასვლას იგივე ფაილი. 499 00:21:32,740 --> 00:21:35,010 ნება მომეცით წავიდეთ წინ და აწარმოებს GDB of ./swap. 500 00:21:35,010 --> 00:21:36,590 501 00:21:36,590 --> 00:21:40,547 და ახლა, შეცვლა, მე ვაპირებ წავიდეთ წინ და მითითებული შესვენების in მთავარი. 502 00:21:40,547 --> 00:21:42,630 და ახლა მე ვაპირებ წავიდეთ წინ და აწარმოებს პროგრამა. 503 00:21:42,630 --> 00:21:45,810 და ახლა ჩვენ ვხედავთ ჩემი კოდი ათვისება რომ ხაზი. 504 00:21:45,810 --> 00:21:48,330 >> თუ წავიდეთ წინ და ბეჭდვა x, რა უნდა ნახოთ აქ? 505 00:21:48,330 --> 00:21:49,314 506 00:21:49,314 --> 00:21:49,980 ეს საკითხი. 507 00:21:49,980 --> 00:21:51,030 508 00:21:51,030 --> 00:21:51,530 ამბობენ, რომ კიდევ ერთხელ? 509 00:21:51,530 --> 00:21:52,295 >> აუდიტორია: [INAUDIBLE]. 510 00:21:52,295 --> 00:21:53,910 >> დევიდ ჯ Malan: ასე რომ, შემთხვევითი ნომრები, იქნებ. 511 00:21:53,910 --> 00:21:56,010 იქნებ მე იღბლიანი, და ეს ლამაზი და მარტივი, როგორც 0. 512 00:21:56,010 --> 00:21:57,230 მაგრამ იქნებ ეს შემთხვევითი ნომერი. 513 00:21:57,230 --> 00:21:58,090 ამ შემთხვევაში, მე მივიღე გაუმართლა. 514 00:21:58,090 --> 00:21:59,030 ეს მხოლოდ ხდება, 0. 515 00:21:59,030 --> 00:22:00,780 მაგრამ ეს მართლაც luck, იმიტომ, რომ სანამ არ 516 00:22:00,780 --> 00:22:06,280 აკრიფოთ შემდეგი და შემდეგ ბეჭდვა x აქვს, რომ ხაზი კოდი, ხაზი 19, შესრულდა. 517 00:22:06,280 --> 00:22:10,942 >> იმავდროულად, თუ მე აკრიფოთ შემდეგი ერთხელ და ბეჭდვა Y, მე ვაპირებ 2. 518 00:22:10,942 --> 00:22:13,900 ახლა, თუ მე აკრიფოთ შემდეგი, რომ ის აპირებს კიდევ ცოტა დამაბნეველი, რადგან ახლა, 519 00:22:13,900 --> 00:22:17,250 printf აპირებს გამოჩნდება ეკრანზე, როგორც ეს გააკეთეს. x არის 1. 520 00:22:17,250 --> 00:22:18,606 >> მოდით ეს კიდევ ერთხელ გავაკეთოთ. 521 00:22:18,606 --> 00:22:20,480 და ახლა, აქ, სადაც რამ საინტერესო. 522 00:22:20,480 --> 00:22:21,580 523 00:22:21,580 --> 00:22:26,580 ადრე მოვუწოდებ Swap ან თუნდაც ნაბიჯი ეს, მოდით ცოტა peek. 524 00:22:26,580 --> 00:22:28,980 x, კიდევ ერთხელ, 1. 525 00:22:28,980 --> 00:22:33,240 Y, რა თქმა უნდა, სწრაფი საღი აზრის შეამოწმეთ, 2, ასე რომ არ არის ძნელი არსებობს. 526 00:22:33,240 --> 00:22:35,740 მაგრამ რა არის ampersand x? 527 00:22:35,740 --> 00:22:36,760 528 00:22:36,760 --> 00:22:39,350 პასუხი, ის სახის ხმაურიანი ეძებს. 529 00:22:39,350 --> 00:22:43,500 მაგრამ int ვარსკვლავი ფრჩხილებში მხოლოდ მშპ გზა ამით არის მისამართზე. 530 00:22:43,500 --> 00:22:48,290 ეს არ არის int, ეს მაჩვენებელი int, ან სხვაგვარად ცნობილია როგორც მისამართზე. 531 00:22:48,290 --> 00:22:49,742 >> რა არის ამ გიჟები რამ? 532 00:22:49,742 --> 00:22:51,825 ჩვენ არასოდეს მინახავს რაღაც საკმაოდ მომწონს, რომ ადრე. 533 00:22:51,825 --> 00:22:53,650 534 00:22:53,650 --> 00:22:58,120 ასე რომ, ეს არის მისამართი ჩემი კომპიუტერის ხსოვნას, სადაც x ხდება ცხოვრება. 535 00:22:58,120 --> 00:22:59,040 ეს Ox რაღაც. 536 00:22:59,040 --> 00:23:01,290 და ეს არის, სიმართლე გითხრათ, რატომ მე დაიწყო ხატვის ისრებით, 537 00:23:01,290 --> 00:23:03,340 ნაცვლად, რადგან, ვინც ნამდვილად ზრუნავს 538 00:23:03,340 --> 00:23:06,890 რომ თქვენი int არის ერთი კონკრეტული მისამართი აი ეს. 539 00:23:06,890 --> 00:23:12,160 მაგრამ bffff0c4, ეს არის ყველა მართლაც თექვსმეტობითი ციფრები, 540 00:23:12,160 --> 00:23:13,720 რომლებიც 0 მეშვეობით ვ. 541 00:23:13,720 --> 00:23:16,590 >> ასე რომ, ჩვენ არ ვაპირებთ, რომ არენაზე ძალიან ხანგრძლივი რა იმ რამ. 542 00:23:16,590 --> 00:23:19,400 მაგრამ თუ მე ამობეჭდოთ y, რა თქმა უნდა, ვხედავ 2. 543 00:23:19,400 --> 00:23:22,440 მაგრამ ampersand y, მე ვერ ვხედავ ამ მისამართზე. 544 00:23:22,440 --> 00:23:26,527 და შენიშნავს, რომ აინტერესებს, რამდენად შორს არის X და Y? 545 00:23:26,527 --> 00:23:27,985 თქვენ შეგიძლიათ იგნორირება ყველაზე მისამართზე. 546 00:23:27,985 --> 00:23:29,330 547 00:23:29,330 --> 00:23:29,920 ოთხი ბაიტი. 548 00:23:29,920 --> 00:23:33,510 და ეს შეესაბამება ჩვენს ადრე აცხადებენ, რომ რამდენად დიდი არის int? 549 00:23:33,510 --> 00:23:34,130 ოთხი ბაიტი. 550 00:23:34,130 --> 00:23:37,420 ასე რომ, ეს გამოიყურება ყველაფერი უგულებელყოფა up ლამაზად, როგორც თქვენ შესაძლოა, იმედი მაქვს, მეხსიერებაში. 551 00:23:37,420 --> 00:23:40,010 >> ახლა, მოდით უბრალოდ სწრაფი წინ ბოლომდე ეს ამბავი. 552 00:23:40,010 --> 00:23:43,290 მოდით წავიდეთ წინ და ტიპის ნაბიჯი, ჩაყვინთვის შევიდა swap ფუნქცია. 553 00:23:43,290 --> 00:23:46,880 ახლა შეამჩნია, თუ მე აკრიფოთ, ეს იდენტური მისამართი x. 554 00:23:46,880 --> 00:23:52,130 თუ მე აკრიფოთ b, იდენტური მისამართს y. 555 00:23:52,130 --> 00:23:57,020 რა უნდა დაინახოს, თუ ამბობენ, წავიდეს მისამართი? 556 00:23:57,020 --> 00:23:58,120 ასე ბეჭდვა ვარსკვლავი. 557 00:23:58,120 --> 00:24:00,130 ასე ვარსკვლავი იმას ნიშნავს, იქ, ამ კონტექსტში. 558 00:24:00,130 --> 00:24:02,730 Ampersand რას ნიშნავს ეს მისამართი. 559 00:24:02,730 --> 00:24:05,000 ასე ვარსკვლავი საშუალება 1. 560 00:24:05,000 --> 00:24:09,590 და ბეჭდვითი ვარსკვლავი b მაძლევს 2. 561 00:24:09,590 --> 00:24:15,750 >> და ნება მომეცით ვივარაუდოთ, ამ ეტაპზე, რომ მინიმუმ კოდი, რომელიც 562 00:24:15,750 --> 00:24:18,950 აგრძელებს შეასრულოს ახლა შეიძლება დასაბუთებული მეშვეობით, რომ გზა. 563 00:24:18,950 --> 00:24:21,150 მაგრამ ჩვენ დავუბრუნდეთ ამ იდეას ადრე ხანგრძლივი. 564 00:24:21,150 --> 00:24:23,850 ასე რომ, ეს მობილური Swap არის სწორი და საშუალებას იძლევა 565 00:24:23,850 --> 00:24:26,650 us სვოპ ამ კონკრეტულ მონაცემთა ტიპის. 566 00:24:26,650 --> 00:24:29,120 >> ასე რომ, ნებისმიერი კითხვები შემდეგ Swap? 567 00:24:29,120 --> 00:24:29,890 On ვარსკვლავი? 568 00:24:29,890 --> 00:24:30,690 On მისამართი? 569 00:24:30,690 --> 00:24:33,270 და დაინახავთ, რომელზეც პრობლემა კომპლექტი 4, სახის, 570 00:24:33,270 --> 00:24:37,310 მაგრამ პრობლემა კომპლექტი 5, აუცილებლად, თუ როგორ შეიძლება ამ რამ სასარგებლო და კიდევ უფრო მეტი 571 00:24:37,310 --> 00:24:39,584 კომფორტული მათთან, როგორც შედეგი. 572 00:24:39,584 --> 00:24:40,430 არაფერი ყველა? 573 00:24:40,430 --> 00:24:40,930 ყველა უფლება. 574 00:24:40,930 --> 00:24:44,350 ასე malloc, კიდევ ერთხელ, ამ ფუნქციის რომ უბრალოდ გამოყოფს მეხსიერება, მეხსიერება 575 00:24:44,350 --> 00:24:45,330 გამოყოფა. 576 00:24:45,330 --> 00:24:47,024 და რატომ არის ეს სასარგებლო? 577 00:24:47,024 --> 00:24:48,940 ასევე, ყველა ამ დროს, თქვენ უკვე გამოყენებით malloc. 578 00:24:48,940 --> 00:24:52,230 თუ თქვენ თვლით, ახლა როგორ getString სამუშაოები, სავარაუდოდ, ეს 579 00:24:52,230 --> 00:24:56,140 უკვე ითხოვს ვინმე ბლოკი მეხსიერება, ნებისმიერ მომხმარებლის ტიპის სიმებიანი 580 00:24:56,140 --> 00:24:59,040 , იმიტომ, რომ ჩვენ, რა თქმა არ ვიცი, რადგან CS50 პერსონალი, 581 00:24:59,040 --> 00:25:02,710 როგორ დიდი იმ strings, რომ ადამიანები ვაპირებთ აკრიფოთ შეიძლება იყოს. 582 00:25:02,710 --> 00:25:07,910 >> ასე რომ, მოდით, პირველად, დაიწყოს კანი უკან როგორ CS50 ბიბლიოთეკა სამუშაოები, 583 00:25:07,910 --> 00:25:10,990 გზით რამდენიმე მაგალითები რომელიც მიგვიყვანს იქ. 584 00:25:10,990 --> 00:25:15,300 ასე რომ, თუ მე ქმნის gedit და ქმნის scanf 0, 585 00:25:15,300 --> 00:25:17,055 ჩვენ ვაპირებთ, რომ შემდეგი კოდი. 586 00:25:17,055 --> 00:25:18,720 587 00:25:18,720 --> 00:25:23,530 Scanf 0, ხელმისაწვდომია ვებგვერდზე დღეს, შედარებით რამდენიმე ხაზი კოდი 588 00:25:23,530 --> 00:25:25,351 აქ, 14 დან 20. 589 00:25:25,351 --> 00:25:26,600 და ვნახოთ, თუ რას აკეთებს. 590 00:25:26,600 --> 00:25:28,920 იგი აცხადებს, int, მოუწოდა x. 591 00:25:28,920 --> 00:25:30,850 ის ამბობს, რომ მსგავსი რამ, ნომერი გთხოვთ. 592 00:25:30,850 --> 00:25:33,940 და ახლა ის ამბობს, scanf% i, და x. 593 00:25:33,940 --> 00:25:35,620 ასე რომ, აქ არის რამოდენიმე ახალი პერსონალის არსებობს. 594 00:25:35,620 --> 00:25:38,420 >> მაგრამ scanf, შეგიძლიათ სახის ვფიქრობ როგორც საპირისპირო printf. 595 00:25:38,420 --> 00:25:40,090 printf, რა თქმა უნდა, ბეჭდავს ეკრანზე. 596 00:25:40,090 --> 00:25:44,410 scanf სახის დაასკანირებს მომხმარებელს ს კლავიატურის რაღაც იგი აკრეფილი. 597 00:25:44,410 --> 00:25:46,550 >> % I, ისევე, როგორც printf. 598 00:25:46,550 --> 00:25:49,410 ეს იმას ნიშნავს, ველით, მომხმარებელს აკრიფოთ int. 599 00:25:49,410 --> 00:25:52,820 და ახლა, რატომ გგონიათ, რომ მე შეიძლება გავლის scanf და x? 600 00:25:52,820 --> 00:25:54,030 601 00:25:54,030 --> 00:25:57,770 თუ მიზანი ცხოვრებაში scanf არის კიდევ რაღაც, შესახებ, 602 00:25:57,770 --> 00:26:02,480 რა მნიშვნელობა აქვს გვერდის ავლით, და x, ახლა? 603 00:26:02,480 --> 00:26:02,980 ჰო? 604 00:26:02,980 --> 00:26:03,896 >> აუდიტორია: [INAUDIBLE]. 605 00:26:03,896 --> 00:26:05,540 606 00:26:05,540 --> 00:26:06,540 დევიდ ჯ Malan: ზუსტად. 607 00:26:06,540 --> 00:26:12,900 რასაც მე, ადამიანური, აკრიფოთ, ჩემი შეყვანის იქნება შენახული იყო. 608 00:26:12,900 --> 00:26:17,660 ეს არ არის საკმარისი, გავიხსენოთ, რომ მხოლოდ კორიდორი x, რადგან ჩვენ ვნახეთ უკვე, 609 00:26:17,660 --> 00:26:21,630 ნებისმიერ დროს თქვენ გაივლის, ისევე, ნედლეული ცვლადი, როგორც int, რომ ზოგიერთი სხვა ფუნქცია, 610 00:26:21,630 --> 00:26:25,640 დარწმუნებული ვარ, რომ შეიძლება შეიცვალოს, რომ ცვლადი, მაგრამ არა მუდმივად. 611 00:26:25,640 --> 00:26:27,360 მას არ შეუძლია ჰქონდეს ეფექტი მთავარი. 612 00:26:27,360 --> 00:26:29,420 ეს შეიძლება მხოლოდ შეცვალოს თავისი ადგილობრივი ასლი. 613 00:26:29,420 --> 00:26:32,560 მაგრამ თუ, ნაცვლად, თქვენ არ მომეცი ფაქტობრივი int, 614 00:26:32,560 --> 00:26:36,640 მაგრამ მომეცი მიმართულებით რომ int, ახლა, როგორც scanf, 615 00:26:36,640 --> 00:26:41,050 რა თქმა უნდა, შემიძლია, რომ მისამართი და დააყენა მთელი რიგი არსებობს 616 00:26:41,050 --> 00:26:43,280 ასე, რომ თქვენ გაქვთ ის, ისევე. 617 00:26:43,280 --> 00:26:45,120 >> ასე რომ, როდესაც მე აწარმოებს ამ პროგრამის, ვნახოთ. 618 00:26:45,120 --> 00:26:49,660 რათა scanf 0 dot ხაზი, scanf 0. 619 00:26:49,660 --> 00:26:54,030 და თუ ახლა აკრიფოთ ნომერი 50, მადლობა 50. 620 00:26:54,030 --> 00:26:58,150 თუ მე ახლა აკრიფოთ ნომერი ასე უარყოფითი 1, უარყოფითი 1. 621 00:26:58,150 --> 00:27:04,200 მე ახლა აკრიფოთ ნომერი ასე 1.5, hm. 622 00:27:04,200 --> 00:27:06,030 რატომ ჩემი პროგრამა იგნორირება ჩემთვის? 623 00:27:06,030 --> 00:27:07,300 624 00:27:07,300 --> 00:27:09,880 ასევე, იმის გამო, უბრალოდ, ვუთხარი, ის უნდა ველოდოთ int მხოლოდ. 625 00:27:09,880 --> 00:27:10,380 ყველა უფლება. 626 00:27:10,380 --> 00:27:11,630 ისე, რომ ერთი ვერსია ამ. 627 00:27:11,630 --> 00:27:16,600 ავიღოთ რამ up მაღალი დონის და ვთავაზობ, რომ ეს არ არის კარგი. 628 00:27:16,600 --> 00:27:20,530 და აქ დევს ძალიან მარტივი მაგალითი როგორ შეიძლება დავიწყო წერა კოდი 629 00:27:20,530 --> 00:27:24,450 რომ სხვა ადამიანების ექსპლუატაცია და კომპრომისზე ცუდად იქცეოდა. 630 00:27:24,450 --> 00:27:28,336 ასე რომ, ხაზი 16, იმდენად მსგავსია სულითა ადრე, 631 00:27:28,336 --> 00:27:29,960 მაგრამ მე არ გამოცხადების ეს int ამ დროს. 632 00:27:29,960 --> 00:27:32,970 მე გამოცხადების ეს char ვარსკვლავი, aka სიმებიანი. 633 00:27:32,970 --> 00:27:35,190 >> მაგრამ რას ნიშნავს, ნამდვილად? 634 00:27:35,190 --> 00:27:38,790 ასე რომ, თუ მე არ დააკონკრეტა address-- და მე ამას თვითნებურად, ბუფერული, 635 00:27:38,790 --> 00:27:43,370 მაგრამ მე ვერ ეძახით s, უნდა იყოს simple-- და მაშინ მე ამის გაკეთება, ახსნას ჩემთვის, 636 00:27:43,370 --> 00:27:48,630 თუ შეიძლება, ეფუძნება წინა ლოგიკით, თუ რა არის scanf აკეთებს ხაზი 18, 637 00:27:48,630 --> 00:27:55,000 თუ უღელტეხილზე% s და ბუფერული, რომელიც არის მისამართი? 638 00:27:55,000 --> 00:27:58,210 რა არის scanf, თუ ვრცელდება ზუსტად იგივე ლოგიკა, როგორც მობილური: 0, 639 00:27:58,210 --> 00:28:00,640 იმის გამო, აქ, როდესაც მომხმარებლის ტიპის რაღაც? 640 00:28:00,640 --> 00:28:02,630 641 00:28:02,630 --> 00:28:03,409 ჰო? 642 00:28:03,409 --> 00:28:04,407 >> აუდიტორია: [INAUDIBLE]. 643 00:28:04,407 --> 00:28:07,401 644 00:28:07,401 --> 00:28:08,890 >> დევიდ ჯ Malan: ზუსტად. 645 00:28:08,890 --> 00:28:11,577 Scanf, ლოგიკა ადრე, აპირებს მიიღოს სიმებიანი 646 00:28:11,577 --> 00:28:13,410 რომ ადამიანის აკრეფილი in-- ეს არის ტექსტი, 647 00:28:13,410 --> 00:28:15,790 ეს არ არის ნომერი, სავარაუდოდ, თუ იგი cooperates-- 648 00:28:15,790 --> 00:28:19,310 და ის აპირებს ცდილობენ დააყენა, რომ სიმებიანი მეხსიერებაში რასაც მისამართი 649 00:28:19,310 --> 00:28:20,340 ბუფერული განსაზღვრავს. 650 00:28:20,340 --> 00:28:23,870 და ეს არის დიდი იმის გამო, რომ ბუფერული მართლაც ნიშნავს, რომ მისამართზე. 651 00:28:23,870 --> 00:28:30,470 >> მაგრამ აცხადებენ, რომ ამ პროგრამის buggy წელს ძალიან სერიოზული გზა, რადგან ის, რაც არც 652 00:28:30,470 --> 00:28:31,330 ბუფერული იყოს? 653 00:28:31,330 --> 00:28:33,380 654 00:28:33,380 --> 00:28:34,790 რა არ მინდა ინიციალიზაცია შევიდა? 655 00:28:34,790 --> 00:28:35,770 რა ბლოკი მეხსიერება? 656 00:28:35,770 --> 00:28:37,480 657 00:28:37,480 --> 00:28:38,620 მე არ, არა? 658 00:28:38,620 --> 00:28:42,265 >> ასე რომ, მიუხედავად იმისა, რომ მე გამოყოფილი char ვარსკვლავი, რომ აღარ მოუწოდა s, 659 00:28:42,265 --> 00:28:48,030 ის სანაცვლოდ მოუწოდა, buffer-- ასე მოდით დავხატოთ ცვლადი სახელი 660 00:28:48,030 --> 00:28:53,380 ახლა, როგორც buffer-- თუ მე არ მოუწოდა GetString ან malloc აქ, 661 00:28:53,380 --> 00:28:56,030 რომ იმას ნიშნავს, რომ ბუფერული მხოლოდ ზოგიერთი ნაგვის ღირებულება. 662 00:28:56,030 --> 00:28:57,030 >> ახლა რას ნიშნავს ეს? 663 00:28:57,030 --> 00:29:00,220 ეს ნიშნავს, რომ მე ვუთხარი scanf ველოდოთ string საწყისი მომხმარებელს. 664 00:29:00,220 --> 00:29:01,300 და იცით რა? 665 00:29:01,300 --> 00:29:03,883 რაც არ უნდა იყოს იმაზე მიუთითებს, რომელთა მიზანია და მე მიაპყროს კითხვის ნიშნის, 666 00:29:03,883 --> 00:29:07,060 მაგრამ სინამდვილეში, ეს იქნება რაღაც OX1, 2, 3, არა? 667 00:29:07,060 --> 00:29:10,730 ეს რაღაც ყალბი მნიშვნელობა, რომელიც მხოლოდ ხდება იქ ადრე. 668 00:29:10,730 --> 00:29:13,440 ასე რომ, კიდევ ერთი გზა, , თითქოს ბუფერული მხოლოდ 669 00:29:13,440 --> 00:29:16,180 მიუთითებს რაღაც მეხსიერებაში. 670 00:29:16,180 --> 00:29:17,610 მე არ ვიცი, რა. 671 00:29:17,610 --> 00:29:24,130 >> ასე რომ, თუ მე აკრიფოთ Gabe ახლა, ის აპირებს ვცდილობ g-a-b-e / 0 იქ. 672 00:29:24,130 --> 00:29:25,530 მაგრამ ვინ იცის რა, რომ არის? 673 00:29:25,530 --> 00:29:27,480 და წარსულში, ნებისმიერი დროს, ჩვენ შევეცადეთ შეეხოთ 674 00:29:27,480 --> 00:29:29,770 მეხსიერება, რომელიც არ განეკუთვნება ჩვენთვის, თუ რა მოხდა? 675 00:29:29,770 --> 00:29:31,020 676 00:29:31,020 --> 00:29:32,870 ან თითქმის ყოველ ჯერზე. 677 00:29:32,870 --> 00:29:34,310 სეგმენტაცია ბრალია, არა? 678 00:29:34,310 --> 00:29:37,829 >> ეს ისარი, მე არ ვიცი, სადაც ეს მიუთითებს. ეს მხოლოდ შემთხვევითი ღირებულება. 679 00:29:37,829 --> 00:29:40,370 და რა თქმა უნდა, თუ ინტერპრეტაცია შემთხვევითი არც როგორც მისამართი, 680 00:29:40,370 --> 00:29:42,610 თქვენ აპირებს მისვლას შემთხვევითი დანიშნულების. 681 00:29:42,610 --> 00:29:46,810 ასე რომ, Gabe შეიძლება მართლაც crash ჩემი პროგრამა, ამ შემთხვევაში აქ. 682 00:29:46,810 --> 00:29:50,600 >> რა უნდა გააკეთოთ, რომ თითქმის როგორც ცუდი? 683 00:29:50,600 --> 00:29:52,660 მიგვაჩნია, რომ ეს მესამე და საბოლოო მაგალითია scanf. 684 00:29:52,660 --> 00:29:53,890 685 00:29:53,890 --> 00:29:56,870 ეს ვერსია უკეთესია, რა გაგებით? 686 00:29:56,870 --> 00:29:57,990 687 00:29:57,990 --> 00:30:01,400 თუ თქვენ კომფორტულად წინა პრობლემა, ეს არის უკეთესი. 688 00:30:01,400 --> 00:30:02,250 რატომ? 689 00:30:02,250 --> 00:30:03,250 >> აუდიტორია: [INAUDIBLE]. 690 00:30:03,250 --> 00:30:06,235 691 00:30:06,235 --> 00:30:07,110 დევიდ ჯ Malan: კარგი. 692 00:30:07,110 --> 00:30:09,970 ასე რომ, ამ შემთხვევაში line 16 უკეთესია, იმ გაგებით, 693 00:30:09,970 --> 00:30:12,030 რომ ჩვენ მკაფიოდ გამოყოფის ზოგიერთი მეხსიერება. 694 00:30:12,030 --> 00:30:14,190 ჩვენ არ იყენებს malloc, ჩვენ გამოყენებით week 2 695 00:30:14,190 --> 00:30:16,060 მიდგომა მხოლოდ გამოცხადების მასივი. 696 00:30:16,060 --> 00:30:18,130 და ჩვენ დაწყებამდე განაცხადა, რომ ტექსტი მხოლოდ მასივი გმირები, 697 00:30:18,130 --> 00:30:19,690 ასე რომ ეს არის სრულიად ლეგიტიმური. 698 00:30:19,690 --> 00:30:22,910 მაგრამ ეს, რა თქმა უნდა, თქვენ აღვნიშნო, ფიქსირებული ზომა, 16. 699 00:30:22,910 --> 00:30:25,440 >> ასე რომ ამ პროგრამის სრულიად უსაფრთხო, თუ მე აკრიფოთ 700 00:30:25,440 --> 00:30:29,760 ერთი ხასიათის სტრიქონები, ორი ხასიათი strings, 15 ხასიათის სტრიქონები. 701 00:30:29,760 --> 00:30:34,970 მაგრამ როგორც კი დაიწყება აკრეფით 16, 17, 18, 1000 ხასიათის სტრიქონები, 702 00:30:34,970 --> 00:30:37,390 არის ის, რომ სიმებიანი აპირებს დასრულდება up? 703 00:30:37,390 --> 00:30:39,570 ის აპირებს დასრულდება მდე ნაწილობრივ აქ. 704 00:30:39,570 --> 00:30:42,820 მაგრამ მაშინ ვინ იცის, რა არის საზღვრებს გარეთ 705 00:30:42,820 --> 00:30:44,270 ამ კონკრეტულ მასივი? 706 00:30:44,270 --> 00:30:48,015 >> ეს თითქოს მე განაცხადა 16 ყუთები აქ. 707 00:30:48,015 --> 00:30:49,300 708 00:30:49,300 --> 00:30:52,690 ასე რომ, ვიდრე გამოიყენოს ყველა 16, ჩვენ გამოგიგზავნით უბრალოდ ვიტყვი, რომ მე შედგენილი 16. 709 00:30:52,690 --> 00:30:56,540 მაგრამ თუ მაშინ ცდილობენ წაიკითხონ სიმებიანი რომ არის ბევრად უფრო, 50 პერსონაჟი, 710 00:30:56,540 --> 00:31:01,270 მე ვაპირებ დაიწყება აყენებს a, b, c, d, x, y, z. 711 00:31:01,270 --> 00:31:04,916 და ეს, სავარაუდოდ, ზოგიერთი სხვა მეხსიერების სეგმენტი 712 00:31:04,916 --> 00:31:06,790 , კიდევ ერთხელ, შეიძლება გამოიწვიოს ჩემი პროგრამის მისაწოდებლად, 713 00:31:06,790 --> 00:31:10,600 იმიტომ, რომ მე არ სთხოვა არაფერი მეტი, ვიდრე უბრალოდ 16 ბაიტი. 714 00:31:10,600 --> 00:31:12,260 >> ვინ ზრუნავს? 715 00:31:12,260 --> 00:31:13,880 ისე, აქ CS50 ბიბლიოთეკაში. 716 00:31:13,880 --> 00:31:17,220 და ყველაზე მეტად ეს მხოლოდ როგორიცაა ინსტრუქციები up დაბრუნება. 717 00:31:17,220 --> 00:31:21,670 CS50 ბიბლიოთეკა, ყველა ამ დროს, ჰქონდა ეს ხაზი line 52. 718 00:31:21,670 --> 00:31:23,680 ჩვენ ვნახეთ typedef, ან თქვენ ნახავთ, typedef 719 00:31:23,680 --> 00:31:27,930 pset 4, რომელიც მხოლოდ ქმნის სინონიმი, რომლის char ვარსკვლავი შეიძლება იყოს უფრო 720 00:31:27,930 --> 00:31:29,290 უბრალოდ იწოდებიან, როგორც სიმებიანი. 721 00:31:29,290 --> 00:31:31,540 ასე რომ, ეს არის ერთ ერთი ყველაზე რამდენიმე სასწავლო დისკები 722 00:31:31,540 --> 00:31:34,120 ჩვენ გამოიყენება ფარულად ქვეშ hood. 723 00:31:34,120 --> 00:31:36,490 >> იმავდროულად, აქ ფუნქცია, getchar. 724 00:31:36,490 --> 00:31:38,190 ახლა, როგორც ჩანს, არ არსებობს ორგანო, რომელიც მას. 725 00:31:38,190 --> 00:31:40,273 და რეალურად, თუ მე შენარჩუნება სენსორული, მე არ რეალურად 726 00:31:40,273 --> 00:31:42,080 ხედავთ რაიმე შესრულება ეს ფუნქციები. 727 00:31:42,080 --> 00:31:43,140 728 00:31:43,140 --> 00:31:45,516 როგორც საღი აზრის შემოწმება, თუ რატომ არის, რომ? 729 00:31:45,516 --> 00:31:46,795 >> აუდიტორია: [INAUDIBLE]. 730 00:31:46,795 --> 00:31:47,670 დევიდ ჯ Malan: ჰო. 731 00:31:47,670 --> 00:31:48,950 ასე რომ, ეს არის header ფაილი. 732 00:31:48,950 --> 00:31:52,520 და header ფაილი შეიცავს პროტოტიპები, ასევე რამდენიმე სხვა პერსონალი, როგორც ჩანს, 733 00:31:52,520 --> 00:31:53,780 როგორიცაა typedefs. 734 00:31:53,780 --> 00:31:56,910 მაგრამ CS50.c, რომელიც ჩვენ არ მოგცათ აშკარა, 735 00:31:56,910 --> 00:32:02,100 მაგრამ უკვე CS50 ელექტრო მოწყობილობების ყველა ამ დროს, ღრმა შიგნით მისი ფოლდერები, 736 00:32:02,100 --> 00:32:04,990 შეამჩნია, რომ არსებობს მთელი bunch of ფუნქციები აქ. 737 00:32:04,990 --> 00:32:06,720 >> ფაქტობრივად, მოდით გადახვევა ქვემოთ. 738 00:32:06,720 --> 00:32:08,810 მოდით იგნორირება მათი უმრავლესობა, ახლა. 739 00:32:08,810 --> 00:32:12,670 მაგრამ გადახვევა ქვემოთ getInt და ვნახოთ, როგორ getInt მუშაობს. 740 00:32:12,670 --> 00:32:13,890 ასე რომ, აქ არის getInt. 741 00:32:13,890 --> 00:32:17,727 და თუ თქვენ ოდესმე ნამდვილად ზრუნავენ, თუ როგორ მიიღონ int მუშაობს, აქ არის მისი დოკუმენტაცია. 742 00:32:17,727 --> 00:32:19,560 და მათ შორის რამ ის ამბობს, რომ ის გიჩვენებთ 743 00:32:19,560 --> 00:32:21,340 რა მერყეობს ღირებულებები მას შეუძლია დაბრუნდეს. 744 00:32:21,340 --> 00:32:24,400 ეს არსებითად უარყოფითი 2 მილიარდი დადებითი 2 მილიარდი, მისცეს ან მიიღოს. 745 00:32:24,400 --> 00:32:26,420 >> და თურმე, ეს ყველაფერი დროს, მიუხედავად იმისა, რომ ჩვენ არასდროს 746 00:32:26,420 --> 00:32:28,570 რომ თქვენ შეამოწმოთ ეს, თუ რაღაც მიდის არასწორი, 747 00:32:28,570 --> 00:32:30,680 გამოდის, რომ ყველა ამ დროს, getInt აქვს 748 00:32:30,680 --> 00:32:33,600 უკვე დაბრუნების სპეციალური მუდმივი, არ null, 749 00:32:33,600 --> 00:32:36,760 არამედ INT_MAX, რომელიც უბრალოდ პროგრამისტი ის კონვენციას. 750 00:32:36,760 --> 00:32:38,846 ეს იმას ნიშნავს, რომ აქ არის განსაკუთრებული მნიშვნელობა. 751 00:32:38,846 --> 00:32:41,470 შეამოწმეთ ეს, უბრალოდ იმ შემთხვევაში, თუ რაღაც მიდის არასწორი. 752 00:32:41,470 --> 00:32:43,261 მაგრამ ჩვენ არ აწუხებს რომ დღემდე, 753 00:32:43,261 --> 00:32:45,200 იმიტომ, რომ კიდევ ერთხელ, იგულისხმება, რომ გამარტივდეს. 754 00:32:45,200 --> 00:32:46,950 >> მაგრამ, როგორ getInt მისაღებად განხორციელებული? 755 00:32:46,950 --> 00:32:48,450 ასევე, ერთი, მას სჭირდება არანაირი არგუმენტი. 756 00:32:48,450 --> 00:32:49,390 ჩვენ ვიცით, რომ. 757 00:32:49,390 --> 00:32:50,820 ის დააბრუნებს int. 758 00:32:50,820 --> 00:32:51,950 ჩვენ ვიცით, რომ. 759 00:32:51,950 --> 00:32:54,460 ასე რომ, როგორ მუშაობს იგი ქვეშ hood? 760 00:32:54,460 --> 00:32:58,290 >> ასე არ არის, როგორც ჩანს, უსასრულო loop, მინიმუმ გამოჩენა ერთი. 761 00:32:58,290 --> 00:33:00,290 გაითვალისწინეთ, რომ ჩვენ გამოყენებით getString. 762 00:33:00,290 --> 00:33:04,000 ასე, რომ საინტერესოა. getInt მოუწოდებს ჩვენი საკუთარი ფუნქცია, getString. 763 00:33:04,000 --> 00:33:05,645 და ახლა რატომ შეიძლება იყოს ამ შემთხვევაში? 764 00:33:05,645 --> 00:33:07,400 765 00:33:07,400 --> 00:33:09,842 რატომ ვარ მე თავდაცვითი აქ ხაზი 165? 766 00:33:09,842 --> 00:33:11,390 767 00:33:11,390 --> 00:33:15,639 რა შეიძლება მოხდეს ხაზი 164, უბრალოდ უნდა იყოს წმინდა? 768 00:33:15,639 --> 00:33:16,930 ეს არის იგივე პასუხი, როგორც ადრე. 769 00:33:16,930 --> 00:33:18,660 770 00:33:18,660 --> 00:33:20,089 შეიძლება უბრალოდ მეხსიერება ღალატობს. 771 00:33:20,089 --> 00:33:23,130 რაღაც მიდის არასწორი getString, ჩვენ მივიღეთ შეძლებს გაუმკლავდეს, რომ. 772 00:33:23,130 --> 00:33:27,070 და მიზეზი მე არ ბრუნდება null არის რომ ტექნიკურად null მაჩვენებელი. 773 00:33:27,070 --> 00:33:29,120 getInt დააბრუნებს int. 774 00:33:29,120 --> 00:33:31,060 ასე რომ მე თვითნებურად გადაწყვიტა, არსებითად, 775 00:33:31,060 --> 00:33:34,600 რომ 2 მილიარდი, მისცეს ან მიიღოს, აპირებს უნდა იყოს განსაკუთრებული მნიშვნელობა, რომ მე ვერასოდეს 776 00:33:34,600 --> 00:33:35,970 რეალურად მიიღონ შესახებ. 777 00:33:35,970 --> 00:33:39,930 ეს მხოლოდ ერთი მნიშვნელობა, მე ვაპირებ დაგვრჩა წარმოადგენენ შეცდომის კოდი. 778 00:33:39,930 --> 00:33:41,540 >> ასე რომ, ახლა რამ კიდევ პატარა ლამაზი. 779 00:33:41,540 --> 00:33:44,670 და ეს არ არის იგივე ფუნქცია როგორც ადრე, მაგრამ ეს ძალიან ჰგავს. 780 00:33:44,670 --> 00:33:50,120 ასე რომ შეამჩნია, ვაცხადებ, აქ, ხაზი 172, როგორც int n და char c. 781 00:33:50,120 --> 00:33:53,600 და შემდეგ გამოვიყენო ეს ხმაურიანი ხაზი, sscanf, რომელიც თურმე 782 00:33:53,600 --> 00:33:55,990 არ სკანირების სიმებიანი კლავიატურის. 783 00:33:55,990 --> 00:33:59,226 იგი დგას არსებული სიმებიანი მომხმარებლის უკვე აკრეფილი. 784 00:33:59,226 --> 00:34:02,100 ასე რომ, მე უკვე მოუწოდა getString, რომელიც იმას ნიშნავს, რომ სიმებიანი მეხსიერებაში. 785 00:34:02,100 --> 00:34:05,020 sscanf არის ის, რაც ნეტავ მოვუწოდებთ parsing ფუნქცია. 786 00:34:05,020 --> 00:34:07,760 ის უყურებს string მე აკრეფილი, ხასიათი ხასიათი, 787 00:34:07,760 --> 00:34:09,250 და აკეთებს რაღაც სასარგებლო. 788 00:34:09,250 --> 00:34:10,969 რომ სიმებიანი ინახება ონლაინ. 789 00:34:10,969 --> 00:34:13,560 და მე ვიცი, რომ მხოლოდ აპირებს უკან აქ და ამბობდა, რა, OK, 790 00:34:13,560 --> 00:34:15,143 მე მას არ არის ეს დრო, მაგრამ ონლაინ. 791 00:34:15,143 --> 00:34:15,989 792 00:34:15,989 --> 00:34:18,080 >> და ახლა ეს ცოტა განსხვავებული. 793 00:34:18,080 --> 00:34:22,480 მაგრამ ეს იმას ნიშნავს, რომ, იმის გამო, ჩვენ გარკვეულწილად ტალღა ჩვენს ხელში დღეს, 794 00:34:22,480 --> 00:34:26,070 რომ ჩვენ შემოწმების თუ მომხმარებლის აკრეფილი 795 00:34:26,070 --> 00:34:29,909 და int და შესაძლოა კიდევ ხასიათი. 796 00:34:29,909 --> 00:34:33,610 თუ მომხმარებლის აკრეფილი int, ეს იქნება შენახული n, რადგან მე ვარ 797 00:34:33,610 --> 00:34:36,739 ჩაბარების ამ მისამართზე, ახალი ხრიკი ჩვენ ვნახეთ დღეს. 798 00:34:36,739 --> 00:34:41,570 თუ მომხმარებელს ასევე აკრეფილი მსგავსად 123x, რომ x 799 00:34:41,570 --> 00:34:45,060 აპირებს დასრულდება მდე წერილი ხასიათი c. 800 00:34:45,060 --> 00:34:48,739 >> ახლა ირკვევა, რომ sscanf იქნება მითხრათ, ჭკვიანურად, 801 00:34:48,739 --> 00:34:54,750 რამდენი ცვლადები იყო sscanf წარმატებით შეუძლია შეავსოს. 802 00:34:54,750 --> 00:34:58,770 ასე რომ, ამ ლოგიკით, თუ ფუნქცია მე განხორციელების არის getInt, 803 00:34:58,770 --> 00:35:00,900 მაგრამ მე შემოწმების, პოტენციურად, რომ შესახებ 804 00:35:00,900 --> 00:35:04,190 არ აკრეფილი int მოყვება რაღაც, 805 00:35:04,190 --> 00:35:08,580 რა მინდა sscanf მიერ დაბრუნების ღირებულება ნამდვილად უნდა იყოს? 806 00:35:08,580 --> 00:35:10,950 თუ მიზანი არის მიიღონ უბრალოდ int საწყისი ხარ? 807 00:35:10,950 --> 00:35:13,980 808 00:35:13,980 --> 00:35:19,300 >> ასე რომ, თუ sscanf ბრუნდება 2, რას ნიშნავს ეს? 809 00:35:19,300 --> 00:35:21,660 მომხმარებლის აკრეფილი რაღაც, ფაქტიურად, 810 00:35:21,660 --> 00:35:24,770 123x, რომელიც უბრალოდ სისულელეა. 811 00:35:24,770 --> 00:35:27,490 ეს შეცდომა მდგომარეობაში და მინდა შევამოწმო რომ. 812 00:35:27,490 --> 00:35:32,960 >> ასე რომ, თუ მომხმარებელი სახის ეს, მიერ ამ ლოგიკით, რას sscanf დაბრუნებას, 813 00:35:32,960 --> 00:35:33,740 იტყვით? 814 00:35:33,740 --> 00:35:35,070 815 00:35:35,070 --> 00:35:39,130 ასე რომ დაბრუნებას აპირებს 2, იმიტომ, 123 აპირებს წასვლა აქ 816 00:35:39,130 --> 00:35:41,580 და x აპირებს დასრულდება up in აქ. 817 00:35:41,580 --> 00:35:43,970 მაგრამ მე არ მინდა, რომ x უნდა შეივსოს. 818 00:35:43,970 --> 00:35:48,580 მინდა sscanf მხოლოდ წარმატების შევსების პირველი ცვლადები. 819 00:35:48,580 --> 00:35:52,490 და ამიტომაც მე მინდა sscanf დაბრუნების 1. 820 00:35:52,490 --> 00:35:55,750 >> და თუ ეს არის ცოტა მეტი ხელმძღვანელი ამ ეტაპზე, რომ მთლიანად ჯარიმა. 821 00:35:55,750 --> 00:36:00,030 გააცნობიეროს, მიუხედავად იმისა, რომ ერთი ღირებულებები getInt და getString 822 00:36:00,030 --> 00:36:03,630 არის, რომ ჩვენ ვაკეთებთ heck საქართველოს ბევრი შეცდომა შემოწმების მოსწონს ეს ასე 823 00:36:03,630 --> 00:36:07,130 რომ, დღემდე, თქვენ შეგიძლიათ საკმაოდ ბევრი აკრიფოთ არაფერი თქვენს კლავიატურაზე, 824 00:36:07,130 --> 00:36:08,490 და ჩვენ დაიჭიროთ იგი. 825 00:36:08,490 --> 00:36:10,592 და ჩვენ რა თქმა უნდა, პერსონალი, არავითარ შემთხვევაში არ 826 00:36:10,592 --> 00:36:13,300 იყოს წყარო bug თქვენს პროგრამა, რადგან ჩვენ დაცვითი 827 00:36:13,300 --> 00:36:16,270 შემოწმების ყველა სულელური რამ, რომ შესახებ შეიძლება გავაკეთოთ, 828 00:36:16,270 --> 00:36:18,900 როგორიცაა აკრეფით ტექსტი, როდესაც თქვენ ნამდვილად სურდა int. 829 00:36:18,900 --> 00:36:21,350 ასე რომ, ახლა ჩვენ მოვალთ თავში ეს ადრე long-- 830 00:36:21,350 --> 00:36:23,710 მაგრამ ამ დროს, getString და getInt აქვს 831 00:36:23,710 --> 00:36:29,950 უკვე ქვეშ hood გამოყენებით ამ ძირითადი იდეა მისამართები მეხსიერება. 832 00:36:29,950 --> 00:36:32,580 >> ახლა, მოდით, რათა რამ ცოტა უფრო მოსახერხებელი. 833 00:36:32,580 --> 00:36:38,740 როგორც გახსოვთ, საწყისი Binky ბოლო time-- თუ ჩემი მაუსის cooperate-- ასე 834 00:36:38,740 --> 00:36:42,560 ჩვენ გვქონდა ამ კოდი, რაც გულწრფელად ვამბობ, საკმაოდ აბსურდული. 835 00:36:42,560 --> 00:36:45,330 ეს კოდი აღწევს არაფერი სასარგებლო, მაგრამ ეს იყო, მაგალითად 836 00:36:45,330 --> 00:36:48,330 რომ პროფესორი Parlante გამოიყენება იმისათვის, რომ წარმოადგენს 837 00:36:48,330 --> 00:36:51,840 რა ხდებოდა პროგრამა მოიცავს მეხსიერებაში. 838 00:36:51,840 --> 00:36:54,850 >> ასე რომ, მოდით მოგითხროთ ამ ამბავი სუპერ მოკლედ. 839 00:36:54,850 --> 00:36:58,720 პირველი ორი ხაზები, ინგლისური, რა, იტყვით? 840 00:36:58,720 --> 00:37:01,230 841 00:37:01,230 --> 00:37:05,430 უბრალოდ გონივრულად ადამიანის, მაგრამ ოდნავ ტექნიკური თვალსაზრისით, მიიღოს stab. 842 00:37:05,430 --> 00:37:06,346 აუდიტორია: [INAUDIBLE]. 843 00:37:06,346 --> 00:37:07,705 844 00:37:07,705 --> 00:37:11,080 >> დევიდ ჯ Malan: OK, თქვენ შექმნის მისამართები თქვენი x და y ცვლადები. 845 00:37:11,080 --> 00:37:15,520 არ საკმაოდ, რადგან x და y არ არის ცვლადები ტრადიციული გაგებით. 846 00:37:15,520 --> 00:37:18,054 x და y მისამართები ან შესანახად მისამართზე. 847 00:37:18,054 --> 00:37:19,220 მოდით ცდილობენ ამ კიდევ ერთხელ. 848 00:37:19,220 --> 00:37:21,010 არ არის ცუდი დასაწყისია, თუმცა. 849 00:37:21,010 --> 00:37:21,510 ჰო? 850 00:37:21,510 --> 00:37:22,426 >> აუდიტორია: [INAUDIBLE]. 851 00:37:22,426 --> 00:37:23,966 852 00:37:23,966 --> 00:37:24,840 დევიდ ჯ Malan: კარგი. 853 00:37:24,840 --> 00:37:26,173 მე ვფიქრობ, რომ ცოტა სუფთა. 854 00:37:26,173 --> 00:37:28,630 გამოცხადების ორი პოინტერები, ორი რიცხვებით. 855 00:37:28,630 --> 00:37:30,150 და ჩვენ მოუწოდებდა მათ x და y. 856 00:37:30,150 --> 00:37:32,790 ან თუ ჩვენ მიაპყროს ამ სურათის, კიდევ ერთხელ, 857 00:37:32,790 --> 00:37:36,410 გავიხსენოთ, უბრალოდ, რომ ყველა რას ვაკეთებთ, რომ პირველ ხაზზე 858 00:37:36,410 --> 00:37:39,690 ხატვის ყუთი, როგორც ეს, ზოგიერთი ნაგვის ღირებულება ის, 859 00:37:39,690 --> 00:37:41,920 და უწოდა x, და მაშინ ერთ ყუთში, როგორც ეს, 860 00:37:41,920 --> 00:37:43,880 ზოგიერთი ნაგვის ღირებულება ეს უწოდა y. 861 00:37:43,880 --> 00:37:45,810 ჩვენ განაცხადა, ორი მითითებას, რომ, საბოლოო ჯამში, 862 00:37:45,810 --> 00:37:47,860 შესანახად მისამართი int. 863 00:37:47,860 --> 00:37:49,170 ასე რომ, ეს ყველაფერი არსებობს. 864 00:37:49,170 --> 00:37:53,290 >> ასე რომ, როდესაც Binky ეს გავაკეთეთ, თიხის უბრალოდ ჩანდა მოსწონს ეს. 865 00:37:53,290 --> 00:37:55,350 და ნიკა მხოლოდ სახის დაასრულა ისრებით, 866 00:37:55,350 --> 00:37:57,590 როგორც იმისა, რომ ისინი არ მიუთითებს სადმე კერძოდ, რადგან ისინი უბრალოდ 867 00:37:57,590 --> 00:37:58,250 ნაგვის ღირებულებებს. 868 00:37:58,250 --> 00:38:01,670 ისინი არ არის მკაფიოდ ინიციალიზაცია სადმე კერძოდ. 869 00:38:01,670 --> 00:38:03,980 >> ახლა მომდევნო ხაზი კოდი, გაწვევა, სწორედ ეს იყო. 870 00:38:03,980 --> 00:38:07,510 ასე რომ, გონივრულად, მოსახერხებელი, მაგრამ ცოტა ტექნიკური ინგლისური, 871 00:38:07,510 --> 00:38:09,790 რა არის ეს ხაზი კოდი აკეთებს? 872 00:38:09,790 --> 00:38:10,391 ჰო? 873 00:38:10,391 --> 00:38:11,333 >> აუდიტორია: [INAUDIBLE]. 874 00:38:11,333 --> 00:38:12,746 875 00:38:12,746 --> 00:38:13,950 >> დევიდ ჯ Malan: Perfect. 876 00:38:13,950 --> 00:38:17,016 ის გამოყოფის ბლოკი მეხსიერება რომ ზომა int. 877 00:38:17,016 --> 00:38:18,140 და რომ ნახევარი პასუხი. 878 00:38:18,140 --> 00:38:20,056 თქვენ უპასუხა უფლება ნახევარი გამოხატულება. 879 00:38:20,056 --> 00:38:22,473 რა ხდება მარცხენა მხარეს თანაბარი ნიშანი? 880 00:38:22,473 --> 00:38:22,972 ჰო? 881 00:38:22,972 --> 00:38:24,814 აუდიტორია: და ასიგნებების ეს ცვლადი x? 882 00:38:24,814 --> 00:38:27,690 >> დევიდ ჯ Malan: ანიჭებს ეს ცვლადი x. 883 00:38:27,690 --> 00:38:31,650 ასე რომ recap, მარჯვენა მხარეს გამოყოფს საკმარისი მეხსიერების შესანახად int. 884 00:38:31,650 --> 00:38:34,150 მაგრამ malloc კონკრეტულად დააბრუნებს მისამართი 885 00:38:34,150 --> 00:38:37,270 რომ ბლოკი მეხსიერება, რომელიც თქვენ მხოლოდ შემოთავაზებული იღებს შენახული x. 886 00:38:37,270 --> 00:38:42,560 >> ასე რომ, რა Nick გავაკეთეთ ბოლო დროის Binky არის იგი გაიწელა, რომ მაჩვენებელი გარეთ, თიხა, 887 00:38:42,560 --> 00:38:46,820 უნდა აღვნიშნო, ახლა თეთრ ბლოკი მეხსიერება რომ არის თანაბარი ზომის int. 888 00:38:46,820 --> 00:38:49,360 და მართლაც, რომ ნიშნავდა to წარმოადგენს ოთხი ბაიტი. 889 00:38:49,360 --> 00:38:55,310 >> ახლა, მომდევნო ხაზი კოდი ეს, ვარსკვლავი x იღებს 42. 890 00:38:55,310 --> 00:38:58,530 ასე რომ 42 არის უშუალო შესახებ მარჯვენა მხარეს, მნიშვნელობა ცხოვრებაში. 891 00:38:58,530 --> 00:39:00,500 მარცხენა მხარეს, ვარსკვლავი x რას ნიშნავს? 892 00:39:00,500 --> 00:39:01,600 893 00:39:01,600 --> 00:39:03,280 რომ ძალიან შეიძლება ჰქონდეს gone-- რომ კარგადაა. 894 00:39:03,280 --> 00:39:04,220 OK. 895 00:39:04,220 --> 00:39:06,875 >> აუდიტორია: ძირითადად, წასვლა [INAUDIBLE] 896 00:39:06,875 --> 00:39:07,750 დევიდ ჯ Malan: კარგი. 897 00:39:07,750 --> 00:39:08,760 აუდიტორია: [INAUDIBLE]. 898 00:39:08,760 --> 00:39:09,760 დევიდ ჯ Malan: ზუსტად. 899 00:39:09,760 --> 00:39:11,979 მარცხენა მხარეს ნიშნავს წასვლა x. 900 00:39:11,979 --> 00:39:12,520 x არის მისამართი. 901 00:39:12,520 --> 00:39:15,520 ეს იგივეა, რომ 33 Oxford Street, ან OX1. 902 00:39:15,520 --> 00:39:18,690 და ვარსკვლავი x იმას ნიშნავს, რომ მიმართოს და ამით რა არის? 903 00:39:18,690 --> 00:39:19,520 42. 904 00:39:19,520 --> 00:39:21,290 >> ასე რომ, მართლაც, რომ ზუსტად ის, რაც Nick გააკეთა. 905 00:39:21,290 --> 00:39:23,740 მან დაიწყო მიერ, არსებითად, გონებრივად 906 00:39:23,740 --> 00:39:26,270 მიუთითებს თითს x, შემდეგ arrow 907 00:39:26,270 --> 00:39:30,670 თეთრი ყუთი მარჯვენა მხარეს, და გამოსული ხმების 42 იქ. 908 00:39:30,670 --> 00:39:34,120 მაგრამ მაშინ რამ მივიღე ცოტა საშიში, არა? 909 00:39:34,120 --> 00:39:35,860 Binky ს შესახებ დაკარგავს თავის არეში. 910 00:39:35,860 --> 00:39:39,465 >> Star y უდრის 13, ცუდი იღბალი, რას ნიშნავს? 911 00:39:39,465 --> 00:39:43,620 ასე ვარსკვლავი y საშუალებით წასვლა მისამართზე წ. 912 00:39:43,620 --> 00:39:45,630 მაგრამ რა არის მისამართი y? 913 00:39:45,630 --> 00:39:47,899 914 00:39:47,899 --> 00:39:49,440 ყველა უფლება, ეს ნაგვის ღირებულება, არა? 915 00:39:49,440 --> 00:39:50,800 მიიპყრო იგი კითხვის ნიშნის. 916 00:39:50,800 --> 00:39:54,850 Nick მიიპყრო, როგორც მოიგერია ისარი. 917 00:39:54,850 --> 00:39:59,600 და როგორც კი თქვენ ცდილობენ ამის გაკეთება ვარსკვლავი y და განაცხადა, რომ იქ, 918 00:39:59,600 --> 00:40:03,872 მაგრამ არ არის ლეგიტიმური მისამართი, მას რამდენიმე ყალბი ადგილმდებარეობა, 919 00:40:03,872 --> 00:40:05,080 პროგრამის აპირებს მისაწოდებლად. 920 00:40:05,080 --> 00:40:08,580 და Binky ს ხელმძღვანელი აპირებს ფრენა off აქ, როგორც ეს გააკეთეს. 921 00:40:08,580 --> 00:40:12,130 >> ასე რომ, საბოლოო ჯამში, ამ პროგრამის იყო მხოლოდ ბინის გარეთ ხარვეზი. 922 00:40:12,130 --> 00:40:13,540 ეს იყო buggy პროგრამა. 923 00:40:13,540 --> 00:40:14,760 და ეს საჭირო დაფიქსირდა. 924 00:40:14,760 --> 00:40:18,260 და ერთადერთი გზა, მართლაც, გაასწორონ ის იქნება, მაგალითად, ამ მიმართულებით, 925 00:40:18,260 --> 00:40:21,010 რომელიც ჩვენ კი არ მიიღოთ, რადგან პროგრამა შეეჯახა ძალიან მალე. 926 00:40:21,010 --> 00:40:26,170 მაგრამ, თუ ჩვენ უნდა დაფიქსირება ამ, რა ეფექტი აქვს აკეთებს Y ტოლია x გაქვთ? 927 00:40:26,170 --> 00:40:30,010 ისე, ეს არსებითად მიუთითებს Y ზე რასაც ღირებულება x არის მიუთითებს. 928 00:40:30,010 --> 00:40:32,430 >> ასე რომ, Nick ამბავი, ან Binky ამბავი, როგორც 929 00:40:32,430 --> 00:40:34,640 x და y მიუთითებდნენ თეთრი ბლოკი მეხსიერება, 930 00:40:34,640 --> 00:40:38,300 ასე რომ, ბოლოს, როდესაც თქვენ არ ვარსკვლავს y უდრის 13 ერთხელ, 931 00:40:38,300 --> 00:40:43,080 თქვენ დასრულდება მდე გამოსული 13 შესაბამის ადგილას. 932 00:40:43,080 --> 00:40:47,640 ასე რომ, ყველა ამ ხაზების შესანიშნავად ლეგიტიმური, გარდა ამ ერთი, 933 00:40:47,640 --> 00:40:51,730 როდესაც ეს მოხდა, სანამ რეალურად დანიშნული y გარკვეული მნიშვნელობა. 934 00:40:51,730 --> 00:40:54,290 >> ახლა, საბედნიეროდ, თქვენ არ უნდა ვიმსჯელოთ ყველა 935 00:40:54,290 --> 00:40:56,560 ასეთი საკითხები თქვენი საკუთარი. 936 00:40:56,560 --> 00:40:59,310 ნება მომეცით წავიდეთ წინ და გახსნა ტერმინალის ფანჯარაში აქ 937 00:40:59,310 --> 00:41:03,050 და ქმნის, რაღაც მომენტში, სუპერ მოკლე პროგრამა, რომელიც 938 00:41:03,050 --> 00:41:04,360 ასევე არის ერთგვარი უაზრო. 939 00:41:04,360 --> 00:41:05,152 ეს მახინჯი. 940 00:41:05,152 --> 00:41:06,610 ეს არ მივაღწევთ არაფერი სასარგებლო. 941 00:41:06,610 --> 00:41:10,180 მაგრამ ეს იმას დემონსტრირება საკითხები მეხსიერება, მოდით შევხედოთ. 942 00:41:10,180 --> 00:41:11,830 >> მთავარი, სუპერ მარტივი. 943 00:41:11,830 --> 00:41:14,830 ეს აშკარად უწოდებს ფუნქცია, f, და შემდეგ დააბრუნებს 0. 944 00:41:14,830 --> 00:41:16,310 ეს ერთგვარი რთული სასადილო up. 945 00:41:16,310 --> 00:41:18,540 ასე რომ მთავარი არის საკმაოდ კარგი, ჯერჯერობით. 946 00:41:18,540 --> 00:41:20,100 >> ასე რომ ვ პრობლემატურია. 947 00:41:20,100 --> 00:41:22,120 და უბრალოდ არ დააყენა ბევრი ძალისხმევა შევიდა დასახელებისგან იგი 948 00:41:22,120 --> 00:41:23,990 აქ, რათა აქცენტი კოდი. 949 00:41:23,990 --> 00:41:25,740 ვ ორი ​​ხაზი. 950 00:41:25,740 --> 00:41:27,610 და ვნახოთ რა ახლა ხდება. 951 00:41:27,610 --> 00:41:29,840 ასე რომ, ერთი მხრივ, აქ და ნება მომეცით 952 00:41:29,840 --> 00:41:32,680 ეს შეესაბამება წინა example-- ერთის მხრივ, 953 00:41:32,680 --> 00:41:35,830 მარცხენა მხარეს არის აკეთებს რა, ინგლისურ ენაზე? 954 00:41:35,830 --> 00:41:36,493 ეს is-- 955 00:41:36,493 --> 00:41:37,701 აუდიტორია: შექმნა მაჩვენებელი. 956 00:41:37,701 --> 00:41:40,830 დევიდ ჯ Malan: შექმნა მაჩვენებელი to int და უწოდა x. 957 00:41:40,830 --> 00:41:43,789 ასე რომ, ეს ქმნის ერთ იმ ყუთები მე შენარჩუნება ხატვის სენსორული. 958 00:41:43,789 --> 00:41:45,913 და ახლა, მარჯვენა მხარეს, malloc, რა თქმა უნდა, 959 00:41:45,913 --> 00:41:47,420 გამოყოფის ბლოკი მეხსიერება. 960 00:41:47,420 --> 00:41:49,989 და უბრალოდ უნდა იყოს მკაფიო, თუ როგორ რამდენი მეხსიერება არის, როგორც ჩანს, 961 00:41:49,989 --> 00:41:52,030 გამოყოფის, თუ, უბრალოდ, სახის მათემატიკის აქ? 962 00:41:52,030 --> 00:41:53,200 963 00:41:53,200 --> 00:41:54,040 >> ასე რომ, ეს 40 ბაიტი. 964 00:41:54,040 --> 00:41:57,400 და მე ვიცი, რომ მხოლოდ იმიტომ, რომ მე ვიცი, int, on CS50 ელექტრო მოწყობილობების, მინიმუმ, 965 00:41:57,400 --> 00:41:58,060 არის ოთხი ბაიტი. 966 00:41:58,060 --> 00:41:59,610 ასე 10 ჯერ 4 არის 40. 967 00:41:59,610 --> 00:42:04,924 ასე რომ, ეს არის შენახვის x, მისამართი პირველი out of 40 ints, რომ 968 00:42:04,924 --> 00:42:07,340 გამოიყო სივრცეში, უკან, უკან, უკან. 969 00:42:07,340 --> 00:42:08,470 >> და ეს რა არის გასაღები შესახებ malloc. 970 00:42:08,470 --> 00:42:11,261 იგი არ იღებს პატარა მეხსიერება აქ, ცოტა აქ, ცოტა აქ. 971 00:42:11,261 --> 00:42:14,220 ეს გაძლევთ კიდევ ერთი ბლოკი მეხსიერება, contiguously, ოპერაციული 972 00:42:14,220 --> 00:42:15,240 სისტემა. 973 00:42:15,240 --> 00:42:18,500 >> ახლა რაც შეეხება ამ, x bracket 10 უდრის 0? 974 00:42:18,500 --> 00:42:19,470 თვითნებური ხაზი კოდი. 975 00:42:19,470 --> 00:42:21,100 ეს არ მივაღწევთ არაფერი სასარგებლო. 976 00:42:21,100 --> 00:42:26,128 მაგრამ საინტერესოა, რადგან x bracket 10--? 977 00:42:26,128 --> 00:42:26,628 ჰო? 978 00:42:26,628 --> 00:42:27,912 >> აუდიტორია: [INAUDIBLE]? 979 00:42:27,912 --> 00:42:30,500 >> დევიდ ჯ Malan: x bracket 10 არ უნდა იყოს null. 980 00:42:30,500 --> 00:42:35,070 Null დეტალური მხოლოდ ძალაში პიესა სიმები, ბოლოს სიმებიანი. 981 00:42:35,070 --> 00:42:36,700 მაგრამ კარგი აზრის. 982 00:42:36,700 --> 00:42:39,615 >> როგორ დიდი არის მასივი, მაშინაც კი, თუმცა მე გამოყოფილი 40 ბაიტი? 983 00:42:39,615 --> 00:42:42,560 984 00:42:42,560 --> 00:42:43,690 ეს 0 მეშვეობით ცხრა, არა? 985 00:42:43,690 --> 00:42:45,120 ეს არის 10 ints, სულ. 986 00:42:45,120 --> 00:42:48,790 40 ბაიტი, მაგრამ 10 ints, ინდექსირებული 0 საშუალებით 0. 987 00:42:48,790 --> 00:42:50,930 >> ასე რომ, რა არის ის, რომ x bracket 10? 988 00:42:50,930 --> 00:42:53,090 ეს, ფაქტობრივად, ზოგიერთი უცნობი ნაგვის ღირებულება. 989 00:42:53,090 --> 00:42:54,780 ეს მეხსიერების რომ არ მეკუთვნის. 990 00:42:54,780 --> 00:42:59,650 მე არ უნდა ეხება, byte ნომერი 41, 42, 43, 44. 991 00:42:59,650 --> 00:43:01,420 მე ვაპირებ ოდნავ შორს. 992 00:43:01,420 --> 00:43:04,490 >> და მართლაც, თუ მე აწარმოებს ამ პროგრამა, ეს შეიძლება ძალიან კარგად მისაწოდებლად. 993 00:43:04,490 --> 00:43:05,790 მაგრამ ზოგჯერ, ჩვენ გაუმართლა. 994 00:43:05,790 --> 00:43:07,706 და ასე მხოლოდ იმის დემონსტრირება, ამას და გულწრფელად, 995 00:43:07,706 --> 00:43:11,000 თქვენ არასდროს არ ვიცი, სანამ არ it-- მოდით აწარმოებს ამ. 996 00:43:11,000 --> 00:43:12,480 ის პრაქტიკულად არ მისაწოდებლად. 997 00:43:12,480 --> 00:43:15,032 >> მაგრამ თუ შევცვალო ეს, მაგალითად, უნდა იყოს, როგორიც 1000 998 00:43:15,032 --> 00:43:16,740 იმისათვის, რომ ეს ნამდვილად მიზანმიმართული, ვნახოთ 999 00:43:16,740 --> 00:43:18,710 თუ ჩვენ შეგვიძლია მივიღოთ ის მისაწოდებლად ამ დროს. 1000 00:43:18,710 --> 00:43:20,070 OK, ეს არ მისაწოდებლად. 1001 00:43:20,070 --> 00:43:22,600 როგორ 100,000? 1002 00:43:22,600 --> 00:43:25,000 მოდით შევცვალოთ ის, და ახლა გამეორება. 1003 00:43:25,000 --> 00:43:25,500 OK. 1004 00:43:25,500 --> 00:43:25,960 Phew. 1005 00:43:25,960 --> 00:43:26,460 ყველა უფლება. 1006 00:43:26,460 --> 00:43:29,090 ასე რომ, სავარაუდოდ, კიდევ ერთხელ, ამ სეგმენტების მეხსიერება, ასე ვთქვათ, 1007 00:43:29,090 --> 00:43:32,660 გონივრულად დიდი, ასე რომ, ჩვენ შეგვიძლია გაუმართლა ერთხელ და ისევ. 1008 00:43:32,660 --> 00:43:36,510 თუმცა, საბოლოოდ, კიდევ სასაცილოა და მართლაც წავიდეთ შორს ეკრანზე, 1009 00:43:36,510 --> 00:43:39,120 თქვენ შეეხოთ მეხსიერების რომ ნამდვილად, ნამდვილად არ ეკუთვნის. 1010 00:43:39,120 --> 00:43:40,870 >> მაგრამ გულწრფელად ვამბობ, ამ სახის შეცდომები ვაპირებთ 1011 00:43:40,870 --> 00:43:43,020 უნდა იყოს უფრო და უფრო რთული გაერკვნენ თქვენი საკუთარი. 1012 00:43:43,020 --> 00:43:47,880 მაგრამ საბედნიეროდ, როგორც პროგრამისტები, ჩვენ გვაქვს ინსტრუმენტი, რომელიც საშუალებას მოგვცემს გავაკეთოთ ჩვენთვის. 1013 00:43:47,880 --> 00:43:50,140 ასე რომ, ეს, ალბათ, ერთი საქართველოს ugliest პროგრამები, 1014 00:43:50,140 --> 00:43:52,060 თუნდაც მახინჯი, ვიდრე gdb ის გამომუშავება. 1015 00:43:52,060 --> 00:43:55,670 მაგრამ ეს ყოველთვის ხაზის ან ორი რომ სუპერ სასარგებლო. 1016 00:43:55,670 --> 00:44:00,310 >> Valgrind არის პროგრამა, რომელიც ეხმარება თქვენ არ გამართვის პროგრამა, თავისთავად, 1017 00:44:00,310 --> 00:44:03,500 მაგრამ მოვძებნოთ მეხსიერების დაკავშირებული პრობლემები, სპეციალურად. 1018 00:44:03,500 --> 00:44:07,590 ეს ავტომატურად აწარმოებს თქვენი კოდი და ვეძებთ ორი რამ. 1019 00:44:07,590 --> 00:44:10,680 ერთი, ის, რომ თქვენ რაღაც შემთხვევითი როგორიცაა შეხება მეხსიერება 1020 00:44:10,680 --> 00:44:11,980 რომ არ გეკუთვნის? 1021 00:44:11,980 --> 00:44:13,590 ეს დაგეხმარებათ იმ შემთხვევაში. 1022 00:44:13,590 --> 00:44:15,710 >> და ორი, ის დაეხმარება თქვენ რაღაც მოუწოდა 1023 00:44:15,710 --> 00:44:19,270 მეხსიერების ტბები, რომელიც ჩვენ გვაქვს სრულიად იგნორირებულია, გულუბრყვილოდ, 1024 00:44:19,270 --> 00:44:21,380 გარკვეული დრო და ბედნიერად. 1025 00:44:21,380 --> 00:44:23,140 მაგრამ აღმოჩნდება, ყველა ამ დროს, როდესაც 1026 00:44:23,140 --> 00:44:26,620 თქვენ მოუწოდა getString in ამდენი პროგრამები, 1027 00:44:26,620 --> 00:44:28,930 თქვენ გეკითხებით ოპერაციული სისტემის მეხსიერება, 1028 00:44:28,930 --> 00:44:32,070 მაგრამ თქვენ გაქვთ რაიმე მეხსიერებაში ოდესმე ვაძლევთ მას 1029 00:44:32,070 --> 00:44:36,169 უკან, აკეთებს unalloc, ან თავისუფალი, როგორც მას უწოდებენ. 1030 00:44:36,169 --> 00:44:37,960 არა, რადგან ჩვენ არასდროს გთხოვეთ ამის გაკეთება. 1031 00:44:37,960 --> 00:44:41,250 >> მაგრამ ყველა ამ დროს, პროგრამები თქვენ უკვე წერა C 1032 00:44:41,250 --> 00:44:43,800 უკვე ჩამოდის მეხსიერება, გეკითხებით ოპერაციული 1033 00:44:43,800 --> 00:44:46,190 სისტემა უფრო და უფრო მეხსიერების strings და whatnot, 1034 00:44:46,190 --> 00:44:47,870 მაგრამ არასოდეს გადაცემის უკან. 1035 00:44:47,870 --> 00:44:50,080 და ახლა ეს ცოტა ერთი მიდგომა, 1036 00:44:50,080 --> 00:44:53,550 მაგრამ თუ თქვენ ოდესმე აწარმოებს თქვენი Mac ან თქვენი PC საკმაოდ გარკვეული დრო, გახსნის 1037 00:44:53,550 --> 00:44:55,790 უამრავი პროგრამების, იქნებ დახურვის პროგრამები, 1038 00:44:55,790 --> 00:44:57,795 და მიუხედავად იმისა, რომ თქვენი კომპიუტერული არ შეეჯახა, 1039 00:44:57,795 --> 00:45:01,690 ის მიღების იმდენად ნელა, თითქოს ეს მართლაც 1040 00:45:01,690 --> 00:45:04,290 გამოყენებით უამრავი მეხსიერების ან რესურსები, მიუხედავად იმისა, 1041 00:45:04,290 --> 00:45:06,070 თუ თქვენ კი არ ეხება კლავიატურის, 1042 00:45:06,070 --> 00:45:10,430 რომელიც შეიძლება be-- მაგრამ არა always-- იქნებოდა შეიძლება, რომ პროგრამები, თქვენ გაშვებული 1043 00:45:10,430 --> 00:45:11,920 თავად მეხსიერების გაჟონვის. 1044 00:45:11,920 --> 00:45:15,645 და ისინი ითხოვს OS უფრო და მეტი მეხსიერება, მაგრამ დავიწყება შესახებ, 1045 00:45:15,645 --> 00:45:18,470 რეალურად არ გამოყენება, მაგრამ აქედან გამომდინარე, მეხსიერების მოშორებით 1046 00:45:18,470 --> 00:45:20,500 სხვა პროგრამები, რომლებიც გსურთ იგი. 1047 00:45:20,500 --> 00:45:23,940 ასე რომ, საერთო ახსნა. 1048 00:45:23,940 --> 00:45:25,940 ახლა აქ არის, სადაც Valgrind მიერ გამომავალი სრულიად 1049 00:45:25,940 --> 00:45:29,290 ბარბაროსულ იმ ნაკლებად და უფრო კომფორტული alike. 1050 00:45:29,290 --> 00:45:32,690 მაგრამ საინტერესო პერსონალის უფლება აქ. 1051 00:45:32,690 --> 00:45:37,060 ის მეუბნებოდა, არასწორი ჩაწერის საქართველოს ზომა ოთხი ხდება, ეს პროგრამა, 1052 00:45:37,060 --> 00:45:40,640 კერძოდ, ხაზი 21 memory.c. 1053 00:45:40,640 --> 00:45:45,450 >> თუ მე ხაზი 21, hm, ნამდვილად არის არის არასწორი ჩაწერის ზომა ოთხ. 1054 00:45:45,450 --> 00:45:46,250 რატომ ზომის ოთხი? 1055 00:45:46,250 --> 00:45:49,500 ასევე, ამ number-- და შეიძლება იყოს არაფერი int. 1056 00:45:49,500 --> 00:45:50,450 ასე რომ, ეს ოთხი ბაიტი. 1057 00:45:50,450 --> 00:45:52,550 ასე რომ, მე აყენებს ოთხი ბაიტი სადაც მათ არ ეკუთვნის. 1058 00:45:52,550 --> 00:45:55,080 ის, რაც Valgrind ფაქტობრივად მეუბნებოდა. 1059 00:45:55,080 --> 00:45:57,600 უფრო მეტიც, ის ასევე მეუბნებოდა, როგორც ვნახავთ, 1060 00:45:57,600 --> 00:46:01,490 როგორც თქვენ აწარმოებს ამ წელს მომავალი pset, თუ და როდესაც თქვენ გაჟონა მეხსიერება, რომელიც მართლაც 1061 00:46:01,490 --> 00:46:05,300 მე, რადგან მე მოუწოდა malloc, მაგრამ მე არ რეალურად 1062 00:46:05,300 --> 00:46:08,010 მოუწოდა, ამ შემთხვევაში, თავისუფალი, რომელიც ჩვენ საბოლოოდ ვხედავთ 1063 00:46:08,010 --> 00:46:09,830 პირიქით, malloc. 1064 00:46:09,830 --> 00:46:10,860 1065 00:46:10,860 --> 00:46:12,930 >> ასე რომ, ახლა მე ვფიქრობ, საბოლოო მაგალითი. 1066 00:46:12,930 --> 00:46:14,050 1067 00:46:14,050 --> 00:46:16,690 ასე რომ, ეს ერთი ცოტა მეტი arcane, მაგრამ ეს, ალბათ, 1068 00:46:16,690 --> 00:46:19,180 ყველაზე დიდი მიზეზი, ფრთხილად, მეხსიერება, 1069 00:46:19,180 --> 00:46:24,490 და იმ მიზეზით, რომ ბევრი პროგრამების ან / და ვებ სერვერების, თუნდაც ეს დღე, 1070 00:46:24,490 --> 00:46:28,200 ასრულებს ცუდი ბიჭები სადმე ინტერნეტ რომლებიც როგორღაც 1071 00:46:28,200 --> 00:46:33,390 გაგზავნის გაყალბებულად პაკეტი თქვენს სერვერზე ცდილობს კომპრომისზე თქვენი ანგარიშები, 1072 00:46:33,390 --> 00:46:36,420 ან მიიღოს თქვენი მონაცემები, ან უბრალოდ ზოგადად მიიღოს მეტი მანქანა. 1073 00:46:36,420 --> 00:46:38,910 ბუფერული overflow, როგორც სახელი ვარაუდობს, საშუალება 1074 00:46:38,910 --> 00:46:40,740 გადადის არ არის int, მაგრამ ბუფერულ. 1075 00:46:40,740 --> 00:46:43,490 და ბუფერული არის მხოლოდ ლამაზი გზა ვთქვა, რომ ეს არის რამოდენიმე მეხსიერება. 1076 00:46:43,490 --> 00:46:46,710 >> და მართლაც, მე მოუწოდა სიმებიანი ადრე ბუფერული, ნაცვლად s. 1077 00:46:46,710 --> 00:46:49,234 რადგან თუ ეს ბუფერული, ისევე როგორც YouTube თვალსაზრისით, 1078 00:46:49,234 --> 00:46:52,400 ან ნებისმიერ დროს თქვენ თვალს ვიდეო, თქვენ შეიძლება არ მინახავს სიტყვა buffering, 1079 00:46:52,400 --> 00:46:53,040 dot, dot, dot. 1080 00:46:53,040 --> 00:46:54,240 ეს ძალიან შემაშფოთებელი. 1081 00:46:54,240 --> 00:46:55,990 და ეს მხოლოდ იმას ნიშნავს რომ თქვენი ვიდეო დამკვრელი 1082 00:46:55,990 --> 00:46:58,710 ცდილობს ჩამოტვირთოთ უამრავი ბაიტი, უამრავი bytes 1083 00:46:58,710 --> 00:47:00,170 საწყისი ვიდეო ინტერნეტში. 1084 00:47:00,170 --> 00:47:02,920 მაგრამ ნელი, ასე რომ ის ცდილობს ჩამოტვირთვა რამოდენიმე მათგანი 1085 00:47:02,920 --> 00:47:06,430 შეავსოთ ბუფერული, კონტეინერი, ისე, რომ თქვენ გაქვთ საკმარისი bytes რომ მას შეუძლია შემდეგ 1086 00:47:06,430 --> 00:47:09,174 გაჩვენებთ ვიდეო, გარეშე დაპაუზება მუდმივად. 1087 00:47:09,174 --> 00:47:11,340 მაგრამ აღმოჩნდება, თქვენ შეგიძლიათ აქვს ბუფერული ამ დიდი. 1088 00:47:11,340 --> 00:47:15,710 მაგრამ ვცდილობ მას ამ დიდი მონაცემები , და ძალიან ცუდი რამ შეიძლება მოხდეს. 1089 00:47:15,710 --> 00:47:22,780 ასე მაგალითად, მოდით შევხედოთ საბოლოო teaser მაგალითი. 1090 00:47:22,780 --> 00:47:24,720 ეს არის კიდევ ერთი პროგრამა რომ, ერთი შეხედვით, 1091 00:47:24,720 --> 00:47:26,540 არაფერს არ აკეთებს სუპერ სასარგებლო. 1092 00:47:26,540 --> 00:47:29,590 მას აქვს ძირითადი ფუნქცია , რომელიც მოუწოდებს, რომ ფუნქცია, ვ. 1093 00:47:29,590 --> 00:47:36,640 და რომ ფუნქცია, f, აქ, აქვს char array, მოუწოდა C, ზომა 12. 1094 00:47:36,640 --> 00:47:39,340 და მაშინ ის იყენებს ამ ახალი ფუნქცია მოუწოდა strncpy. 1095 00:47:39,340 --> 00:47:40,430 1096 00:47:40,430 --> 00:47:45,190 >> გამოდის, რომ, ეს მარტივი, მარტივი ხაზი კოდი, უბრალოდ ორი ხაზი, 1097 00:47:45,190 --> 00:47:49,130 ჩვენ, ჩემი მთელი პროგრამა, და, შესაბამისად, მთელი ჩემი კომპიუტერი, 1098 00:47:49,130 --> 00:47:54,000 და ჩემი მომხმარებლის ანგარიში და ჩემს მყარ მანქანა პოტენციურად დაუცველი ვინმეს 1099 00:47:54,000 --> 00:47:58,170 ვინც იცის და არ არის საკმარისი, რომ აწარმოებს ამ პროგრამის გარკვეული command line 1100 00:47:58,170 --> 00:47:58,900 არგუმენტი. 1101 00:47:58,900 --> 00:48:03,400 სხვა სიტყვებით, თუ ეს ცუდი ბიჭი აყენებს შიგნით argvargv [1] აკრეფით 1102 00:48:03,400 --> 00:48:08,750 კლავიატურის ძალიან სპეციალურად crafted ტექსტი, არ abc, 123, მაგრამ, არსებითად, 1103 00:48:08,750 --> 00:48:15,180 ორობითი სიმბოლოები, რომელიც წარმოადგენს შესრულებადი კოდი, პროგრამა, რომელიც იგი წერდა, 1104 00:48:15,180 --> 00:48:19,190 ეს მარტივი პროგრამა, რომელიც წარმომადგენლობითი ათასობით პროგრამები 1105 00:48:19,190 --> 00:48:23,610 , რომლებიც ასეთივე დაუცველი, daresay, მას შეუძლია საბოლოოდ წაშლა ყველა 1106 00:48:23,610 --> 00:48:26,680 ფაილი ჩემს მყარ დისკზე, მიიღოს მოციმციმე სწრაფი, ასე რომ მას შეუძლია 1107 00:48:26,680 --> 00:48:30,170 აკრიფოთ ბრძანებები საკუთარი, ელ ყველა ფაილი თავს. 1108 00:48:30,170 --> 00:48:34,660 რამე, რომ მე გავაკეთებ, ის მას შეუძლია გააკეთოს ეს კოდი. 1109 00:48:34,660 --> 00:48:36,575 >> ჩვენ არ საკმაოდ გადაწყვიტოს ეს არ არის. 1110 00:48:36,575 --> 00:48:38,700 და ფაქტობრივად, ის აპირებს ჩართვა ცოტა სურათი 1111 00:48:38,700 --> 00:48:41,470 მსგავსი, რომელიც ჩვენ მალე მოვა უნდა გვესმოდეს, ყველა უკეთესი. 1112 00:48:41,470 --> 00:48:44,480 მაგრამ დღეს, მოდით დასრულდება რა არის, იმედია, ოდნავ მეტი 1113 00:48:44,480 --> 00:48:48,360 გასაგებია xkcd ხუმრობა, სანამ ჩვენ განაახლებს მომავალი დრო. 1114 00:48:48,360 --> 00:48:51,100 1115 00:48:51,100 --> 00:48:51,600 ყველა უფლება. 1116 00:48:51,600 --> 00:48:53,446 თქვენ ოთხშაბათს. 1117 00:48:53,446 --> 00:48:54,754 >> [მუსიკის დაკვრა] 1118 00:48:54,754 --> 00:48:57,790 >> დინამიკები და ახლა, ღრმა აზრები, მიერ Daven Farnham. 1119 00:48:57,790 --> 00:49:00,890 1120 00:49:00,890 --> 00:49:04,770 მეხსიერების ჰგავს jumping შევიდა pile of ოქროს ფოთლები კვირა დღის მეორე ნახევარში. 1121 00:49:04,770 --> 00:49:09,000 ქარი აფეთქებით, სროლაში თქვენი hair-- oh, მენატრება დღის when-- 1122 00:49:09,000 --> 00:49:11,100 1123 00:49:11,100 --> 00:49:12,650 >> [სიცილი] 1124 00:49:12,650 --> 00:49:13,750