1 00:00:00,000 --> 00:00:03,381 >> [MUSIC CHƠI] 2 00:00:03,381 --> 00:00:10,626 3 00:00:10,626 --> 00:00:11,610 >> [VIDEO PLAYBACK] 4 00:00:11,610 --> 00:00:13,640 >> -Anh ấy đang nói dối. 5 00:00:13,640 --> 00:00:14,380 >> -Về cái gì? 6 00:00:14,380 --> 00:00:17,182 >> -Tôi không biết. 7 00:00:17,182 --> 00:00:19,990 >> -Vậy Chúng ta biết gì? 8 00:00:19,990 --> 00:00:23,145 >> -đó Lúc 9:15, Ray Santoya là tại máy ATM. 9 00:00:23,145 --> 00:00:23,644 -Yeah. 10 00:00:23,644 --> 00:00:27,030 Vậy câu hỏi là, những gì Anh ta làm lúc 9:16? 11 00:00:27,030 --> 00:00:29,720 >> -Shooting 9 mm ở một cái gì đó. 12 00:00:29,720 --> 00:00:31,540 Có lẽ ông đã nhìn thấy những tay bắn tỉa. 13 00:00:31,540 --> 00:00:33,412 >> -Hoặc Được làm việc với anh ta. 14 00:00:33,412 --> 00:00:34,340 >> -Wait. 15 00:00:34,340 --> 00:00:36,200 Quay trở lại một. 16 00:00:36,200 --> 00:00:36,975 >> -Bạn nhìn thấy gì? 17 00:00:36,975 --> 00:00:44,400 18 00:00:44,400 --> 00:00:47,805 >> -Bring Khuôn mặt của mình lên màn hình đầy đủ. 19 00:00:47,805 --> 00:00:48,680 >> Kính -His. 20 00:00:48,680 --> 00:00:50,060 >> -Có Một sự phản ánh. 21 00:00:50,060 --> 00:01:00,455 22 00:01:00,455 --> 00:01:02,280 >> -Đó Là đội bóng chày Nuevitas. 23 00:01:02,280 --> 00:01:03,110 Đó là biểu tượng của họ. 24 00:01:03,110 --> 00:01:05,820 >> Và cậu ta đang nói chuyện với bất cứ ai mặc áo khoác đó. 25 00:01:05,820 --> 00:01:06,670 >> [END PLAYBACK] 26 00:01:06,670 --> 00:01:07,628 >> DAVID Malan: Tất cả các quyền. 27 00:01:07,628 --> 00:01:11,210 Đây là CS50 và điều này là nhiều hơn một chút của [Không nghe thấy] mà bạn 28 00:01:11,210 --> 00:01:12,890 dabbling với vấn đề thiết lập bốn. 29 00:01:12,890 --> 00:01:16,606 Hôm nay chúng ta bắt đầu nhìn nhiều hơn một chút sâu vào những điều được gọi là con trỏ, 30 00:01:16,606 --> 00:01:18,480 mà mặc dù nó một chủ đề khá phức tạp, 31 00:01:18,480 --> 00:01:20,813 nó chỉ ra rằng nó sẽ là phương tiện mà chúng tôi 32 00:01:20,813 --> 00:01:24,320 có thể bắt đầu xây dựng và lắp ráp các chương trình phức tạp hơn nhiều. 33 00:01:24,320 --> 00:01:28,150 Nhưng chúng tôi đã làm nó vào ngày thứ tư cuối cùng bằng cách của một số claymation đầu tiên. 34 00:01:28,150 --> 00:01:30,190 Vì vậy, đây, nhớ lại, là Binky và chúng tôi đã sử dụng ông 35 00:01:30,190 --> 00:01:33,148 để có một cái nhìn tại một chương trình không thực sự làm bất cứ điều gì thú vị, 36 00:01:33,148 --> 00:01:34,950 nhưng nó đã tiết lộ một vài vấn đề. 37 00:01:34,950 --> 00:01:38,570 Vì vậy, để bắt đầu ngày hôm nay, tại sao chúng ta không đi bộ một cách nhanh chóng thông qua một vài trong số các bước sau, 38 00:01:38,570 --> 00:01:41,920 cố gắng chắt lọc từ ngữ của con người chính xác những gì đang xảy ra ở đây 39 00:01:41,920 --> 00:01:45,410 và tại sao điều này là xấu, và sau đó di chuyển về và thực sự bắt đầu xây dựng cái gì 40 00:01:45,410 --> 00:01:46,309 với kỹ thuật này? 41 00:01:46,309 --> 00:01:48,350 Vì vậy, đây là những người đầu tiên hai dòng trong chương trình này 42 00:01:48,350 --> 00:01:51,340 và trong điều khoản của layman, những gì được hai dòng này đang làm gì? 43 00:01:51,340 --> 00:01:55,600 Một người nào đó là hợp lý thoải mái với những gì đã tuyên bố trên màn hình? 44 00:01:55,600 --> 00:01:58,340 45 00:01:58,340 --> 00:02:00,120 Hai dòng này đang làm gì? 46 00:02:00,120 --> 00:02:02,070 Đó không phải là tất cả mà khác nhau từ tuần thứ nhất, 47 00:02:02,070 --> 00:02:03,611 nhưng có một số biểu tượng đặc biệt mới. 48 00:02:03,611 --> 00:02:04,152 Yeah? 49 00:02:04,152 --> 00:02:05,628 Trở lại ở đó. 50 00:02:05,628 --> 00:02:07,092 >> Đung Khai báo con trỏ? 51 00:02:07,092 --> 00:02:08,050 DAVID Malan: Nói một lần nữa? 52 00:02:08,050 --> 00:02:08,860 Đung Khai báo con trỏ? 53 00:02:08,860 --> 00:02:11,776 DAVID Malan: con trỏ Kê khai, chúng ta hãy tinh chỉnh nó nhiều hơn một chút. 54 00:02:11,776 --> 00:02:14,050 Đung [Không nghe thấy] địa chỉ x và sau đó y. 55 00:02:14,050 --> 00:02:15,300 DAVID Malan: Và sau đó giải quyết. 56 00:02:15,300 --> 00:02:18,550 Vì vậy, cụ thể những gì chúng tôi đang làm là chúng ta đang khai báo hai biến. 57 00:02:18,550 --> 00:02:21,252 Các biến này, mặc dù, đang đi là kiểu int sao, mà 58 00:02:21,252 --> 00:02:23,210 cụ thể hơn có nghĩa là họ sẽ lưu trữ 59 00:02:23,210 --> 00:02:26,450 địa chỉ của một int, tương ứng, x và y. 60 00:02:26,450 --> 00:02:27,660 Bây giờ đang có bất kỳ giá trị? 61 00:02:27,660 --> 00:02:32,621 Có bất kỳ địa chỉ thực tế trong những hai biến vào thời điểm này trong thời gian? 62 00:02:32,621 --> 00:02:33,120 Không. 63 00:02:33,120 --> 00:02:35,030 Nó chỉ là cái gọi là giá trị rác. 64 00:02:35,030 --> 00:02:38,120 Nếu bạn không thực sự chỉ định một biến, bất cứ điều gì là trong RAM 65 00:02:38,120 --> 00:02:42,224 trước đây là sẽ điền bằng số không và những người thân cả các biến. 66 00:02:42,224 --> 00:02:44,140 Nhưng chúng ta chưa biết những gì họ đang có và đó là 67 00:02:44,140 --> 00:02:47,060 sẽ là chìa khóa để lý do tại sao Binky mất đầu tuần trước. 68 00:02:47,060 --> 00:02:49,980 >> Vì vậy, đây là claymation hóa thân của này 69 00:02:49,980 --> 00:02:53,580 nhờ đó mà bạn có chỉ là hai biến, ít miếng tròn bằng đất sét, 70 00:02:53,580 --> 00:02:57,330 có thể lưu trữ các biến, nhưng như các mũi tên quấn lên đề nghị, 71 00:02:57,330 --> 00:03:00,640 họ đang không thực sự chỉ bất cứ nơi nào để biết mỗi se. 72 00:03:00,640 --> 00:03:03,670 Vì vậy, sau đó chúng tôi đã có dòng này, và điều này là mới tuần trước, malloc cho bộ nhớ 73 00:03:03,670 --> 00:03:07,130 phân bổ, mà chỉ là một cách ưa thích nói cho các hệ điều hành, Linux 74 00:03:07,130 --> 00:03:09,750 hoặc Mac OS hay Windows, hey, cho tôi một số bộ nhớ, 75 00:03:09,750 --> 00:03:11,780 và tất cả các bạn phải nói hệ điều hành 76 00:03:11,780 --> 00:03:14,699 là những gì khi yêu cầu nó cho bộ nhớ. 77 00:03:14,699 --> 00:03:16,990 Nó sẽ không quan tâm những gì bạn sẽ làm gì với nó, 78 00:03:16,990 --> 00:03:19,786 nhưng bạn cần phải cho các điều hành hệ thống những gì bằng cách malloc. 79 00:03:19,786 --> 00:03:20,286 Yeah? 80 00:03:20,286 --> 00:03:21,078 >> Đung bao nhiêu? 81 00:03:21,078 --> 00:03:21,994 DAVID Malan: bao nhiêu? 82 00:03:21,994 --> 00:03:25,280 Bao nhiêu trong byte, và như vậy, điều này, một lần nữa, một ví dụ giả tạo, chỉ là nói, 83 00:03:25,280 --> 00:03:27,360 cho tôi kích cỡ của một int. 84 00:03:27,360 --> 00:03:30,550 Bây giờ, kích thước của một int là bốn byte hoặc 32 bit. 85 00:03:30,550 --> 00:03:32,850 Vì vậy, đây chỉ là một cách nói, hey, hệ điều hành, 86 00:03:32,850 --> 00:03:37,290 cho tôi bốn byte của bộ nhớ mà tôi có thể sử dụng theo ý của tôi, 87 00:03:37,290 --> 00:03:40,560 và đặc biệt, những gì hiện malloc trả về với sự tôn trọng 88 00:03:40,560 --> 00:03:41,795 cho rằng đoạn bốn byte? 89 00:03:41,795 --> 00:03:44,110 90 00:03:44,110 --> 00:03:44,860 Đung Address? 91 00:03:44,860 --> 00:03:45,901 DAVID Malan: Các địa chỉ. 92 00:03:45,901 --> 00:03:47,580 Địa chỉ rằng đoạn bốn byte. 93 00:03:47,580 --> 00:03:48,190 Chính xác. 94 00:03:48,190 --> 00:03:51,430 Và đó là những gì được lưu trữ cuối cùng trong x và đó là lý do tại sao chúng ta không thực sự 95 00:03:51,430 --> 00:03:55,240 quan tâm đến những số đó địa chỉ là, cho dù đó là ox1 hoặc ox2 96 00:03:55,240 --> 00:03:57,110 hoặc một số địa chỉ hex khó hiểu. 97 00:03:57,110 --> 00:03:59,850 Chúng tôi chỉ quan tâm đến những bức tranh đó là biến x bây giờ là 98 00:03:59,850 --> 00:04:01,630 chỉ với đoạn bộ nhớ. 99 00:04:01,630 --> 00:04:05,570 Vì vậy, các mũi tên đại diện cho một con trỏ, hoặc Cụ thể hơn, một địa chỉ bộ nhớ. 100 00:04:05,570 --> 00:04:09,120 Nhưng một lần nữa, chúng ta thường không quan tâm những gì những địa chỉ thực tế là. 101 00:04:09,120 --> 00:04:11,780 Bây giờ, dòng này nói những gì trong điều khoản của layman? 102 00:04:11,780 --> 00:04:14,330 Sao x được 42 dấu chấm phẩy. 103 00:04:14,330 --> 00:04:17,390 Điều đó có nghĩa là gì? 104 00:04:17,390 --> 00:04:18,200 Bạn muốn đi đâu? 105 00:04:18,200 --> 00:04:20,102 Đừng gãi cổ của bạn. 106 00:04:20,102 --> 00:04:22,360 >> Đung Địa chỉ của x là số 42. 107 00:04:22,360 --> 00:04:24,300 >> DAVID Malan: Địa chỉ của x là 42. 108 00:04:24,300 --> 00:04:25,190 Không hẳn. 109 00:04:25,190 --> 00:04:28,485 Vì vậy, gần gũi, nhưng không hoàn toàn, bởi vì có ngôi sao đó là tiền tố x này. 110 00:04:28,485 --> 00:04:29,860 Vì vậy, chúng ta cần phải tinh chỉnh một chút. 111 00:04:29,860 --> 00:04:31,032 Yeah? 112 00:04:31,032 --> 00:04:36,044 >> Đung Các giá trị mà con trỏ x được trỏ đến là 42. 113 00:04:36,044 --> 00:04:36,710 DAVID Malan: OK. 114 00:04:36,710 --> 00:04:40,840 Giá trị mà con trỏ x là trỏ đến, chúng ta hãy nói, sẽ là 42, 115 00:04:40,840 --> 00:04:44,165 hay nói một cách khác, các ngôi sao x nói, đi đến bất cứ địa chỉ 116 00:04:44,165 --> 00:04:48,340 là x, cho dù đó là 1 Oxford Street hoặc 33 đường Oxford 117 00:04:48,340 --> 00:04:51,850 hoặc ox1 hoặc ox33, bất cứ điều gì địa chỉ số là, 118 00:04:51,850 --> 00:04:54,380 sao x là dereferencing của x. 119 00:04:54,380 --> 00:04:57,297 Vì vậy, đi đến địa chỉ đó và sau đó đưa số 42 đó. 120 00:04:57,297 --> 00:04:59,380 Vì vậy, đó sẽ là một cách tương đương với nói rằng. 121 00:04:59,380 --> 00:05:01,860 Vì vậy, đó là tất cả tiền phạt và sau đó chúng tôi sẽ đại diện cho hình ảnh 122 00:05:01,860 --> 00:05:05,370 như sau đó chúng tôi đã thêm 42 cho rằng đoạn bốn 123 00:05:05,370 --> 00:05:09,370 byte ở phía bên tay phải, nhưng dòng này là nơi mà mọi thứ đã không như mong đợi 124 00:05:09,370 --> 00:05:11,120 và đầu Binky của popped off vào thời điểm này, 125 00:05:11,120 --> 00:05:15,290 bởi vì những điều xấu xảy ra khi bạn tới đích của các giá trị rác 126 00:05:15,290 --> 00:05:18,210 hoặc bạn tới đích không hợp lệ con trỏ, và tôi nói không hợp lệ 127 00:05:18,210 --> 00:05:21,020 bởi vì tại thời điểm này trong câu chuyện, những gì là bên trong của y? 128 00:05:21,020 --> 00:05:24,440 Giá trị của y dựa là gì trên vài bước qua? 129 00:05:24,440 --> 00:05:25,360 Yeah? 130 00:05:25,360 --> 00:05:26,115 Cái gì thế? 131 00:05:26,115 --> 00:05:26,990 >> Đung Một địa chỉ. 132 00:05:26,990 --> 00:05:28,460 DAVID Malan: Một địa chỉ. 133 00:05:28,460 --> 00:05:31,910 Nó phải là một địa chỉ nhưng tôi khởi tạo nó? 134 00:05:31,910 --> 00:05:32,800 Vì vậy, tôi vẫn chưa được. 135 00:05:32,800 --> 00:05:35,430 Vì vậy, những gì được biết đến là trong đó không? 136 00:05:35,430 --> 00:05:37,590 Nó chỉ là một số giá trị rác. 137 00:05:37,590 --> 00:05:41,500 Nó có thể là bất kỳ địa chỉ từ số không đến 2 tỷ nếu bạn có hai hợp đồng biểu diễn của bộ nhớ RAM, 138 00:05:41,500 --> 00:05:44,289 hoặc không có đến 4 tỷ USD nếu bạn đã có bốn GB RAM. 139 00:05:44,289 --> 00:05:46,080 Đó là một số giá trị rác, nhưng vấn đề là 140 00:05:46,080 --> 00:05:48,200 rằng hệ điều hành, nếu nó đã không đưa cho bạn 141 00:05:48,200 --> 00:05:51,140 rằng đoạn bộ nhớ đặc biệt rằng bạn đang cố gắng để đi đến, 142 00:05:51,140 --> 00:05:54,650 nó thường sẽ gây ra những gì chúng tôi đã nhìn thấy như là một lỗi phân khúc. 143 00:05:54,650 --> 00:05:57,810 Vì vậy, trong thực tế, bất kỳ bạn của những người có đấu tranh tại vấn đề ở giờ văn phòng 144 00:05:57,810 --> 00:06:00,393 hoặc trong những vấn đề đó là nhiều nói chung với cố gắng tìm ra 145 00:06:00,393 --> 00:06:02,150 một lỗi phân khúc, đó thường có nghĩa là 146 00:06:02,150 --> 00:06:05,017 bạn đang chạm vào một phân đoạn của nhớ rằng bạn không nên. 147 00:06:05,017 --> 00:06:07,350 Bạn đang chạm vào bộ nhớ hệ điều hành có không 148 00:06:07,350 --> 00:06:10,450 cho phép bạn để liên lạc, cho dù đó là bằng cách đi quá xa trong mảng của bạn 149 00:06:10,450 --> 00:06:12,870 hoặc bắt đầu từ bây giờ, cho dù đó là bởi vì bạn đang chạm vào 150 00:06:12,870 --> 00:06:14,780 bộ nhớ mà chỉ là một số giá trị rác. 151 00:06:14,780 --> 00:06:18,230 >> Vì vậy, làm sao x ở đây là Loại hành vi không xác định. 152 00:06:18,230 --> 00:06:22,030 Bạn không bao giờ nên làm điều đó bởi vì tỷ lệ cược được, chương trình chỉ là đi đến sụp đổ, 153 00:06:22,030 --> 00:06:24,050 bởi vì bạn đang nói, đi đến địa chỉ này 154 00:06:24,050 --> 00:06:27,000 và bạn không có ý tưởng địa chỉ đó thực sự là. 155 00:06:27,000 --> 00:06:30,300 Vì vậy, các hệ điều hành có khả năng đi đến sụp đổ chương trình của bạn 156 00:06:30,300 --> 00:06:33,840 và kết quả là thực sự, đó là những gì xảy ra ở đó để Binky. 157 00:06:33,840 --> 00:06:37,210 Vì vậy, cuối cùng, Binky cố định vấn đề này với điều này. 158 00:06:37,210 --> 00:06:38,909 Vì vậy, chương trình riêng của mình đã hoàn thiện. 159 00:06:38,909 --> 00:06:41,450 Nhưng nếu bạn sắp xếp các giả mạo trước và thực hiện dòng này thay vào đó, 160 00:06:41,450 --> 00:06:45,580 y bằng x có nghĩa là bất cứ điều gì chỉ địa chỉ là một x, cũng đặt nó trong y. 161 00:06:45,580 --> 00:06:48,740 >> Và vì vậy những bức tranh, chúng tôi đã đại diện này với hai mũi tên 162 00:06:48,740 --> 00:06:51,570 từ x và y từ trỏ đến cùng một nơi. 163 00:06:51,570 --> 00:06:55,760 Vì vậy, về mặt ngữ nghĩa, x bằng để y vì cả của những người 164 00:06:55,760 --> 00:07:00,300 được lưu trữ cùng địa chỉ, ergo chỉ ở mức 42, 165 00:07:00,300 --> 00:07:04,910 và bây giờ, khi bạn nói sao y, đi đến địa chỉ trong y, 166 00:07:04,910 --> 00:07:06,790 này có hiệu quả thú vị. 167 00:07:06,790 --> 00:07:10,320 Vì vậy, các địa chỉ trong y là giống như là địa chỉ trong x. 168 00:07:10,320 --> 00:07:15,060 Vì vậy, nếu bạn nói đi đến địa chỉ trong y và thay đổi giá trị đến 13, 169 00:07:15,060 --> 00:07:17,140 người khác đang bị ảnh hưởng? 170 00:07:17,140 --> 00:07:21,100 X được, điểm D, có thể nói, nên cũng bị ảnh hưởng. 171 00:07:21,100 --> 00:07:24,340 >> Và quả thực, làm thế nào Nick vẽ bức tranh này trong claymation là chính xác đó. 172 00:07:24,340 --> 00:07:28,665 Mặc dù chúng tôi thực hiện theo các con trỏ y, chúng tôi đã kết thúc trong cùng một vị trí, 173 00:07:28,665 --> 00:07:32,780 và như vậy nếu chúng ta để in ra x hoặc y pointee của, 174 00:07:32,780 --> 00:07:35,720 sau đó chúng ta sẽ thấy giá trị của 13. 175 00:07:35,720 --> 00:07:37,927 Bây giờ, tôi nói pointee được phù hợp với các video. 176 00:07:37,927 --> 00:07:39,760 Các lập trình viên, để tôi kiến thức, không bao giờ thực sự 177 00:07:39,760 --> 00:07:42,460 nói pointee từ, rằng đó là nhọn 178 00:07:42,460 --> 00:07:44,650 tại, nhưng đối với sự nhất quán với video, nhận ra 179 00:07:44,650 --> 00:07:47,520 đó là tất cả những gì có nghĩa là trong tình huống đó. 180 00:07:47,520 --> 00:07:54,190 Vì vậy, bất kỳ câu hỏi về claymation hoặc con trỏ hoặc malloc chỉ chưa? 181 00:07:54,190 --> 00:07:54,850 Không có? 182 00:07:54,850 --> 00:07:55,470 Được rồi. 183 00:07:55,470 --> 00:07:58,560 >> Vì vậy mà không có thêm ado, chúng ta hãy có một cái nhìn 184 00:07:58,560 --> 00:08:00,700 tại nơi này có thực sự được sử dụng trong một thời gian. 185 00:08:00,700 --> 00:08:03,580 Vì vậy, chúng tôi đã có thư viện CS50 này đó là có tất cả các chức năng này. 186 00:08:03,580 --> 00:08:06,810 Chúng tôi đã sử dụng getInt rất nhiều, GetString, có lẽ GetLongLong trước 187 00:08:06,810 --> 00:08:09,840 trong PSet tôi một hoặc như vậy, nhưng những gì thực sự đã diễn ra? 188 00:08:09,840 --> 00:08:12,920 Vâng, chúng ta hãy có một cái nhìn nhanh chóng bên dưới mui xe tại một chương trình 189 00:08:12,920 --> 00:08:17,017 truyền cảm hứng tại sao chúng tôi cung cấp cho bạn các CS50 thư viện, và thực sự là của tuần trước, 190 00:08:17,017 --> 00:08:18,850 chúng tôi bắt đầu tham gia những bánh xe đào tạo ra. 191 00:08:18,850 --> 00:08:21,080 Vì vậy, điều này bây giờ được sắp xếp của một người sau khi chết của những gì 192 00:08:21,080 --> 00:08:23,690 có được đi vào bên trong các thư viện CS50, 193 00:08:23,690 --> 00:08:27,250 mặc dù bây giờ chúng ta sẽ bắt đầu di chuyển đi từ nó đối với hầu hết các chương trình. 194 00:08:27,250 --> 00:08:29,460 >> Vì vậy, đây là một chương trình được gọi là scanf 0. 195 00:08:29,460 --> 00:08:30,510 Đó là siêu ngắn. 196 00:08:30,510 --> 00:08:33,909 Nó chỉ có những dòng này, nhưng nó giới thiệu một chức năng gọi là scanf 197 00:08:33,909 --> 00:08:36,909 rằng chúng tôi đang thực sự sẽ thấy trong một thời điểm bên trong của thư viện CS50, 198 00:08:36,909 --> 00:08:38,600 mặc dù trong một hình thức hơi khác nhau. 199 00:08:38,600 --> 00:08:41,330 Vì vậy, chương trình này trên đường 16 được khai báo một biến x. 200 00:08:41,330 --> 00:08:43,150 Vì vậy, cho tôi bốn byte cho một int. 201 00:08:43,150 --> 00:08:45,750 Nó đã nói với người sử dụng, số lượng xin vui lòng, và sau đó 202 00:08:45,750 --> 00:08:49,010 đây là một dòng thú vị mà thực sự kết nối cùng với tuần trước 203 00:08:49,010 --> 00:08:49,790 và cái này. 204 00:08:49,790 --> 00:08:53,230 Scanf, và sau đó thông báo phải mất một định dạng chuỗi, giống như printf, 205 00:08:53,230 --> 00:08:57,480 % i có nghĩa là một int, và sau đó phải mất một số thứ hai mà trông hơi 206 00:08:57,480 --> 00:08:58,260 funky. 207 00:08:58,260 --> 00:09:01,880 Đó là ký hiệu x, và để nhớ lại, chúng ta chỉ nhìn thấy một lần vào tuần cuối cùng này. 208 00:09:01,880 --> 00:09:03,465 Không dấu và x đại diện cho những gì? 209 00:09:03,465 --> 00:09:06,210 210 00:09:06,210 --> 00:09:08,450 Những gì hiện dấu và làm trong C? 211 00:09:08,450 --> 00:09:08,950 Yeah? 212 00:09:08,950 --> 00:09:10,024 >> Đung Các địa chỉ. 213 00:09:10,024 --> 00:09:11,190 DAVID Malan: Địa chỉ của. 214 00:09:11,190 --> 00:09:13,190 Vì vậy, nó là ngược lại của các nhà điều hành sao, 215 00:09:13,190 --> 00:09:17,270 trong khi các nhà điều hành sao cho biết, vào địa chỉ này, các nhà điều hành ký hiệu 216 00:09:17,270 --> 00:09:20,280 nói, tìm ra địa chỉ của biến này, 217 00:09:20,280 --> 00:09:23,530 và vì vậy điều này là quan trọng, bởi vì Mục đích của scanf trong cuộc sống 218 00:09:23,530 --> 00:09:26,320 là để quét sử dụng của nhập vào từ bàn phím, 219 00:09:26,320 --> 00:09:29,970 phụ thuộc vào bất cứ điều gì anh ta hoặc cô loại, và sau đó đọc đầu vào của người dùng 220 00:09:29,970 --> 00:09:32,970 vào một biến, nhưng chúng tôi đã thấy trong hai tuần qua 221 00:09:32,970 --> 00:09:36,080 đó là chức năng hoán đổi mà chúng ta cố gắng dễ dàng để thực hiện 222 00:09:36,080 --> 00:09:37,110 chỉ bị phá vỡ. 223 00:09:37,110 --> 00:09:42,470 Nhớ lại rằng với các chức năng trao đổi, nếu chúng ta chỉ tuyên bố A và B như ints, 224 00:09:42,470 --> 00:09:47,040 chúng tôi đã thành công hoán đổi hai biến bên trong của swap 225 00:09:47,040 --> 00:09:50,080 giống như với sữa và OJ, nhưng ngay sau khi hoán đổi trở lại, 226 00:09:50,080 --> 00:09:55,200 là những gì các kết quả liên quan cho x và y, các giá trị ban đầu? 227 00:09:55,200 --> 00:09:55,700 K có gì. 228 00:09:55,700 --> 00:09:56,200 Yeah. 229 00:09:56,200 --> 00:09:59,754 Không có gì xảy ra thời gian đó, vì giao dịch hoán đổi chỉ thay đổi bản sao địa phương của mình, 230 00:09:59,754 --> 00:10:01,670 mà là để nói, tất cả thời gian này, bất cứ khi nào chúng tôi đã 231 00:10:01,670 --> 00:10:04,010 được đi qua trong lập luận chức năng, chúng tôi 232 00:10:04,010 --> 00:10:05,939 chỉ cần đi qua các bản sao của các đối số. 233 00:10:05,939 --> 00:10:07,980 Bạn có thể làm với điều đó bất cứ điều gì bạn muốn với chúng, 234 00:10:07,980 --> 00:10:10,890 nhưng họ sẽ không có ảnh hưởng về giá trị ban đầu. 235 00:10:10,890 --> 00:10:13,650 Vì vậy, đây là vấn đề nếu bạn muốn có một chức năng như scanf 236 00:10:13,650 --> 00:10:17,170 trong cuộc sống, mà mục đích là để quét đầu vào của người dùng từ bàn phím 237 00:10:17,170 --> 00:10:22,010 và sau đó điền vào chỗ trống, do đó, để nói chuyện, đó là, cung cấp cho một biến như x 238 00:10:22,010 --> 00:10:25,410 một giá trị, bởi vì nếu tôi là để chỉ cần vượt qua x để scanf, 239 00:10:25,410 --> 00:10:28,790 nếu bạn xem xét logic của cuối cùng tuần, scanf có thể làm bất cứ điều gì nó muốn 240 00:10:28,790 --> 00:10:33,100 với một bản sao của x, nhưng nó có thể không vĩnh viễn thay đổi x trừ khi chúng tôi cung cấp 241 00:10:33,100 --> 00:10:37,120 scanf một bản đồ kho báu, có thể nói, trong đó x đánh dấu chỗ đó, 242 00:10:37,120 --> 00:10:41,860 chúng tôi vượt qua trong các địa chỉ của x để scanf thể đến đó và thực sự thay đổi 243 00:10:41,860 --> 00:10:42,920 giá trị của x. 244 00:10:42,920 --> 00:10:45,080 Và như vậy thực sự, tất cả rằng chương trình này không 245 00:10:45,080 --> 00:10:53,180 nếu tôi làm cho scanf 0, trong mã nguồn của tôi 5m thư mục, tạo scanf 0, 246 00:10:53,180 --> 00:10:57,730 dot giảm scanf, số xin 50, cảm ơn cho 50. 247 00:10:57,730 --> 00:11:01,020 >> Vì vậy, nó không phải là tất cả những gì thú vị, nhưng những gì đang thực sự xảy ra 248 00:11:01,020 --> 00:11:04,820 là ngay sau khi tôi gọi scanf đây, giá trị của x 249 00:11:04,820 --> 00:11:06,410 đang được thay đổi vĩnh viễn. 250 00:11:06,410 --> 00:11:08,335 Bây giờ, điều này có vẻ tốt đẹp và tốt, và trong thực tế, nó 251 00:11:08,335 --> 00:11:11,200 có vẻ như chúng ta không thực sự cần thư viện CS50 ở tất cả nữa. 252 00:11:11,200 --> 00:11:13,960 Ví dụ, chúng ta hãy chạy này một lần nữa ở đây. 253 00:11:13,960 --> 00:11:15,750 Hãy để tôi mở lại nó cho một thứ hai. 254 00:11:15,750 --> 00:11:20,600 Hãy thử một số xin vui lòng và thay vì nói 50 như trước đây, 255 00:11:20,600 --> 00:11:22,810 chúng ta hãy chỉ nói không. 256 00:11:22,810 --> 00:11:24,000 OK, đó là một chút lạ. 257 00:11:24,000 --> 00:11:25,270 ĐƯỢC. 258 00:11:25,270 --> 00:11:28,680 Và chỉ một số vô nghĩa ở đây. 259 00:11:28,680 --> 00:11:31,170 Vì vậy, nó dường như không xử lý các tình huống sai lầm. 260 00:11:31,170 --> 00:11:33,620 Vì vậy, chúng ta cần phải bắt đầu tối thiểu thêm một số kiểm tra lỗi 261 00:11:33,620 --> 00:11:37,460 để đảm bảo rằng người dùng có gõ vào một số thực tế như 50, 262 00:11:37,460 --> 00:11:40,720 vì những lời dường như gõ không được phát hiện là có vấn đề, 263 00:11:40,720 --> 00:11:42,020 nhưng có lẽ nó nên được. 264 00:11:42,020 --> 00:11:46,450 >> Chúng ta hãy nhìn vào phiên bản này bây giờ đó là cố gắng của tôi để reimplement GetString. 265 00:11:46,450 --> 00:11:48,437 Nếu scanf có tất cả điều này chức năng được xây dựng trong, 266 00:11:48,437 --> 00:11:51,270 tại sao chúng ta được dabbling với những bánh xe đào tạo như GetString? 267 00:11:51,270 --> 00:11:55,450 Vâng, ở đây có lẽ là của riêng tôi phiên bản đơn giản của GetString 268 00:11:55,450 --> 00:12:00,766 theo đó một tuần trước đây, tôi có thể nói, cho tôi một chuỗi và gọi nó là đệm. 269 00:12:00,766 --> 00:12:03,390 Hôm nay, tôi sẽ bắt đầu chỉ nói sao char, trong đó, thu hồi, 270 00:12:03,390 --> 00:12:04,400 nó chỉ là đồng nghĩa. 271 00:12:04,400 --> 00:12:06,629 Nó trông đáng sợ nhưng nó hiện tượng như vậy. 272 00:12:06,629 --> 00:12:09,420 Vì vậy, cho tôi một biến gọi là bộ đệm đó là sẽ lưu trữ một chuỗi, 273 00:12:09,420 --> 00:12:12,780 cho chuỗi sử dụng xin vui lòng, và sau đó, giống như trước đây, 274 00:12:12,780 --> 00:12:17,760 chúng ta hãy cố gắng vay mượn bài học này scanf % s thời gian này và sau đó vượt qua trong bộ đệm. 275 00:12:17,760 --> 00:12:19,310 Bây giờ, một kiểm tra sự tỉnh táo nhanh chóng. 276 00:12:19,310 --> 00:12:22,120 Tại sao tôi không nói dấu và đệm thời gian này? 277 00:12:22,120 --> 00:12:25,190 278 00:12:25,190 --> 00:12:26,625 Suy ra từ ví dụ trước. 279 00:12:26,625 --> 00:12:28,000 Đung sao Char là một con trỏ. 280 00:12:28,000 --> 00:12:29,920 DAVID Malan: Chính xác, bởi vì thời gian này, char 281 00:12:29,920 --> 00:12:34,080 sao đã là một con trỏ, một địa chỉ, theo định nghĩa của ngôi sao đang ở đó. 282 00:12:34,080 --> 00:12:37,530 Và nếu scanf hy vọng một địa chỉ, nó cũng đủ chỉ để vượt qua trong bộ đệm. 283 00:12:37,530 --> 00:12:39,260 Tôi không cần phải nói dấu và đệm. 284 00:12:39,260 --> 00:12:42,177 Đối với những người tò mò, bạn có thể làm một cái gì đó như thế này. 285 00:12:42,177 --> 00:12:43,510 Nó sẽ có ý nghĩa khác nhau. 286 00:12:43,510 --> 00:12:47,240 Điều này sẽ cung cấp cho bạn một con trỏ cho một con trỏ, mà thực sự là 287 00:12:47,240 --> 00:12:50,050 một điều hợp lệ trong C, nhưng đối với bây giờ, chúng ta hãy giữ cho nó đơn giản 288 00:12:50,050 --> 00:12:51,750 và giữ những câu chuyện phù hợp. 289 00:12:51,750 --> 00:12:54,100 Tôi chỉ cần đi để vượt qua trong đệm và đó là chính xác. 290 00:12:54,100 --> 00:12:56,487 Vấn đề là mặc dù này. 291 00:12:56,487 --> 00:12:58,820 Hãy để tôi đi trước và chạy này chương trình sau khi biên dịch nó. 292 00:12:58,820 --> 00:13:00,902 Hãy scanf 1. 293 00:13:00,902 --> 00:13:02,610 Chết tiệt, trình biên dịch của tôi bắt lỗi của tôi. 294 00:13:02,610 --> 00:13:04,090 Hãy cho tôi một giây. 295 00:13:04,090 --> 00:13:05,460 Clang. 296 00:13:05,460 --> 00:13:06,990 Hãy nói rằng scanf-1.c. 297 00:13:06,990 --> 00:13:10,880 298 00:13:10,880 --> 00:13:11,380 ĐƯỢC. 299 00:13:11,380 --> 00:13:12,720 Hiện chúng tôi đi. 300 00:13:12,720 --> 00:13:14,280 Tôi cân no. 301 00:13:14,280 --> 00:13:16,750 CS50 ID có hình thiết lập cấu hình 302 00:13:16,750 --> 00:13:18,280 bảo vệ bạn chống lại chính mình. 303 00:13:18,280 --> 00:13:21,300 Tôi cần thiết để vô hiệu hóa các bằng chạy kêu vang thủ thời gian này. 304 00:13:21,300 --> 00:13:22,140 Vì vậy, xin vui lòng chuỗi. 305 00:13:22,140 --> 00:13:25,560 Tôi sẽ đi trước và gõ trong thế giới hello yêu thích của tôi. 306 00:13:25,560 --> 00:13:26,490 OK, null. 307 00:13:26,490 --> 00:13:27,700 Đó không phải là những gì tôi đã gõ. 308 00:13:27,700 --> 00:13:29,690 Vì vậy, nó là biểu hiện của một cái gì đó là sai. 309 00:13:29,690 --> 00:13:33,920 Hãy để tôi đi trước và gõ trong một chuỗi rất dài. 310 00:13:33,920 --> 00:13:37,210 Thanks for null và tôi không biết nếu tôi sẽ để có thể sụp đổ nó. 311 00:13:37,210 --> 00:13:40,240 Hãy thử một bản sao nhỏ dán và xem nếu điều này sẽ giúp. 312 00:13:40,240 --> 00:13:43,290 Chỉ cần dán rất nhiều về điều này. 313 00:13:43,290 --> 00:13:47,310 Đó chắc chắn là một lớn hơn chuỗi hơn bình thường. 314 00:13:47,310 --> 00:13:51,450 Hãy chỉ thực sự viết nó. 315 00:13:51,450 --> 00:13:51,950 Không. 316 00:13:51,950 --> 00:13:52,650 Chết tiệt. 317 00:13:52,650 --> 00:13:53,480 Lệnh không tìm thấy. 318 00:13:53,480 --> 00:13:54,550 Vì vậy, đó là không liên quan. 319 00:13:54,550 --> 00:13:56,440 Đó là bởi vì tôi dán một số nhân vật xấu, 320 00:13:56,440 --> 00:13:59,780 nhưng điều này hóa ra không phải là đi để làm việc. 321 00:13:59,780 --> 00:14:03,510 >> Hãy thử một lần nữa, bởi vì nó là thú vị hơn nếu chúng ta thực sự sụp đổ nó. 322 00:14:03,510 --> 00:14:09,116 Hãy gõ này và bây giờ, tôi sẽ sao chép một chuỗi rất dài 323 00:14:09,116 --> 00:14:10,990 và bây giờ chúng ta hãy xem chúng tôi có thể sụp đổ điều này. 324 00:14:10,990 --> 00:14:14,235 Chú ý rằng tôi bỏ qua không gian và dòng mới và dấu chấm phẩy 325 00:14:14,235 --> 00:14:16,035 và tất cả các nhân vật sôi nổi. 326 00:14:16,035 --> 00:14:16,535 Nhập. 327 00:14:16,535 --> 00:14:21,090 328 00:14:21,090 --> 00:14:22,880 Và bây giờ mạng chỉ là bị chậm. 329 00:14:22,880 --> 00:14:27,460 Tôi giữ phím Command-V quá dài, rõ ràng. 330 00:14:27,460 --> 00:14:28,190 Chết tiệt! 331 00:14:28,190 --> 00:14:29,260 Lệnh không tìm thấy. 332 00:14:29,260 --> 00:14:29,780 >> ĐƯỢC. 333 00:14:29,780 --> 00:14:32,240 Vâng, điểm là dù sao sau. 334 00:14:32,240 --> 00:14:36,910 Vì vậy, những gì đang thật sự diễn trên với tuyên bố này 335 00:14:36,910 --> 00:14:39,240 của char sao đệm trên đường dây 16? 336 00:14:39,240 --> 00:14:41,820 Vì vậy, những gì tôi nhận được khi tôi tuyên bố một con trỏ? 337 00:14:41,820 --> 00:14:47,440 Tất cả tôi nhận được là một giá trị bốn byte gọi là bộ đệm, nhưng những gì bên trong của nó 338 00:14:47,440 --> 00:14:49,540 tại thời điểm này? 339 00:14:49,540 --> 00:14:50,930 Nó chỉ là một số giá trị rác. 340 00:14:50,930 --> 00:14:54,170 Bởi vì bất cứ lúc nào bạn khai báo một biến trong C, nó chỉ là một số giá trị rác, 341 00:14:54,170 --> 00:14:56,220 và chúng ta bắt đầu chuyến đi trên thực tế này. 342 00:14:56,220 --> 00:14:59,720 Bây giờ, khi tôi nói với scanf, đi đến địa chỉ này 343 00:14:59,720 --> 00:15:01,520 và đặt bất cứ người dùng đánh vào. 344 00:15:01,520 --> 00:15:06,400 Nếu sử dụng các loại trong hello thế giới, tốt, nơi nào tôi đặt nó? 345 00:15:06,400 --> 00:15:07,750 Đệm là một giá trị rác. 346 00:15:07,750 --> 00:15:11,510 >> Vì vậy, đó là loại giống như một mũi tên đó là chỉ tận nơi đâu. 347 00:15:11,510 --> 00:15:13,880 Có lẽ nó trỏ ngay tại đây trong bộ nhớ của tôi. 348 00:15:13,880 --> 00:15:16,560 Và do đó, khi người sử dụng loại trong hello thế giới, 349 00:15:16,560 --> 00:15:22,380 chương trình cố gắng để đưa các chuỗi hello world backslash 0 350 00:15:22,380 --> 00:15:23,910 trong đó đoạn bộ nhớ. 351 00:15:23,910 --> 00:15:27,070 Nhưng với xác suất cao, nhưng rõ ràng không phải là 100% xác suất, 352 00:15:27,070 --> 00:15:30,440 máy tính sẽ sụp đổ sau đó chương trình này vì đây không phải là 353 00:15:30,440 --> 00:15:32,490 nhớ tôi nên được phép chạm. 354 00:15:32,490 --> 00:15:36,330 Vì vậy, trong ngắn hạn, chương trình này là thiếu sót cho chính xác lý do đó. 355 00:15:36,330 --> 00:15:38,070 Tôi về cơ bản không làm những gì? 356 00:15:38,070 --> 00:15:42,366 Những bước có tôi bỏ qua, giống như chúng ta bỏ qua với ví dụ đầu tiên Binky của? 357 00:15:42,366 --> 00:15:42,866 Yeah? 358 00:15:42,866 --> 00:15:43,710 >> Đung cấp phát bộ nhớ? 359 00:15:43,710 --> 00:15:45,001 >> DAVID Malan: Cấp phát bộ nhớ. 360 00:15:45,001 --> 00:15:48,400 Tôi đã không thực sự phân bổ bất kỳ bộ nhớ cho chuỗi đó. 361 00:15:48,400 --> 00:15:50,270 Vì vậy, chúng tôi có thể sửa lỗi này trong một vài cách. 362 00:15:50,270 --> 00:15:52,700 Một, chúng ta có thể giữ cho nó đơn giản và trong thực tế, bây giờ bạn 363 00:15:52,700 --> 00:15:55,116 sẽ bắt đầu nhìn thấy một mờ của dòng giữa những gì 364 00:15:55,116 --> 00:15:58,520 một mảng là, những gì một chuỗi là gì, char sao là, những gì một mảng các ký tự 365 00:15:58,520 --> 00:15:59,020 là. 366 00:15:59,020 --> 00:16:02,450 Dưới đây là một ví dụ thứ hai liên quan đến các chuỗi và thông báo 367 00:16:02,450 --> 00:16:05,690 tất cả tôi đã thực hiện trên dòng 16 là, thay vì nói 368 00:16:05,690 --> 00:16:09,530 đệm đó là có được một char sao, một con trỏ đến một đoạn bộ nhớ, 369 00:16:09,530 --> 00:16:14,057 Tôi sẽ rất chủ động cung cấp cho bản thân mình một bộ đệm cho 16 nhân vật, 370 00:16:14,057 --> 00:16:16,390 và trong thực tế, nếu bạn đã quen thuộc với đệm hạn, 371 00:16:16,390 --> 00:16:20,570 có lẽ từ thế giới của video, nơi một video là đệm, đệm, 372 00:16:20,570 --> 00:16:21,175 đệm. 373 00:16:21,175 --> 00:16:22,550 Vâng, các kết nối ở đây là gì? 374 00:16:22,550 --> 00:16:24,960 Vâng, bên trong của YouTube và bên trong của người chơi video 375 00:16:24,960 --> 00:16:27,200 nói chung là một mảng đó là lớn hơn 16. 376 00:16:27,200 --> 00:16:30,340 Nó có thể là một mảng có kích thước một megabyte, có thể 10 MB, 377 00:16:30,340 --> 00:16:34,330 và vào mảng mà không trình duyệt của bạn tải về một bó toàn bộ các byte, 378 00:16:34,330 --> 00:16:37,500 một bó toàn bộ MB video, và các máy nghe nhạc video, 379 00:16:37,500 --> 00:16:40,930 Của YouTube hoặc bất cứ ai là, bắt đầu đọc các byte từ mảng đó, 380 00:16:40,930 --> 00:16:43,530 và bất cứ lúc nào bạn nhìn thấy từ đệm, đệm, 381 00:16:43,530 --> 00:16:46,350 đó có nghĩa là người chơi có nhận được đến cuối của mảng đó. 382 00:16:46,350 --> 00:16:50,430 Các mạng như vậy là chậm mà nó không có nạp lại mảng với byte nữa 383 00:16:50,430 --> 00:16:55,610 và do đó, bạn đang trên bit để hiển thị cho người dùng. 384 00:16:55,610 --> 00:16:59,430 >> Vì vậy, bộ đệm là một thuật ngữ apt đây trong đó nó chỉ là một mảng, một đoạn bộ nhớ. 385 00:16:59,430 --> 00:17:02,530 Và điều này sẽ sửa chữa nó vì thực ra 386 00:17:02,530 --> 00:17:07,410 mà bạn có thể điều trị các mảng như thể họ là những địa chỉ, mặc dù đệm 387 00:17:07,410 --> 00:17:10,710 chỉ là một biểu tượng, đó là một chuỗi các ký tự, đệm, 388 00:17:10,710 --> 00:17:14,760 đó là hữu ích cho tôi, các lập trình viên, bạn có thể vượt qua tên của nó xung quanh 389 00:17:14,760 --> 00:17:17,079 như thể đó là một con trỏ, như thể nó 390 00:17:17,079 --> 00:17:21,000 là địa chỉ của một đoạn bộ nhớ trong 16 ký tự. 391 00:17:21,000 --> 00:17:24,530 Vì vậy, đó là để nói, tôi có thể vượt qua scanf chính xác từ đó 392 00:17:24,530 --> 00:17:30,670 và vì vậy bây giờ, nếu tôi thực hiện chương trình này, làm cho scanf 2, dot slash scanf 2, 393 00:17:30,670 --> 00:17:35,386 và gõ hello thế giới, Nhập, time-- đó 394 00:17:35,386 --> 00:17:37,590 >> Hmm, những gì đã xảy ra? 395 00:17:37,590 --> 00:17:39,340 Chuỗi vui lòng. 396 00:17:39,340 --> 00:17:41,430 Tôi đã làm sai cái gì? 397 00:17:41,430 --> 00:17:43,800 Xin chào thế giới, đệm. 398 00:17:43,800 --> 00:17:44,705 Chào thế giới. 399 00:17:44,705 --> 00:17:48,201 400 00:17:48,201 --> 00:17:49,420 Ah, tôi biết nó đang làm gì. 401 00:17:49,420 --> 00:17:49,920 ĐƯỢC. 402 00:17:49,920 --> 00:17:51,628 Vì vậy, nó đọc lên đến khi không gian đầu tiên. 403 00:17:51,628 --> 00:17:55,680 Vì vậy, hãy ăn gian cho chỉ là một khoảnh khắc và nói rằng tôi chỉ muốn gõ gì đó 404 00:17:55,680 --> 00:18:01,408 thực sự lâu dài như thế này là một câu dài đó là một, hai, ba, bốn, năm, 405 00:18:01,408 --> 00:18:04,420 sáu, bảy, tám, chín, 10, 11, 12, 13, 14, 15, 16. 406 00:18:04,420 --> 00:18:05,300 ĐƯỢC. 407 00:18:05,300 --> 00:18:07,600 Nó thực sự là một câu dài. 408 00:18:07,600 --> 00:18:10,710 Vì vậy, câu này là dài hơn 16 ký tự 409 00:18:10,710 --> 00:18:13,670 và do đó, khi tôi nhấn Enter, điều gì sẽ xảy ra? 410 00:18:13,670 --> 00:18:16,940 Vâng, trong trường hợp này của đệm câu chuyện, tôi đã tuyên bố 411 00:18:16,940 --> 00:18:22,190 để thực sự là một mảng với 16 ký tự sẵn sàng để đi. 412 00:18:22,190 --> 00:18:27,426 Vì vậy, một, hai, ba, bốn, năm, sáu, bảy, tám, chín, 10, 11, 12, 13, 14, 413 00:18:27,426 --> 00:18:29,440 15, 16. 414 00:18:29,440 --> 00:18:34,410 Vì vậy, 16 ký tự, và bây giờ, khi tôi đọc trong một cái gì đó như thế này là một lâu 415 00:18:34,410 --> 00:18:43,950 câu, chuyện gì sẽ xảy ra là rằng tôi sẽ đọc trong này là một lâu 416 00:18:43,950 --> 00:18:49,660 S-E-N-T-E-N-C-E, câu. 417 00:18:49,660 --> 00:18:52,270 >> Vì vậy, đây là cố ý một điều xấu mà tôi 418 00:18:52,270 --> 00:18:55,060 giữ bằng văn bản ngoài ranh giới của mảng của tôi, 419 00:18:55,060 --> 00:18:56,660 vượt ra ngoài ranh giới của bộ đệm của tôi. 420 00:18:56,660 --> 00:19:00,100 Tôi có thể nhận được may mắn và chương trình sẽ tiếp tục chạy và không quan tâm, 421 00:19:00,100 --> 00:19:03,450 nhưng nói chung, điều này thực sự sẽ sụp đổ chương trình của tôi, 422 00:19:03,450 --> 00:19:06,440 và nó là một lỗi trong tôi mã thời điểm tôi bước 423 00:19:06,440 --> 00:19:08,576 vượt ra ngoài ranh giới của mảng đó, bởi vì tôi 424 00:19:08,576 --> 00:19:10,450 không biết nếu nó nhất thiết phải đi đến sụp đổ 425 00:19:10,450 --> 00:19:12,120 hoặc nếu tôi chỉ cần đi để có được may mắn. 426 00:19:12,120 --> 00:19:15,750 Vì vậy, đây là vấn đề bởi vì trong trường hợp này, nó có vẻ làm việc 427 00:19:15,750 --> 00:19:20,931 và chúng ta hãy cám dỗ số phận ở đây, mặc dù IDE có vẻ chịu đựng khá một chút 428 00:19:20,931 --> 00:19:21,430 of-- 429 00:19:21,430 --> 00:19:22,040 >> Hiện chúng tôi đi. 430 00:19:22,040 --> 00:19:23,240 Cuối cùng. 431 00:19:23,240 --> 00:19:26,470 Vì vậy, tôi là người duy nhất có thể thấy điều này. 432 00:19:26,470 --> 00:19:29,630 Vì vậy, tôi chỉ có rất nhiều cách gõ fun ra một cụm từ thực tế thực sự lâu dài 433 00:19:29,630 --> 00:19:32,800 rằng nó chắc chắn vượt quá 16 byte, vì tôi 434 00:19:32,800 --> 00:19:38,050 gõ vào điên dài nhiều đường này cụm từ, và sau đó thông báo những gì đã xảy ra. 435 00:19:38,050 --> 00:19:41,110 Chương trình thử in nó và sau đó có một lỗi phân khúc 436 00:19:41,110 --> 00:19:44,430 và lỗi segmentation là khi một cái gì đó như thế này xảy ra 437 00:19:44,430 --> 00:19:47,650 và các hệ điều hành nói Không, không thể chạm vào bộ nhớ. 438 00:19:47,650 --> 00:19:49,570 Chúng tôi đang đi để giết Chương trình hoàn toàn. 439 00:19:49,570 --> 00:19:51,180 >> Vì vậy, điều này có vẻ có vấn đề. 440 00:19:51,180 --> 00:19:54,540 Tôi đã cải thiện các chương trình, theo đó ít nhất có một số bộ nhớ, 441 00:19:54,540 --> 00:19:58,000 nhưng điều này có vẻ như để giới hạn hàm GetString để nhận được 442 00:19:58,000 --> 00:20:00,780 dây của một số chiều dài hữu hạn 16. 443 00:20:00,780 --> 00:20:04,200 Vì vậy, nếu bạn muốn hỗ trợ còn câu hơn 16 ký tự, 444 00:20:04,200 --> 00:20:04,880 Bạn làm gì thế? 445 00:20:04,880 --> 00:20:07,970 Vâng, bạn có thể tăng kích thước của bộ đệm này đến 32 446 00:20:07,970 --> 00:20:09,190 hay mà dường như loại ngắn. 447 00:20:09,190 --> 00:20:12,260 Tại sao chúng ta không chỉ làm cho nó 1,000 nhưng đẩy lùi. 448 00:20:12,260 --> 00:20:17,100 Các phản ứng trực giác của những gì chỉ tránh vấn đề này bằng cách làm 449 00:20:17,100 --> 00:20:20,660 đệm của tôi lớn hơn, giống như 1000 ký tự? 450 00:20:20,660 --> 00:20:23,470 Bằng cách thực hiện GetString cách này. 451 00:20:23,470 --> 00:20:27,130 Những gì là tốt hay xấu đây? 452 00:20:27,130 --> 00:20:28,033 Yeah? 453 00:20:28,033 --> 00:20:30,574 Đung Nếu bạn ràng buộc lên rất nhiều không gian và bạn không sử dụng nó, 454 00:20:30,574 --> 00:20:33,500 sau đó bạn không thể tái phân bổ không gian đó. 455 00:20:33,500 --> 00:20:34,500 DAVID Malan: Tuyệt đối. 456 00:20:34,500 --> 00:20:38,480 Đó là lãng phí trong chừng mực nếu bạn không thực sự cần 900 của những byte 457 00:20:38,480 --> 00:20:41,057 nhưng bạn đang yêu cầu 1.000 trong tổng số anyway, 458 00:20:41,057 --> 00:20:44,140 bạn chỉ cần tốn nhiều bộ nhớ trên máy tính của người sử dụng hơn bạn cần, 459 00:20:44,140 --> 00:20:45,740 và sau khi tất cả, một số bạn đã gặp phải 460 00:20:45,740 --> 00:20:47,620 trong cuộc sống là khi bạn đang chạy rất nhiều chương trình 461 00:20:47,620 --> 00:20:50,470 và họ đang ăn lên rất nhiều bộ nhớ, điều này thực sự có thể ảnh hưởng đến tốc 462 00:20:50,470 --> 00:20:52,220 và kinh nghiệm của người sử dụng trên máy tính. 463 00:20:52,220 --> 00:20:56,090 Vì vậy, đó là loại của một giải pháp lười biếng, chắc chắn, và ngược lại, 464 00:20:56,090 --> 00:21:00,140 nó không chỉ lãng phí, những vấn đề vẫn còn, ngay cả khi tôi làm bộ đệm của tôi 465 00:21:00,140 --> 00:21:02,100 1000? 466 00:21:02,100 --> 00:21:02,600 Yeah? 467 00:21:02,600 --> 00:21:04,475 >> Đung Các chuỗi có chiều dài 1.001. 468 00:21:04,475 --> 00:21:05,350 DAVID Malan: Chính xác. 469 00:21:05,350 --> 00:21:08,280 Nếu chuỗi của bạn là chiều dài 1.001, bạn có cùng một vấn đề chính xác, 470 00:21:08,280 --> 00:21:10,705 và bằng cách lập luận của tôi, tôi sẽ chỉ sau đó làm cho nó năm 2000, 471 00:21:10,705 --> 00:21:12,830 nhưng bạn không biết tiến lớn như thế nào cần, 472 00:21:12,830 --> 00:21:16,890 và nêu ra, tôi phải biên dịch chương trình của tôi trước khi cho phép người sử dụng và tải về 473 00:21:16,890 --> 00:21:17,390 nó. 474 00:21:17,390 --> 00:21:21,490 Vì vậy, đây là chính xác các loại thứ mà cố gắng thư viện CS50 475 00:21:21,490 --> 00:21:24,750 để giúp chúng tôi và chúng tôi sẽ chỉ trong nháy mắt tại một số các thực hiện cơ bản 476 00:21:24,750 --> 00:21:29,790 ở đây, nhưng đây là CS50 dot C. là file đó là được vào CS50 IDE 477 00:21:29,790 --> 00:21:31,420 tất cả các tuần mà bạn đã sử dụng. 478 00:21:31,420 --> 00:21:34,280 Đó là tiền biên dịch và bạn đã được sử dụng nó tự động 479 00:21:34,280 --> 00:21:38,780 bởi bản chất của việc có các dash L CS50 cờ với kêu vang, 480 00:21:38,780 --> 00:21:42,300 nhưng nếu tôi di chuyển xuống qua tất cả các chức năng này, đây là GetString, 481 00:21:42,300 --> 00:21:44,636 và chỉ để cung cấp cho bạn một hương vị của những gì đang xảy ra, 482 00:21:44,636 --> 00:21:46,760 chúng ta hãy xem nhanh sự phức tạp tương đối. 483 00:21:46,760 --> 00:21:48,870 Nó không phải là một siêu dài chức năng, nhưng chúng tôi đã không 484 00:21:48,870 --> 00:21:52,530 phải suy nghĩ tất cả các khó khăn về làm thế nào để đi về nhận chuỗi. 485 00:21:52,530 --> 00:21:55,660 >> Vì vậy, đây là bộ đệm của tôi và tôi dường như khởi tạo nó thành vô giá trị. 486 00:21:55,660 --> 00:21:57,990 Điều này, tất nhiên, là giống như là char sao, 487 00:21:57,990 --> 00:22:00,585 nhưng tôi quyết định ở thực hiện các thư viện CS50 488 00:22:00,585 --> 00:22:02,460 rằng nếu chúng ta sẽ là hoàn toàn năng động, 489 00:22:02,460 --> 00:22:05,770 Tôi không biết trước như thế nào lớn của một người sử dụng chuỗi sẽ muốn nhận được. 490 00:22:05,770 --> 00:22:08,140 Vì vậy, tôi sẽ bắt đầu chỉ với một chuỗi rỗng 491 00:22:08,140 --> 00:22:11,507 và tôi sẽ xây dựng lên càng nhiều bộ nhớ như tôi cần phải phù hợp với những chuỗi người dùng 492 00:22:11,507 --> 00:22:13,340 và nếu tôi không có đủ, tôi sẽ hỏi 493 00:22:13,340 --> 00:22:15,010 hệ điều hành cho nhiều bộ nhớ hơn. 494 00:22:15,010 --> 00:22:17,510 Tôi sẽ chuyển chuỗi của họ thành ra một phần lớn của bộ nhớ 495 00:22:17,510 --> 00:22:21,847 và tôi sẽ phát hành hoặc giải phóng chunk không đủ lớn bộ nhớ 496 00:22:21,847 --> 00:22:23,680 và chúng tôi chỉ đi để làm điều này lặp đi lặp lại. 497 00:22:23,680 --> 00:22:25,570 >> Vì vậy, một cái nhìn nhanh chóng, đây chỉ là một biến 498 00:22:25,570 --> 00:22:28,780 mà tôi sẽ theo dõi năng lực của các bộ đệm của tôi. 499 00:22:28,780 --> 00:22:30,071 Có bao nhiêu byte tôi có thể phù hợp? 500 00:22:30,071 --> 00:22:32,070 Dưới đây là một biến n với mà tôi sẽ giữ 501 00:22:32,070 --> 00:22:36,200 theo dõi bao nhiêu byte thực sự trong bộ đệm hay mà người dùng đã gõ. 502 00:22:36,200 --> 00:22:39,900 Nếu bạn đã không nhìn thấy điều này trước khi, bạn có thể xác định rằng một biến như một int 503 00:22:39,900 --> 00:22:46,370 là unsigned, mà như tên cho thấy, có nghĩa là nó không âm, và tại sao 504 00:22:46,370 --> 00:22:50,590 Tôi đã bao giờ muốn làm phiền nêu rõ rằng một int không chỉ là một int, 505 00:22:50,590 --> 00:22:52,540 nhưng nó là một int unsigned? 506 00:22:52,540 --> 00:22:55,064 Đó là một int không âm. 507 00:22:55,064 --> 00:22:56,355 Nào [Không nghe thấy] có nghĩa là gì? 508 00:22:56,355 --> 00:22:58,910 >> Đung Nó mô tả một số tiền bộ nhớ có thể được [không nghe được]. 509 00:22:58,910 --> 00:22:59,660 >> DAVID Malan: Yeah. 510 00:22:59,660 --> 00:23:03,710 Vì vậy, nếu tôi nói không dấu, điều này thực sự đem lại cho bạn một chút về bộ nhớ thêm 511 00:23:03,710 --> 00:23:07,440 và có vẻ như loại ngớ ngẩn, nhưng nếu bạn có một chút bộ nhớ bổ sung, mà 512 00:23:07,440 --> 00:23:09,940 có nghĩa là bạn có hai lần như nhiều giá trị mà bạn có thể đại diện, 513 00:23:09,940 --> 00:23:11,570 bởi vì nó có thể là 0 hoặc 1. 514 00:23:11,570 --> 00:23:14,660 Vì vậy, theo mặc định, một int có thể được tạm âm 2 tỷ tất cả các cách 515 00:23:14,660 --> 00:23:16,030 lên đến 2 tỷ dương. 516 00:23:16,030 --> 00:23:18,540 Đó là phạm vi lớn, nhưng nó vẫn còn loại lãng phí 517 00:23:18,540 --> 00:23:21,280 nếu bạn chỉ quan tâm kích thước, mà chỉ bằng trực giác 518 00:23:21,280 --> 00:23:24,620 nên không âm hoặc tích cực hoặc 0, cũng sau đó, 519 00:23:24,620 --> 00:23:28,884 tại sao bạn đang lãng phí 2 tỷ giá trị có thể cho số âm 520 00:23:28,884 --> 00:23:30,300 nếu bạn sẽ không bao giờ sử dụng chúng? 521 00:23:30,300 --> 00:23:35,350 Vì vậy, bằng cách nói unsigned, bây giờ tôi có thể int được giữa 0 và khoảng 4 tỷ USD. 522 00:23:35,350 --> 00:23:39,280 >> Vì vậy, đây chỉ là một int C vì lý do chúng tôi sẽ không nhận được vào ngay bây giờ là 523 00:23:39,280 --> 00:23:42,280 tại sao nó là một int thay vì của một char, nhưng ở đây là 524 00:23:42,280 --> 00:23:44,630 các ý chính của những gì đang xảy ra trên, và một số bạn 525 00:23:44,630 --> 00:23:48,340 có thể được sử dụng, ví dụ, Hàm fgetc ngay cả trong PSet bốn 526 00:23:48,340 --> 00:23:51,580 hoặc sau đó, chúng ta sẽ thấy nó một lần nữa trong vấn đề thiết lập năm, 527 00:23:51,580 --> 00:23:55,410 fgetc là tốt đẹp vì như tên loại, sắp xếp của arcanely cho thấy, 528 00:23:55,410 --> 00:23:57,940 đó là một chức năng mà được một nhân vật và vì vậy, 529 00:23:57,940 --> 00:24:00,690 những gì là cơ bản khác nhau về những gì chúng ta đang làm trong GetString 530 00:24:00,690 --> 00:24:03,110 là chúng ta không sử dụng scanf trong cùng một cách. 531 00:24:03,110 --> 00:24:07,550 Chúng tôi chỉ leo cùng bước-by-step hơn bất cứ điều gì người dùng gõ trong, 532 00:24:07,550 --> 00:24:10,970 bởi vì chúng tôi luôn luôn có thể phân bổ một char, và như vậy chúng ta có thể luôn luôn an toàn 533 00:24:10,970 --> 00:24:15,599 nhìn vào một char tại một thời điểm, và sự kỳ diệu bắt đầu xảy ra ở đây. 534 00:24:15,599 --> 00:24:17,890 Tôi sẽ di chuyển xuống giữa chức năng này 535 00:24:17,890 --> 00:24:20,360 chỉ để giới thiệu chức năng này một thời gian ngắn. 536 00:24:20,360 --> 00:24:22,670 Giống như có một Hàm malloc, có 537 00:24:22,670 --> 00:24:27,740 một hàm realloc nơi realloc cho phép bạn phân phối lại một đoạn bộ nhớ 538 00:24:27,740 --> 00:24:29,570 và làm cho nó lớn hơn hoặc nhỏ hơn. 539 00:24:29,570 --> 00:24:33,060 Vì vậy, câu chuyện dài ngắn và với một cái vẫy tay của tôi cho ngày hôm nay, 540 00:24:33,060 --> 00:24:35,620 biết rằng những gì GetString đang làm là nó loại 541 00:24:35,620 --> 00:24:39,720 của tăng trưởng kỳ diệu hay thu hẹp các bộ đệm như người sử dụng 542 00:24:39,720 --> 00:24:41,440 loại trong chuỗi của mình. 543 00:24:41,440 --> 00:24:43,962 >> Vì vậy, nếu người dùng gõ một chuỗi ngắn, mã này 544 00:24:43,962 --> 00:24:45,920 chỉ phân bổ đủ bộ nhớ để phù hợp với chuỗi. 545 00:24:45,920 --> 00:24:48,086 Nếu người sử dụng giữ đánh máy như tôi đã làm nó một lần nữa và một lần nữa 546 00:24:48,086 --> 00:24:50,330 và một lần nữa, tốt, nếu đệm của ban đầu lớn này 547 00:24:50,330 --> 00:24:53,310 và các chương trình nhận ra, để chờ một phút, tôi ra khỏi không gian, 548 00:24:53,310 --> 00:24:55,410 nó sẽ tăng gấp đôi kích thước của bộ đệm 549 00:24:55,410 --> 00:24:59,110 và sau đó tăng gấp đôi kích thước của bộ đệm và các mã nào tăng gấp đôi, 550 00:24:59,110 --> 00:25:03,170 nếu chúng ta nhìn vào nó ở đây, đó là chỉ thông minh một lớp lót này. 551 00:25:03,170 --> 00:25:06,830 Bạn có thể không nhìn thấy cú pháp này trước, nhưng nếu bạn nói sao bằng, 552 00:25:06,830 --> 00:25:10,470 đây là những điều tương tự như nói lần công suất 2. 553 00:25:10,470 --> 00:25:13,390 Vì vậy, nó chỉ giữ tăng gấp đôi năng lực của bộ đệm 554 00:25:13,390 --> 00:25:17,480 và sau đó nói với realloc để cung cấp cho bản thân nhiều bộ nhớ hơn. 555 00:25:17,480 --> 00:25:19,720 >> Bây giờ, như một sang một bên, có là các chức năng khác tại đây 556 00:25:19,720 --> 00:25:23,680 rằng chúng ta sẽ không nhìn vào chi tiết nào khác hơn là để hiển thị trong getInt, 557 00:25:23,680 --> 00:25:26,150 chúng tôi sử dụng GetString trong getInt. 558 00:25:26,150 --> 00:25:28,192 Chúng tôi kiểm tra xem nó không null, trong đó, thu hồi, 559 00:25:28,192 --> 00:25:30,400 là giá trị đặc biệt mà có nghĩa là một cái gì đó đã đi sai. 560 00:25:30,400 --> 00:25:31,233 Chúng tôi ra khỏi bộ nhớ. 561 00:25:31,233 --> 00:25:32,310 Tốt hơn kiểm tra cho điều đó. 562 00:25:32,310 --> 00:25:33,710 Và chúng ta trả lại một giá trị trọng điểm. 563 00:25:33,710 --> 00:25:37,850 Nhưng tôi sẽ làm theo ý kiến ​​như tại sao và sau đó chúng tôi sử dụng anh em họ này của scanf 564 00:25:37,850 --> 00:25:42,100 gọi sscanf và nó quay ra đó sscanf, hoặc chuỗi scanf, 565 00:25:42,100 --> 00:25:45,310 cho phép bạn có một cái nhìn tại các dòng người dùng đã gõ trong và cho bạn 566 00:25:45,310 --> 00:25:49,610 phân tích cơ bản nó và những gì tôi làm ở đây là tôi nói sscanf, 567 00:25:49,610 --> 00:25:54,440 phân tích bất cứ điều gì người dùng có gõ vào và chắc chắn% i, 568 00:25:54,440 --> 00:25:59,250 có một số nguyên trong nó, và chúng tôi sẽ không nhận được vào ngày hôm nay chính xác lý do tại sao cũng có 569 00:25:59,250 --> 00:26:03,760 a% c ở đây, nhưng điều đó một cách ngắn gọn cho phép chúng ta phát hiện nếu người dùng đã gõ 570 00:26:03,760 --> 00:26:06,050 trong một cái gì đó không có thật sau khi số lượng. 571 00:26:06,050 --> 00:26:11,766 Vì vậy, lý do mà getInt và GetString cho bạn biết để thử lại, thử lại, thử lại 572 00:26:11,766 --> 00:26:13,640 là vì tất cả các mã chúng tôi đã viết, 573 00:26:13,640 --> 00:26:17,900 nó loại nhìn vào đầu vào của người dùng trong việc bảo đảm nó hoàn toàn số 574 00:26:17,900 --> 00:26:21,700 hoặc đó là một thực tế nổi giá trị điểm hoặc tương tự, 575 00:26:21,700 --> 00:26:24,233 tùy thuộc vào những gì giá trị chức năng bạn đang sử dụng. 576 00:26:24,233 --> 00:26:25,060 >> Whew. 577 00:26:25,060 --> 00:26:25,710 ĐƯỢC. 578 00:26:25,710 --> 00:26:27,592 Đó là một mouthful nhưng ở đây là 579 00:26:27,592 --> 00:26:29,550 đó là lý do chúng tôi đã có những bánh xe đào tạo về 580 00:26:29,550 --> 00:26:32,880 là bởi vì ở mức thấp nhất, đó chỉ là rất nhiều điều mà 581 00:26:32,880 --> 00:26:35,674 có thể đi sai mà chúng ta muốn preemptively xử lý 582 00:26:35,674 --> 00:26:38,090 những điều chắc chắn trong tuần đầu tiên của lớp, 583 00:26:38,090 --> 00:26:42,230 nhưng bây giờ với PSet bốn PSet năm và ngoài bạn sẽ thấy rằng nó thêm lên cho đến 584 00:26:42,230 --> 00:26:45,570 bạn nhưng cũng có thể bạn đang có khả năng nhiều hơn giải quyết những loại vấn đề 585 00:26:45,570 --> 00:26:47,180 chính mình. 586 00:26:47,180 --> 00:26:51,770 Bất kỳ câu hỏi về GetString hoặc getInt? 587 00:26:51,770 --> 00:26:52,630 Yeah? 588 00:26:52,630 --> 00:26:55,130 >> Đung Tại sao bạn sẽ tăng gấp đôi năng lực của bộ đệm 589 00:26:55,130 --> 00:26:57,630 thay vì chỉ tăng nó bằng số tiền chính xác? 590 00:26:57,630 --> 00:26:58,100 >> DAVID Malan: Câu hỏi rất hay. 591 00:26:58,100 --> 00:27:00,474 Tại sao chúng ta sẽ tăng gấp đôi công suất của bộ đệm như trái ngược 592 00:27:00,474 --> 00:27:02,800 chỉ tăng nó bởi một số giá trị không đổi? 593 00:27:02,800 --> 00:27:03,900 Đó là một quyết định thiết kế. 594 00:27:03,900 --> 00:27:08,590 Chúng tôi chỉ quyết định rằng bởi vì nó có xu hướng là một ít tốn kém thời gian khôn ngoan để hỏi 595 00:27:08,590 --> 00:27:10,440 hệ điều hành cho bộ nhớ, chúng tôi đã không 596 00:27:10,440 --> 00:27:13,210 muốn kết thúc nhận vào một tình huống cho các chuỗi lớn 597 00:27:13,210 --> 00:27:14,960 rằng chúng tôi đã được yêu cầu hệ điều hành một lần nữa và một lần nữa 598 00:27:14,960 --> 00:27:17,500 và một lần nữa và một lần nữa trong kế nhanh chóng cho bộ nhớ. 599 00:27:17,500 --> 00:27:20,387 Vì vậy, chúng tôi chỉ quyết định, phần nào tùy tiện, nhưng chúng tôi hy vọng hợp lý, 600 00:27:20,387 --> 00:27:22,720 rằng, bạn biết không, chúng ta hãy cố gắng để có được trước của mình 601 00:27:22,720 --> 00:27:25,520 và chỉ cần giữ nó để tăng gấp đôi chúng ta giảm thiểu được số lần 602 00:27:25,520 --> 00:27:29,010 chúng tôi phải gọi malloc hoặc realloc, nhưng một bản án tổng cộng 603 00:27:29,010 --> 00:27:31,820 gọi trong trường hợp không biết những gì người dùng có thể muốn gõ. 604 00:27:31,820 --> 00:27:33,600 Cả hai cách có thể gây tranh cãi. 605 00:27:33,600 --> 00:27:35,430 Có thể cho rằng tốt. 606 00:27:35,430 --> 00:27:39,240 >> Vì vậy, chúng ta hãy xem xét một vài các tác dụng phụ khác của bộ nhớ, 607 00:27:39,240 --> 00:27:41,610 thứ có thể đi sai và các công cụ mà bạn có thể 608 00:27:41,610 --> 00:27:43,880 sử dụng để bắt các loại sai lầm. 609 00:27:43,880 --> 00:27:47,800 Hóa ra tất cả các bạn, mặc dù check50 đã không nói với bạn nhiều, 610 00:27:47,800 --> 00:27:50,050 đã được viết buggy Mã kể từ tuần thứ nhất, 611 00:27:50,050 --> 00:27:53,630 thậm chí nếu tất cả các bài kiểm tra check50 là trôi qua, và thậm chí nếu bạn và TF của bạn 612 00:27:53,630 --> 00:27:56,010 là siêu tự tin rằng mã của bạn hoạt động như dự định. 613 00:27:56,010 --> 00:27:59,190 Mã của bạn đã được buggy hay thiếu sót trong đó tất cả các bạn, 614 00:27:59,190 --> 00:28:02,540 trong việc sử dụng các thư viện CS50, đã được rò rỉ bộ nhớ. 615 00:28:02,540 --> 00:28:06,040 Bạn đã yêu cầu hệ điều hành cho bộ nhớ trong hầu hết các chương trình 616 00:28:06,040 --> 00:28:08,850 bạn đã viết, nhưng bạn đã không bao giờ thực sự được đưa nó trở lại. 617 00:28:08,850 --> 00:28:12,110 Bạn đã gọi GetString và getInt và GetFloat, 618 00:28:12,110 --> 00:28:15,270 nhưng với GetString, bạn đã không bao giờ được gọi là unGetString hoặc cho 619 00:28:15,270 --> 00:28:19,890 Chuỗi lại hay như thế, nhưng chúng tôi đã nhìn thấy rằng GetString không cấp phát bộ nhớ 620 00:28:19,890 --> 00:28:22,810 bằng cách này hay malloc Hàm realloc, mà chỉ là 621 00:28:22,810 --> 00:28:25,670 rất giống nhau trong tinh thần, tuy nhiên, chúng tôi đã 622 00:28:25,670 --> 00:28:28,629 yêu cầu hệ điều hành cho bộ nhớ và bộ nhớ một lần nữa và một lần nữa 623 00:28:28,629 --> 00:28:29,670 nhưng không bao giờ cho nó trở lại. 624 00:28:29,670 --> 00:28:33,550 >> Bây giờ, như một sang một bên, nó quay ra rằng khi một chương trình thoát, tất cả các bộ nhớ 625 00:28:33,550 --> 00:28:34,870 được tự động giải phóng. 626 00:28:34,870 --> 00:28:36,150 Vì vậy, nó không phải là một việc rất lớn. 627 00:28:36,150 --> 00:28:38,590 Nó sẽ không để phá vỡ IDE hoặc những thứ chậm lại, 628 00:28:38,590 --> 00:28:40,670 nhưng khi chương trình làm thường bị rò rỉ bộ nhớ 629 00:28:40,670 --> 00:28:42,170 và họ đang chạy trong một thời gian dài. 630 00:28:42,170 --> 00:28:45,640 Nếu bạn đã từng nhìn thấy chút ngu ngốc bãi biển bóng trong Mac OS hoặc đồng hồ cát 631 00:28:45,640 --> 00:28:51,160 trên Windows mà nó loại làm chậm lại hoặc suy nghĩ hay suy nghĩ 632 00:28:51,160 --> 00:28:53,770 hoặc chỉ thực sự bắt đầu chậm như rùa bò, 633 00:28:53,770 --> 00:28:56,960 nó rất có thể có thể được kết quả của một rò rỉ bộ nhớ. 634 00:28:56,960 --> 00:28:59,970 Những lập trình viên viết phần mềm bạn đang sử dụng 635 00:28:59,970 --> 00:29:03,570 yêu cầu hệ điều hành cho bộ nhớ mỗi vài phút, từng giờ. 636 00:29:03,570 --> 00:29:05,570 Nhưng nếu bạn đang chạy phần mềm, thậm chí nếu nó 637 00:29:05,570 --> 00:29:08,680 giảm thiểu trong máy tính của bạn giờ hoặc ngày kết thúc, 638 00:29:08,680 --> 00:29:11,980 bạn có thể được yêu cầu cho nhiều hơn và nhiều hơn bộ nhớ và không bao giờ thực sự sử dụng nó 639 00:29:11,980 --> 00:29:15,180 và do đó, mã của bạn có thể được, hoặc chương trình có thể bị rò rỉ bộ nhớ, 640 00:29:15,180 --> 00:29:18,350 và nếu bạn bắt đầu bị rò rỉ bộ nhớ, có ít bộ nhớ cho các chương trình khác, 641 00:29:18,350 --> 00:29:21,220 và hiệu quả là để làm chậm tất cả mọi thứ xuống. 642 00:29:21,220 --> 00:29:23,600 >> Bây giờ, điều này là bởi đến nay một trong các chương trình tồi tệ nhất 643 00:29:23,600 --> 00:29:26,350 bạn sẽ có cơ hội để chạy trong chừng mực CS50 644 00:29:26,350 --> 00:29:31,650 như sản lượng của nó càng bí truyền hơn clang hoặc bù hoặc bất kỳ của các lệnh 645 00:29:31,650 --> 00:29:35,930 chương trình dòng chúng tôi đã chạy trước nhưng may mắn, nhúng vào trong đầu ra của nó 646 00:29:35,930 --> 00:29:39,810 là một số lời khuyên hữu ích mà siêu sẽ hữu ích, hoặc cho PSet bốn 647 00:29:39,810 --> 00:29:41,510 hoặc chắc chắn PSet năm. 648 00:29:41,510 --> 00:29:44,250 Vì vậy, valgrind là một công cụ mà có thể được sử dụng để tìm kiếm 649 00:29:44,250 --> 00:29:46,930 rò rỉ bộ nhớ trong chương trình của bạn. 650 00:29:46,930 --> 00:29:48,570 Đó là tương đối đơn giản để chạy. 651 00:29:48,570 --> 00:29:51,420 Bạn chạy valgrind và sau đó, thậm chí mặc dù nó là một chút dài dòng, 652 00:29:51,420 --> 00:29:54,440 dash dash rò rỉ séc bằng đầy đủ, và sau đó chấm 653 00:29:54,440 --> 00:29:56,320 giảm và tên của chương trình của bạn. 654 00:29:56,320 --> 00:30:00,010 Vì vậy, valgrind sau đó sẽ chạy chương trình của bạn và vào cuối của chương trình của bạn 655 00:30:00,010 --> 00:30:02,240 chạy trước khi nó tha và mang đến cho bạn một cửa sổ, 656 00:30:02,240 --> 00:30:04,980 nó sẽ phân tích của bạn chương trình trong khi nó được chạy 657 00:30:04,980 --> 00:30:07,740 và cho bạn biết bạn đã bị rò rỉ bất kỳ bộ nhớ và tốt hơn nữa, 658 00:30:07,740 --> 00:30:10,610 bạn đã chạm vào bộ nhớ không thuộc về bạn? 659 00:30:10,610 --> 00:30:13,700 Nó không thể bắt tất cả mọi thứ, nhưng nó khá tốt trong việc bắt hầu hết mọi thứ. 660 00:30:13,700 --> 00:30:19,700 >> Vì vậy, đây là một ví dụ của việc có chạy của tôi chương trình này, có chạy valgrind, 661 00:30:19,700 --> 00:30:21,470 trên một chương trình gọi là bộ nhớ, và tôi sẽ 662 00:30:21,470 --> 00:30:24,730 để làm nổi bật các đường thẳng cuối cùng là mối quan tâm của chúng tôi. 663 00:30:24,730 --> 00:30:27,690 Vì vậy, có nhiều hơn phiền nhiễu mà tôi đã bị xóa từ các slide. 664 00:30:27,690 --> 00:30:30,930 Nhưng chúng ta hãy xem những gì này Chương trình có khả năng nói với chúng tôi. 665 00:30:30,930 --> 00:30:34,800 Nó có khả năng nói với chúng ta điều như viết không hợp lệ kích thước 4. 666 00:30:34,800 --> 00:30:38,020 Nói cách khác, nếu bạn chạm vào bộ nhớ, đặc biệt 4 byte của bộ nhớ 667 00:30:38,020 --> 00:30:40,350 mà bạn không cần phải có, valgrind có thể nói với bạn rằng. 668 00:30:40,350 --> 00:30:41,660 Viết không hợp lệ kích thước 4. 669 00:30:41,660 --> 00:30:43,640 Bạn chạm vào bốn byte mà bạn không nên có. 670 00:30:43,640 --> 00:30:44,840 Trường hợp bạn đã làm điều đó? 671 00:30:44,840 --> 00:30:45,900 Đây là vẻ đẹp. 672 00:30:45,900 --> 00:30:50,000 Memory dot c dòng 21 là nơi bạn hơi say lên và đó là lý do tại sao nó có ích. 673 00:30:50,000 --> 00:30:53,410 Giống như GDB, nó có thể giúp chỉ cho bạn tại các lỗi thực tế. 674 00:30:53,410 --> 00:30:57,170 >> Bây giờ, con này nhiều hơn một chút tiết, nếu không khó hiểu. 675 00:30:57,170 --> 00:31:01,307 40 byte trong 1 khối chắc chắn bị mất trong lỗ kỷ lục 1 của 1. 676 00:31:01,307 --> 00:31:02,140 Điều đó có nghĩa là gì? 677 00:31:02,140 --> 00:31:05,920 Vâng, nó chỉ có nghĩa là bạn yêu cầu 40 byte và bạn không bao giờ cho nó trở lại. 678 00:31:05,920 --> 00:31:08,930 Bạn gọi malloc hoặc bạn gọi GetString và các hệ điều hành 679 00:31:08,930 --> 00:31:12,450 đã cho bạn 40 byte, nhưng bạn không bao giờ trả tự do hoặc phát hành mà bộ nhớ, 680 00:31:12,450 --> 00:31:15,400 và công bằng, chúng tôi đã không bao giờ hiển thị bạn làm thế nào để trả lại bộ nhớ. 681 00:31:15,400 --> 00:31:17,910 Hóa ra có một siêu chức năng đơn giản được gọi là miễn phí. 682 00:31:17,910 --> 00:31:21,170 Nhận một đối, điều bạn muốn giải phóng hoặc trả lại, 683 00:31:21,170 --> 00:31:23,430 nhưng 40 byte, rõ ràng, trong chương trình này 684 00:31:23,430 --> 00:31:27,300 đã bị mất tại dòng 20 bộ nhớ chấm c. 685 00:31:27,300 --> 00:31:28,650 >> Vì vậy, chúng ta hãy xem chương trình này. 686 00:31:28,650 --> 00:31:31,020 Đó là siêu vô dụng. 687 00:31:31,020 --> 00:31:33,980 Nó chỉ thể hiện sự lỗi này cụ thể. 688 00:31:33,980 --> 00:31:34,920 Vì vậy, chúng ta hãy có một cái nhìn. 689 00:31:34,920 --> 00:31:39,920 Đây là chính và chính, thông báo, các cuộc gọi một chức năng gọi là f và sau đó trả về. 690 00:31:39,920 --> 00:31:41,550 Vì vậy, không phải tất cả những gì thú vị. 691 00:31:41,550 --> 00:31:42,664 F không làm những gì? 692 00:31:42,664 --> 00:31:44,330 Chú ý rằng tôi đã không bận tâm với một nguyên mẫu. 693 00:31:44,330 --> 00:31:46,520 Tôi muốn giữ mã càng ít càng tốt. 694 00:31:46,520 --> 00:31:49,530 Vì vậy, tôi đưa e trên chính và đó là tốt, chắc chắn, 695 00:31:49,530 --> 00:31:51,500 cho các chương trình ngắn như thế này. 696 00:31:51,500 --> 00:31:56,910 Vì vậy, e không trả lại bất cứ điều gì và làm không mất bất cứ điều gì, nhưng nó không làm điều này. 697 00:31:56,910 --> 00:31:59,620 Nó tuyên bố, giống như trong ví dụ Binky, 698 00:31:59,620 --> 00:32:02,682 một con trỏ được gọi là x đó là đi để lưu trữ các địa chỉ của một int. 699 00:32:02,682 --> 00:32:03,890 Vì vậy, đó là phía bên tay trái. 700 00:32:03,890 --> 00:32:07,230 Trong tiếng Anh, là những gì phía bên phải làm gì? 701 00:32:07,230 --> 00:32:09,770 Bất cứ ai? 702 00:32:09,770 --> 00:32:13,665 Những gì được này làm cho chúng ta? 703 00:32:13,665 --> 00:32:14,651 Yeah? 704 00:32:14,651 --> 00:32:16,623 >> Đung [Không nghe thấy] lần kích thước của một int 705 00:32:16,623 --> 00:32:19,175 mà là 10 lần [không nghe] 706 00:32:19,175 --> 00:32:20,800 DAVID Malan: Tốt và để tôi tóm tắt. 707 00:32:20,800 --> 00:32:25,480 Vì vậy, phân bổ không gian đủ cho 10 số nguyên hoặc 10, kích thước của một int là những gì, 708 00:32:25,480 --> 00:32:29,340 đó là bốn byte, vì vậy 10 lần 4 là 40, do đó phía bên tay phải tôi đã 709 00:32:29,340 --> 00:32:33,930 đánh dấu cho tôi là 40 byte và lưu trữ các địa chỉ của byte đầu tiên 710 00:32:33,930 --> 00:32:34,940 vào x. 711 00:32:34,940 --> 00:32:38,380 Và bây giờ cuối cùng, và đây là nơi Chương trình này là lỗi, những gì 712 00:32:38,380 --> 00:32:41,540 sai với dòng 21 dựa trên logic? 713 00:32:41,540 --> 00:32:45,197 714 00:32:45,197 --> 00:32:46,280 Có gì sai với dòng 21? 715 00:32:46,280 --> 00:32:46,780 Yeah? 716 00:32:46,780 --> 00:32:49,550 Đung Bạn không thể chỉ số vào x [không nghe được]. 717 00:32:49,550 --> 00:32:50,300 DAVID Malan: Yeah. 718 00:32:50,300 --> 00:32:52,270 Tôi không nên chỉ vào x như thế. 719 00:32:52,270 --> 00:32:53,850 Vì vậy, cú pháp, đó là OK. 720 00:32:53,850 --> 00:32:56,990 Những gì tốt đẹp là, nhiều như bạn có thể đối xử với tên của một mảng 721 00:32:56,990 --> 00:33:01,080 như thể nó là một con trỏ, tương tự bạn có thể đối xử với một con trỏ như thể đó là 722 00:33:01,080 --> 00:33:06,425 một mảng, và vì vậy tôi có thể cú pháp nói x khung một cái gì đó, khung x i, 723 00:33:06,425 --> 00:33:07,800 nhưng 10 là có vấn đề. 724 00:33:07,800 --> 00:33:09,096 Tại sao? 725 00:33:09,096 --> 00:33:10,910 >> Đung Bởi vì nó không phải bên trong. 726 00:33:10,910 --> 00:33:12,390 >> DAVID Malan: Nó không trong đó đoạn bộ nhớ. 727 00:33:12,390 --> 00:33:15,306 Giá trị lớn nhất là những gì tôi cần được đặt trong những dấu ngoặc vuông? 728 00:33:15,306 --> 00:33:16,870 9, 0 đến 9. 729 00:33:16,870 --> 00:33:18,160 Bởi vì không lập chỉ mục. 730 00:33:18,160 --> 00:33:20,190 Vì vậy, 0 đến 9 sẽ là tốt. 731 00:33:20,190 --> 00:33:23,960 Bracket 10 là không tốt và nhưng, nhớ lại, mặc dù mỗi lần 732 00:33:23,960 --> 00:33:27,017 Tôi dường như cố gắng làm cho CS50 IDE tai nạn bằng cách gõ vào giá trị không có thật, 733 00:33:27,017 --> 00:33:29,100 nó không luôn luôn hợp tác, và quả thật, bạn thường 734 00:33:29,100 --> 00:33:31,460 nhận được may mắn chỉ vì hệ điều hành không 735 00:33:31,460 --> 00:33:35,467 nhận thấy rằng bạn đã bao giờ nên hơi vượt qua một số đoạn bộ nhớ, 736 00:33:35,467 --> 00:33:38,300 bởi vì bạn đã ở trong kỹ thuật phân đoạn của mình, nhưng thêm vào đó 737 00:33:38,300 --> 00:33:40,940 trong một lớp hệ điều hành, và như vậy một cái gì đó như thế này 738 00:33:40,940 --> 00:33:43,000 có thể rất dễ dàng bị phát hiện. 739 00:33:43,000 --> 00:33:48,120 Chương trình của bạn sẽ không bao giờ sụp đổ nhất quán nhưng có lẽ một lần trong một thời gian. 740 00:33:48,120 --> 00:33:50,610 >> Và như vậy chúng ta hãy cố gắng valgrind về điều này, và đây là 741 00:33:50,610 --> 00:33:52,870 nơi chúng ta sẽ có được lấn át bởi đầu ra trong giây lát. 742 00:33:52,870 --> 00:34:00,810 Vì vậy, hãy nhớ kiểm tra rò rỉ valgrind bằng đầy đủ bộ nhớ dấu chấm dấu gạch chéo. 743 00:34:00,810 --> 00:34:03,040 Và đây là lý do tại sao tôi hứa điều này sẽ áp đảo. 744 00:34:03,040 --> 00:34:05,700 Đây là những gì valgrind, đây là những gì một lập trình, một số năm ago- 745 00:34:05,700 --> 00:34:08,469 đã quyết định nó sẽ là một ý tưởng tốt cho sản lượng để trông giống như. 746 00:34:08,469 --> 00:34:09,750 Vì vậy, chúng ta hãy làm cho cảm giác này. 747 00:34:09,750 --> 00:34:13,120 Vì vậy, tất cả các cách trên trái tay mặt không có lý do tốt 748 00:34:13,120 --> 00:34:16,620 là quá trình ID của chương trình chúng ta chỉ cần chạy, các định danh duy nhất 749 00:34:16,620 --> 00:34:18,030 cho các chương trình, chúng tôi chỉ cần chạy. 750 00:34:18,030 --> 00:34:19,738 Chúng tôi đã xóa mà từ slide, nhưng có 751 00:34:19,738 --> 00:34:22,190 là một số thông tin hữu ích ở đây. 752 00:34:22,190 --> 00:34:24,684 >> Hãy di chuyển lên phía trên rất. 753 00:34:24,684 --> 00:34:25,600 Đây là nơi chúng tôi bắt đầu. 754 00:34:25,600 --> 00:34:27,040 Vì vậy, nó không phải là tất cả mà nhiều đầu ra. 755 00:34:27,040 --> 00:34:30,429 Dưới đây là ghi không hợp lệ kích thước 4 trên dòng 21. 756 00:34:30,429 --> 00:34:31,760 Vâng, đó là gì dòng 21? 757 00:34:31,760 --> 00:34:34,500 Dòng 21 là chính xác này và nó có ý nghĩa 758 00:34:34,500 --> 00:34:37,290 rằng tôi đang ở trong một cách hợp lệ viết 4 byte bởi vì tôi 759 00:34:37,290 --> 00:34:40,389 cố gắng để đưa số nguyên này, mà có thể là bất cứ điều gì, 760 00:34:40,389 --> 00:34:42,370 nó chỉ xảy ra được bằng không, nhưng tôi đang cố gắng 761 00:34:42,370 --> 00:34:44,940 để đặt nó ở một vị trí điều đó không thuộc về tôi. 762 00:34:44,940 --> 00:34:50,900 Hơn nữa, xuống đây, 40 byte trong một khối chắc chắn bị mất trong kỷ lục 1. 763 00:34:50,900 --> 00:34:56,500 Đó là bởi vì khi tôi gọi malloc ở đây, tôi chưa bao giờ thực sự giải phóng bộ nhớ. 764 00:34:56,500 --> 00:34:58,140 >> Vậy làm thế nào chúng ta có thể khắc phục điều này? 765 00:34:58,140 --> 00:35:02,970 Hãy để tôi đi trước và có một chút an toàn hơn và làm 9 đó và để cho tôi ở đây miễn phí x. 766 00:35:02,970 --> 00:35:04,820 Đây là chức năng mới cho ngày hôm nay. 767 00:35:04,820 --> 00:35:11,520 Nếu bây giờ tôi chạy lại làm cho bộ nhớ dấu chấm dấu gạch chéo, chúng ta hãy chạy valgrind vào nó một lần nữa, 768 00:35:11,520 --> 00:35:14,990 tối đa hóa cửa sổ của tôi và nhấn Enter. 769 00:35:14,990 --> 00:35:16,900 Bây giờ, nó là tốt. 770 00:35:16,900 --> 00:35:19,590 Họ chôn những tin tức tốt trong tất cả các đầu ra này. 771 00:35:19,590 --> 00:35:20,810 Tất cả các khối đống là miễn phí. 772 00:35:20,810 --> 00:35:23,604 Chúng tôi sẽ trở lại với những gì các đống là, nhưng không có rò rỉ đều có thể. 773 00:35:23,604 --> 00:35:25,520 Vì vậy, đây chỉ là một công cụ cho bộ công cụ của bạn 774 00:35:25,520 --> 00:35:30,220 mà bạn có thể bắt đầu thấy bây giờ lỗi như thế. 775 00:35:30,220 --> 00:35:34,532 >> Nhưng chúng ta hãy xem những gì hơn có thể đi sai ở đây. 776 00:35:34,532 --> 00:35:38,890 Hãy chuyển đổi ngay bây giờ để thực sự giải quyết một vấn đề. 777 00:35:38,890 --> 00:35:42,440 Là một sang một bên, nếu điều này sẽ làm giảm một chút chút nhầm lẫn hoặc căng thẳng, 778 00:35:42,440 --> 00:35:43,430 này là bây giờ buồn cười. 779 00:35:43,430 --> 00:35:46,400 780 00:35:46,400 --> 00:35:46,900 Yeah. 781 00:35:46,900 --> 00:35:49,040 Đó là khá tốt. 782 00:35:49,040 --> 00:35:50,890 Bởi vì con trỏ là địa chỉ và địa chỉ 783 00:35:50,890 --> 00:35:53,098 nói chung là theo quy ước bằng văn bản với hệ thập lục phân. 784 00:35:53,098 --> 00:35:54,650 Ha, ha, đây là vui bây giờ. 785 00:35:54,650 --> 00:35:58,390 Nhưng dù sao, vì vậy chúng ta hiện nay thực sự giải quyết một vấn đề. 786 00:35:58,390 --> 00:36:00,840 Điều này đã được siêu, siêu cấp thấp cho đến nay, 787 00:36:00,840 --> 00:36:03,950 và chúng tôi thực sự có thể làm hữu ích mọi thứ với những chi tiết ở mức độ thấp. 788 00:36:03,950 --> 00:36:06,710 >> Vì vậy, chúng tôi giới thiệu một vài tuần trước ý niệm về một mảng. 789 00:36:06,710 --> 00:36:09,177 Một mảng là tốt đẹp bởi vì thật khó để làm sạch mã của chúng tôi 790 00:36:09,177 --> 00:36:11,760 bởi vì nếu chúng ta muốn viết một Chương trình với nhiều sinh viên 791 00:36:11,760 --> 00:36:15,270 hoặc nhiều tên và nhà ở và ký túc xá và trường cao đẳng và tất cả điều đó, 792 00:36:15,270 --> 00:36:19,430 chúng ta có thể lưu trữ tất cả mọi thứ hơn sạch bên trong của một mảng. 793 00:36:19,430 --> 00:36:23,039 Nhưng đề xuất một nhược điểm của một mảng cho đến nay. 794 00:36:23,039 --> 00:36:26,080 Thậm chí nếu bạn đã không phải chịu đựng điều đó cho mình trong một chương trình, chỉ theo bản năng, 795 00:36:26,080 --> 00:36:30,870 một điều xấu là gì về một mảng, có lẽ? 796 00:36:30,870 --> 00:36:32,337 Tôi nghe một số tiếng thì thầm. 797 00:36:32,337 --> 00:36:34,170 Đung Thật khó để thay đổi kích thước. 798 00:36:34,170 --> 00:36:36,128 DAVID Malan: Thật khó để thay đổi kích thước. 799 00:36:36,128 --> 00:36:38,660 Bạn không thể thay đổi kích thước của một mảng, trên thực tế, mỗi gia nhập 800 00:36:38,660 --> 00:36:43,040 trong C. Bạn có thể phân bổ một mảng khác, di chuyển tất cả mọi thứ từ một tuổi 801 00:36:43,040 --> 00:36:45,380 vào mới, và bây giờ có một số không gian thêm, 802 00:36:45,380 --> 00:36:47,469 nhưng nó không giống như một ngôn ngữ như Java hay Python 803 00:36:47,469 --> 00:36:49,760 hoặc bất kỳ số khác ngôn ngữ mà một số bạn 804 00:36:49,760 --> 00:36:52,070 có thể là quen thuộc nơi bạn chỉ có thể tiếp tục thêm vào những điều 805 00:36:52,070 --> 00:36:53,930 nauseam quảng cáo vào cuối mảng. 806 00:36:53,930 --> 00:36:57,880 Khi bạn có một mảng của size 6, đó là kích thước của nó, 807 00:36:57,880 --> 00:37:01,970 và như vậy giống như ý tưởng trước đó có một bộ đệm của một kích thước nhất định, 808 00:37:01,970 --> 00:37:05,940 bạn phải đoán ra khỏi cổng những gì kích thước nào bạn muốn nó được? 809 00:37:05,940 --> 00:37:07,880 Nếu bạn đoán quá lớn, bạn đang lãng phí thời gian. 810 00:37:07,880 --> 00:37:10,950 Nếu bạn đoán quá nhỏ, bạn không thể lưu trữ dữ liệu đó, ít nhất 811 00:37:10,950 --> 00:37:12,940 không có rất nhiều công việc nhiều hơn. 812 00:37:12,940 --> 00:37:18,180 >> Vì vậy, ngày hôm nay, nhờ vào con trỏ, chúng ta có thể bắt đầu ghép nối các tùy chỉnh riêng của chúng tôi 813 00:37:18,180 --> 00:37:20,989 cấu trúc dữ liệu, và trong Thực tế, đây là một cái gì đó 814 00:37:20,989 --> 00:37:23,030 trông nhiều hơn một chút khó hiểu ở cái nhìn đầu tiên, 815 00:37:23,030 --> 00:37:26,440 nhưng đây là những gì chúng ta sẽ gọi một liên kết danh sách, và các loại tên của mình tổng kết 816 00:37:26,440 --> 00:37:26,940 nó. 817 00:37:26,940 --> 00:37:29,550 Đó là một danh sách các số, hoặc trong trường hợp này, một danh sách các số, 818 00:37:29,550 --> 00:37:33,480 nhưng nó có thể là một danh sách của bất cứ điều gì, nhưng nó liên kết với nhau bằng cách mũi tên, 819 00:37:33,480 --> 00:37:36,380 và chỉ mất một đoán với những gì kỹ thuật 820 00:37:36,380 --> 00:37:38,310 chúng ta sẽ có thể để khâu lại với nhau, 821 00:37:38,310 --> 00:37:42,540 loại giống như bỏng ngô với một chủ đề, một danh sách liên kết hình chữ nhật ở đây? 822 00:37:42,540 --> 00:37:43,936 Số của nó? 823 00:37:43,936 --> 00:37:45,560 Các tính năng ngôn ngữ cơ bản là gì? 824 00:37:45,560 --> 00:37:46,350 >> Đung Một con trỏ. 825 00:37:46,350 --> 00:37:47,308 >> DAVID Malan: Một con trỏ. 826 00:37:47,308 --> 00:37:51,700 Vì vậy, mỗi người trong các mũi tên ở đây đại diện một con trỏ hoặc chỉ là một địa chỉ. 827 00:37:51,700 --> 00:37:54,590 Vì vậy, nói cách khác, nếu tôi muốn để lưu trữ một danh sách các số, 828 00:37:54,590 --> 00:37:59,040 Tôi không thể chỉ lưu nó nếu tôi muốn khả năng phát triển và co 829 00:37:59,040 --> 00:38:00,990 cấu trúc dữ liệu của tôi trong một mảng. 830 00:38:00,990 --> 00:38:03,000 Vì vậy, tôi cần phải có một chút hơn sự tinh tế, 831 00:38:03,000 --> 00:38:05,720 nhưng thông báo rằng điều này picture loại cho thấy 832 00:38:05,720 --> 00:38:08,650 rằng nếu bạn đã chỉ cần có chút đề kết nối mọi thứ lại với nhau, 833 00:38:08,650 --> 00:38:13,100 có lẽ là không khó để làm cho không gian ở giữa hai trong số những hình chữ nhật 834 00:38:13,100 --> 00:38:16,750 hoặc hai trong số những nút, như chúng ta sẽ bắt đầu gọi điện cho họ, đưa vào một nút mới, 835 00:38:16,750 --> 00:38:19,547 và sau đó với một số chủ đề mới, chỉ mương ba nút với nhau, 836 00:38:19,547 --> 00:38:22,880 người đầu tiên, người cuối cùng, và một trong những mà bạn muốn chèn vào giữa. 837 00:38:22,880 --> 00:38:26,000 >> Và thực sự là một danh sách liên kết, không giống như một mảng, là năng động. 838 00:38:26,000 --> 00:38:27,840 Nó có thể phát triển và nó có thể co lại và bạn không 839 00:38:27,840 --> 00:38:32,434 phải biết hay quan tâm trước bao nhiều dữ liệu bạn sẽ được lưu trữ, 840 00:38:32,434 --> 00:38:35,600 nhưng hóa ra chúng ta có được một chút cẩn thận về cách để thực hiện điều này. 841 00:38:35,600 --> 00:38:39,070 Vì vậy, đầu tiên chúng ta hãy xem xét làm thế nào chúng ta thực hiện một trong những hình chữ nhật nhỏ. 842 00:38:39,070 --> 00:38:40,690 Thật dễ dàng để thực hiện một int. 843 00:38:40,690 --> 00:38:44,000 Bạn chỉ cần nói int n và sau đó bạn nhận được 4 byte cho một int, 844 00:38:44,000 --> 00:38:49,089 nhưng làm thế nào để tôi nhận được một int, gọi nó là n, và sau đó một con trỏ, chúng ta hãy gọi nó bên cạnh. 845 00:38:49,089 --> 00:38:50,880 Chúng ta có thể gọi đó là các điều bất cứ điều gì chúng ta muốn 846 00:38:50,880 --> 00:38:53,590 nhưng tôi cần một cấu trúc dữ liệu tùy chỉnh. 847 00:38:53,590 --> 00:38:54,257 Yeah? 848 00:38:54,257 --> 00:38:57,020 >> Đung ký hiệu [không nghe được]. 849 00:38:57,020 --> 00:39:00,940 >> DAVID Malan: Vậy dấu và chúng tôi sẽ sử dụng để lấy địa chỉ của một nút có khả năng. 850 00:39:00,940 --> 00:39:02,740 Nhưng chúng ta cần một tính năng của C theo thứ tự 851 00:39:02,740 --> 00:39:06,700 để cho tôi khả năng để tạo ra hình chữ nhật tùy chỉnh này, tùy chỉnh này 852 00:39:06,700 --> 00:39:08,919 biến nếu bạn sẽ, trong bộ nhớ. 853 00:39:08,919 --> 00:39:09,710 Đung A struct. 854 00:39:09,710 --> 00:39:10,626 DAVID Malan: Một struct. 855 00:39:10,626 --> 00:39:14,310 Nhớ lại từ tuần trước, chúng tôi giới thiệu cấu trúc, từ khóa tương đối đơn giản này 856 00:39:14,310 --> 00:39:16,254 cho phép chúng ta làm những điều như thế này. 857 00:39:16,254 --> 00:39:18,420 C đã không đến với một dữ liệu cấu trúc được gọi là học sinh. 858 00:39:18,420 --> 00:39:22,190 Nó đi kèm với int và float, char và như vậy, nhưng nó không đến với học sinh, 859 00:39:22,190 --> 00:39:26,750 nhưng chúng ta có thể tạo ra một kiểu dữ liệu học sinh, một cấu trúc sinh viên, với cú pháp này 860 00:39:26,750 --> 00:39:27,250 ở đây. 861 00:39:27,250 --> 00:39:28,350 Và bạn sẽ thấy điều này một lần nữa và một lần nữa. 862 00:39:28,350 --> 00:39:30,426 Vì vậy, đừng lo lắng về ghi nhớ các từ khóa, 863 00:39:30,426 --> 00:39:33,300 nhưng từ khóa mà quan trọng là chỉ thực tế mà chúng tôi đã nói struct 864 00:39:33,300 --> 00:39:37,590 và sau đó chúng ta gọi nó là sinh viên và bên trong của học sinh là một cái tên và một ngôi nhà 865 00:39:37,590 --> 00:39:39,390 hoặc một ký túc xá hoặc tương tự. 866 00:39:39,390 --> 00:39:41,980 >> Và vì vậy bây giờ ngày hôm nay, chúng ta hãy đề xuất này. 867 00:39:41,980 --> 00:39:45,240 Tôi đã thêm một vài từ, nhưng nếu tôi muốn để thực hiện các hình chữ nhật này đó là 868 00:39:45,240 --> 00:39:48,440 có cả một int và một con trỏ, bạn biết không, tôi 869 00:39:48,440 --> 00:39:51,540 muốn khai báo một cấu trúc được gọi là nút. 870 00:39:51,540 --> 00:39:55,630 Tôi cũng, bên trong của nó, sẽ nói rằng một nút, hình chữ nhật này, có một int 871 00:39:55,630 --> 00:39:59,730 và chúng tôi sẽ gọi nó là n và nó có một con trỏ tới. 872 00:39:59,730 --> 00:40:02,540 Và đây là một chút dài dòng, nhưng nếu bạn nghĩ về nó, 873 00:40:02,540 --> 00:40:07,300 các mũi tên đó là trong hình lúc trước là các loại dữ liệu? 874 00:40:07,300 --> 00:40:12,330 Nơi mỗi người trong những mũi tên trỏ để loại cấu trúc dữ liệu? 875 00:40:12,330 --> 00:40:14,332 Nó không chỉ chỉ để một int mỗi se. 876 00:40:14,332 --> 00:40:16,165 Nó chỉ đến toàn bộ điều hình chữ nhật 877 00:40:16,165 --> 00:40:18,720 và rằng điều hình chữ nhật, chúng tôi đã nói, được gọi là một nút. 878 00:40:18,720 --> 00:40:21,720 Và vì vậy chúng tôi có loại để đệ quy định này như 879 00:40:21,720 --> 00:40:26,270 rằng một nút, chúng ta sẽ nói, sẽ chứa một int n 880 00:40:26,270 --> 00:40:31,070 và một con trỏ được gọi tới và Loại cấu trúc dữ liệu mà 881 00:40:31,070 --> 00:40:35,770 mà con trỏ trỏ là rõ ràng sẽ là nút struct. 882 00:40:35,770 --> 00:40:41,550 >> Vì vậy, đây là annoyingly tiết và chỉ để được gàn dở, 883 00:40:41,550 --> 00:40:44,100 lý do tại sao chúng ta không thể chỉ nói điều này, mà thẳng thắn 884 00:40:44,100 --> 00:40:46,860 trông rất dễ đọc hơn, là vì nhớ lại rằng C đọc 885 00:40:46,860 --> 00:40:48,710 những điều trên xuống dưới, từ trái sang phải. 886 00:40:48,710 --> 00:40:54,120 Nó không phải cho đến khi chúng tôi nhận được dấu chấm phẩy mà nút từ khóa thực sự tồn tại. 887 00:40:54,120 --> 00:40:57,980 Vì vậy, nếu chúng ta muốn có loại này tài liệu tham khảo có tính chu kỳ trong các dữ liệu 888 00:40:57,980 --> 00:41:02,120 cấu trúc, chúng ta phải làm điều này, nơi chúng ta nói struct nút ở phía trên, mà 889 00:41:02,120 --> 00:41:06,770 cho chúng ta một con đường dài của mô tả này điều, sau đó bên trong chúng tôi nói struct node, 890 00:41:06,770 --> 00:41:09,560 và sau đó ở dòng cuối cùng chúng ta nói, tất cả các quyền, C, bằng cách này, 891 00:41:09,560 --> 00:41:12,060 chỉ cần gọi toàn bộ chết tiệt này điều một nút và dừng 892 00:41:12,060 --> 00:41:14,360 sử dụng các cấu trúc từ khóa hoàn toàn. 893 00:41:14,360 --> 00:41:18,030 Vì vậy, đây chỉ là sắp xếp của một cú pháp trick mà cuối cùng cho phép chúng tôi tạo ra 894 00:41:18,030 --> 00:41:21,370 một cái gì đó trông giống hệt như thế này. 895 00:41:21,370 --> 00:41:25,010 >> Vì vậy, nếu chúng ta giả sử bây giờ chúng tôi có thể thực hiện điều này trong C, 896 00:41:25,010 --> 00:41:28,040 làm thế nào để chúng tôi thực sự bắt đầu vượt qua điều này? 897 00:41:28,040 --> 00:41:32,360 Vâng, trên thực tế, tất cả chúng ta phải làm là lặp từ trái sang phải và chỉ 898 00:41:32,360 --> 00:41:35,960 loại chèn các nút hoặc xóa các nút hoặc tìm kiếm những điều bất cứ nơi nào chúng ta muốn, 899 00:41:35,960 --> 00:41:39,560 nhưng để làm được điều này, chúng ta hãy đi trước và thực hiện một ít những điều thực tế hơn vì đây 900 00:41:39,560 --> 00:41:42,560 đã được siêu cấp thấp cho đến nay. 901 00:41:42,560 --> 00:41:45,700 Bất cứ ai có nghĩa là muốn là người đầu tiên? 902 00:41:45,700 --> 00:41:46,200 ĐƯỢC. 903 00:41:46,200 --> 00:41:47,092 Nào lên. 904 00:41:47,092 --> 00:41:47,800 Tên bạn là gì? 905 00:41:47,800 --> 00:41:48,499 >> DAVID: David. 906 00:41:48,499 --> 00:41:49,290 DAVID Malan: David. 907 00:41:49,290 --> 00:41:49,998 Rất hân hạnh được biết bạn. 908 00:41:49,998 --> 00:41:50,960 Tôi cũng thế. 909 00:41:50,960 --> 00:41:52,450 Được rồi. 910 00:41:52,450 --> 00:41:53,990 Và chúng ta cần một số 9. 911 00:41:53,990 --> 00:41:55,240 Không tốt như lần đầu tiên, có lẽ. 912 00:41:55,240 --> 00:41:56,430 OK, số 9. 913 00:41:56,430 --> 00:41:59,667 Một số 17, xin vui lòng. 914 00:41:59,667 --> 00:42:01,000 Hãy để tôi đi lại xa hơn một chút. 915 00:42:01,000 --> 00:42:03,980 Số 22, xin vui lòng, và làm thế nào về xa trở lại 916 00:42:03,980 --> 00:42:06,344 nếu tôi có thể nhìn thấy bất kỳ tay với tất cả các ánh sáng hay không. 917 00:42:06,344 --> 00:42:08,010 Có người bị tình nguyện ngay tại đó. 918 00:42:08,010 --> 00:42:08,968 Bạn có muốn đi lên? 919 00:42:08,968 --> 00:42:10,450 Cẳng tay của bạn được dùng vũ lực đi lên. 920 00:42:10,450 --> 00:42:12,340 OK, 17. 921 00:42:12,340 --> 00:42:13,690 22. 922 00:42:13,690 --> 00:42:15,120 26 đang xuống. 923 00:42:15,120 --> 00:42:18,450 Bất cứ ai khác muốn forcefully-- Nào lên. 924 00:42:18,450 --> 00:42:21,030 Một tình nguyện viên thực tế. 925 00:42:21,030 --> 00:42:23,330 >> Vì vậy, rất nhanh chóng, nếu các bạn có thể sắp xếp 926 00:42:23,330 --> 00:42:26,550 mình chỉ thích các nút trên màn hình. 927 00:42:26,550 --> 00:42:27,510 Cam on. 928 00:42:27,510 --> 00:42:29,234 Và bạn sẽ có 26. 929 00:42:29,234 --> 00:42:30,650 Tất cả các quyền giới thiệu và nhanh chóng. 930 00:42:30,650 --> 00:42:32,139 Vì vậy, tôi David và bạn cũng được? 931 00:42:32,139 --> 00:42:32,680 DAVID: David. 932 00:42:32,680 --> 00:42:33,721 DAVID Malan: Và bạn? 933 00:42:33,721 --> 00:42:34,229 Jake: Jake. 934 00:42:34,229 --> 00:42:34,729 SUE: Sue. 935 00:42:34,729 --> 00:42:35,229 ALEX: Alex. 936 00:42:35,229 --> 00:42:36,475 RAPHAEL: Raphael. 937 00:42:36,475 --> 00:42:37,100 TAYLOR: Taylor. 938 00:42:37,100 --> 00:42:37,466 DAVID Malan: Taylor. 939 00:42:37,466 --> 00:42:37,590 Tuyệt vời. 940 00:42:37,590 --> 00:42:39,810 Vì vậy, đây là những tình nguyện viên của chúng tôi cho hôm nay và đi trước 941 00:42:39,810 --> 00:42:43,090 và thay đổi một chút theo cách đó, và chỉ cần đi trước và giữ 942 00:42:43,090 --> 00:42:47,024 giữ số của bạn như bạn đang hoặc của bạn Dấu hiệu đầu tiên và dùng tay trái của bạn, 943 00:42:47,024 --> 00:42:48,940 đi trước và chỉ cần thực hiện các mũi tên, chỉ 944 00:42:48,940 --> 00:42:51,360 để bàn tay trái của bạn là nghĩa đen chỉ tay vào bất cứ điều gì bạn cần chỉ 945 00:42:51,360 --> 00:42:54,610 tại, và cung cấp cho mình một số phòng để chúng tôi trực quan có thể nhìn thấy cánh tay của bạn thực sự 946 00:42:54,610 --> 00:42:58,120 trỏ, và bạn chỉ có thể trỏ loại ở mặt đất là tốt. 947 00:42:58,120 --> 00:43:03,040 >> Vì vậy, ở đây chúng tôi có một danh sách liên kết của một, hai, ba, bốn, năm nút ban đầu, 948 00:43:03,040 --> 00:43:05,860 và nhận thấy chúng tôi có điều này đặc biệt con trỏ vào đầu người là 949 00:43:05,860 --> 00:43:09,770 chính bởi vì chúng ta phải theo dõi của danh sách Toàn bộ chiều dài bằng cách nào đó. 950 00:43:09,770 --> 00:43:13,590 Những anh chàng này, mặc dù họ đang trái sang phải, trở lại trở lại trong bộ nhớ, 951 00:43:13,590 --> 00:43:15,950 họ thực sự có thể là bất cứ nơi nào trong bộ nhớ của máy tính. 952 00:43:15,950 --> 00:43:18,240 Vì vậy, những kẻ có thể là đứng bất cứ nơi nào trên sân khấu 953 00:43:18,240 --> 00:43:20,960 và đó là tốt, miễn là chúng thực sự chỉ tay vào nhau, 954 00:43:20,960 --> 00:43:22,770 nhưng để giữ cho mọi thứ sạch sẽ và đơn giản, chúng tôi sẽ 955 00:43:22,770 --> 00:43:25,728 chỉ vẽ cho họ trái sang phải như này, nhưng có thể có những khoảng trống lớn 956 00:43:25,728 --> 00:43:26,790 ở giữa các nút. 957 00:43:26,790 --> 00:43:30,710 >> Bây giờ, nếu tôi muốn thực sự chèn một số giá trị mới, chúng ta hãy đi trước và làm điều này. 958 00:43:30,710 --> 00:43:33,720 Chúng tôi có một cơ hội với doanh nghiệp để lựa chọn một nút khác. 959 00:43:33,720 --> 00:43:39,820 Nói chúng ta hãy bắt đầu với mallocing 55. 960 00:43:39,820 --> 00:43:41,320 Một ai đó sẽ nhớ được malloc? 961 00:43:41,320 --> 00:43:42,280 OK, đi lên trên. 962 00:43:42,280 --> 00:43:42,992 Tên bạn là gì? 963 00:43:42,992 --> 00:43:43,700 RAINBOW: Cầu vồng. 964 00:43:43,700 --> 00:43:44,050 DAVID Malan: Cầu vồng? 965 00:43:44,050 --> 00:43:44,810 Được rồi. 966 00:43:44,810 --> 00:43:46,600 Malloc Rainbow. 967 00:43:46,600 --> 00:43:47,450 Nào lên. 968 00:43:47,450 --> 00:43:51,610 Vì vậy, bây giờ chúng ta phải tự hỏi mình thuật toán mà chúng ta có thể đặt 55. 969 00:43:51,610 --> 00:43:53,610 Vì vậy, tất cả chúng ta biết, rõ ràng, nơi cô có thể 970 00:43:53,610 --> 00:43:55,401 thuộc nếu chúng ta đang cố gắng giữ này được sắp xếp 971 00:43:55,401 --> 00:43:58,299 và nếu các bạn có thể lấy một lùi lại vì vậy chúng tôi không rơi ra khỏi 972 00:43:58,299 --> 00:43:59,590 sân khấu, đó sẽ là tuyệt vời. 973 00:43:59,590 --> 00:44:01,420 Vì vậy, trên thực tế, Rainbow, bắt đầu lại ở đây với tôi, 974 00:44:01,420 --> 00:44:04,200 bởi vì chúng tôi là các máy tính hiện nay có thể chỉ thấy một biến tại một thời điểm. 975 00:44:04,200 --> 00:44:05,190 Vì vậy, nếu điều này là nút đầu tiên. 976 00:44:05,190 --> 00:44:07,160 Chú ý ông không phải là một nút, ông chỉ là một con trỏ, 977 00:44:07,160 --> 00:44:10,270 và đó là lý do tại sao anh ta rút ra được chỉ có kích thước của một con trỏ, không 978 00:44:10,270 --> 00:44:11,780 một trong những hình chữ nhật đầy đủ. 979 00:44:11,780 --> 00:44:16,650 Vì vậy, chúng ta sẽ kiểm tra tại mỗi lặp đi lặp lại là 55 ít hơn 9? 980 00:44:16,650 --> 00:44:17,150 Không. 981 00:44:17,150 --> 00:44:19,060 Là 55 ít hơn 17 tuổi? 982 00:44:19,060 --> 00:44:19,720 Không. 983 00:44:19,720 --> 00:44:20,800 Ít hơn 22? 984 00:44:20,800 --> 00:44:22,020 Ít hơn 26? 985 00:44:22,020 --> 00:44:23,390 Ít hơn 34? 986 00:44:23,390 --> 00:44:25,890 Và vì vậy bây giờ, rõ ràng Cầu vồng thuộc ở cuối. 987 00:44:25,890 --> 00:44:27,270 Vì vậy, để được rõ ràng, và những gì là tên của bạn, Taylor? 988 00:44:27,270 --> 00:44:27,895 >> TAYLOR: Taylor. 989 00:44:27,895 --> 00:44:32,510 DAVID Malan: Vậy giữa Taylor tay trái và tay của Rainbow ở đây, 990 00:44:32,510 --> 00:44:38,324 tay mà cần để trỏ vào những gì trong đặt hàng để chèn 55 ​​vào danh sách này? 991 00:44:38,324 --> 00:44:39,240 Những gì chúng ta cần phải làm gì? 992 00:44:39,240 --> 00:44:39,700 Yeah? 993 00:44:39,700 --> 00:44:41,140 >> Đung tay của Taylor cần để trỏ trái. 994 00:44:41,140 --> 00:44:41,680 >> DAVID Malan: Chính xác. 995 00:44:41,680 --> 00:44:43,800 Vì vậy, chèn một nút vào cuối danh sách 996 00:44:43,800 --> 00:44:47,140 là khá đơn giản bởi vì Taylor chỉ có tới điểm, thay vì ở mặt đất 997 00:44:47,140 --> 00:44:49,640 hoặc chúng tôi sẽ gọi nó là null, null là loại sự vắng mặt 998 00:44:49,640 --> 00:44:51,640 của một con trỏ hoặc một đặc biệt zero con trỏ, bạn 999 00:44:51,640 --> 00:44:53,740 sẽ chỉ có trái của bạn tay tại Rainbow và sau đó Rainbow, 1000 00:44:53,740 --> 00:44:55,910 nơi nên trái của bạn Mặt lẽ điểm? 1001 00:44:55,910 --> 00:44:56,570 Down. 1002 00:44:56,570 --> 00:45:00,140 Nó không tốt nếu tay của cô là loại việc chỉ ra ở đây hoặc loại nào 1003 00:45:00,140 --> 00:45:00,640 lối nào. 1004 00:45:00,640 --> 00:45:02,407 Điều đó sẽ được xem xét một giá trị rác, 1005 00:45:02,407 --> 00:45:04,240 nhưng nếu cô ấy chỉ vào một số giá trị đã biết, chúng tôi sẽ 1006 00:45:04,240 --> 00:45:07,360 gọi nó là số không hoặc null, đó là OK bởi vì chúng ta có một thuật ngữ trong này 1007 00:45:07,360 --> 00:45:09,390 và chúng ta biết danh sách các doanh nghiệp được hoàn tất. 1008 00:45:09,390 --> 00:45:11,550 >> Vậy có điều gì khác trường hợp tương đối đơn giản? 1009 00:45:11,550 --> 00:45:13,125 Chúng ta có thể malloc 5? 1010 00:45:13,125 --> 00:45:14,010 Nào lên. 1011 00:45:14,010 --> 00:45:14,782 Tên bạn là gì? 1012 00:45:14,782 --> 00:45:15,490 TIFFANY: Tiffany. 1013 00:45:15,490 --> 00:45:16,000 DAVID Malan: Tôi xin lỗi? 1014 00:45:16,000 --> 00:45:16,470 TIFFANY: Tiffany. 1015 00:45:16,470 --> 00:45:16,880 DAVID Malan: Tiffany. 1016 00:45:16,880 --> 00:45:17,110 Được rồi. 1017 00:45:17,110 --> 00:45:19,071 Tiffany đã được malloced với giá trị 5. 1018 00:45:19,071 --> 00:45:19,570 Nào lên. 1019 00:45:19,570 --> 00:45:23,820 Điều này là tương đối dễ dàng quá, nhưng chúng ta hãy xem xét thứ tự của hoạt động doanh nghiệp. 1020 00:45:23,820 --> 00:45:25,820 Nó là khá dễ dàng với Taylor ở cuối. 1021 00:45:25,820 --> 00:45:30,302 Số 5 là khóa học ít hơn 9, và vì vậy chúng tôi có David, chúng tôi có Tiffany, 1022 00:45:30,302 --> 00:45:31,260 và tên của bạn là gì? 1023 00:45:31,260 --> 00:45:31,680 >> Jake: Jake. 1024 00:45:31,680 --> 00:45:32,470 >> DAVID Malan: Jake. 1025 00:45:32,470 --> 00:45:34,300 Tiffany, Jake và David. 1026 00:45:34,300 --> 00:45:36,580 Tay của ai cần được cập nhật đầu tiên? 1027 00:45:36,580 --> 00:45:39,260 1028 00:45:39,260 --> 00:45:40,590 Làm những gì bạn muốn làm ở đây? 1029 00:45:40,590 --> 00:45:45,244 Có một vài cách có thể, nhưng cũng có một hoặc một cách sai lầm hơn. 1030 00:45:45,244 --> 00:45:46,620 >> ĐỐI TƯỢNG: Bắt đầu với tận cùng bên trái. 1031 00:45:46,620 --> 00:45:47,800 >> DAVID Malan: Bắt đầu với tận cùng bên trái. 1032 00:45:47,800 --> 00:45:49,008 Ai là người ngoài cùng bên trái ở đây sau đó? 1033 00:45:49,008 --> 00:45:49,700 Đung tiên. 1034 00:45:49,700 --> 00:45:50,366 >> DAVID Malan: OK. 1035 00:45:50,366 --> 00:45:53,781 Vì vậy, bắt đầu với đầu và nơi làm bạn muốn cập nhật tay David cho được? 1036 00:45:53,781 --> 00:45:54,780 Đung Hướng tới 5. 1037 00:45:54,780 --> 00:45:55,446 DAVID Malan: OK. 1038 00:45:55,446 --> 00:45:59,026 Vì vậy, David, điểm tại năm hoặc Tiffany ở đây, và bây giờ? 1039 00:45:59,026 --> 00:46:01,072 >> Đung Tiffany chỉ vào 9? 1040 00:46:01,072 --> 00:46:04,030 DAVID Malan: Perfect, trừ Binky của đầu chỉ là loại đã ngã xuống, phải không? 1041 00:46:04,030 --> 00:46:06,820 Bởi vì những gì đang xảy ra với hình ảnh này theo nghĩa đen? 1042 00:46:06,820 --> 00:46:08,070 Đung Không có gì là trỏ. 1043 00:46:08,070 --> 00:46:09,945 DAVID Malan: Không có gì là trỏ đến Jake bây giờ. 1044 00:46:09,945 --> 00:46:13,360 Chúng tôi đã theo nghĩa đen mồ côi 9 và 17, và chúng tôi đã theo nghĩa đen 1045 00:46:13,360 --> 00:46:18,450 bị rò rỉ tất cả bộ nhớ này, bởi vì theo cập nhật tay David đầu tiên, đó là 1046 00:46:18,450 --> 00:46:21,660 tốt trong chừng mực nó một cách chính xác chỉ vào Tiffany bây giờ, 1047 00:46:21,660 --> 00:46:25,410 nhưng nếu không có ai có đủ tầm nhìn xa đến điểm tại Jake, 1048 00:46:25,410 --> 00:46:27,490 sau đó chúng tôi đã bị mất toàn bộ danh sách đó. 1049 00:46:27,490 --> 00:46:28,200 Vì vậy, hãy lùi lại. 1050 00:46:28,200 --> 00:46:30,950 Vì vậy, đó là một điều tốt để vướng chân nhưng chúng ta hãy sửa bây giờ. 1051 00:46:30,950 --> 00:46:33,624 Chúng ta nên làm gì đầu tiên để thay thế? 1052 00:46:33,624 --> 00:46:34,124 Yeah? 1053 00:46:34,124 --> 00:46:35,791 >> Đung Tiffany nên điểm tại 9? 1054 00:46:35,791 --> 00:46:37,582 DAVID Malan: Tôi không thể nhận được rằng gần gũi với bạn. 1055 00:46:37,582 --> 00:46:38,720 Ai nên điểm tại 9? 1056 00:46:38,720 --> 00:46:39,220 >> Đung Tiffany. 1057 00:46:39,220 --> 00:46:39,390 >> DAVID Malan: Tất cả các quyền. 1058 00:46:39,390 --> 00:46:41,200 Vì vậy, Tiffany nên điểm đầu tiên tại 9. 1059 00:46:41,200 --> 00:46:43,550 Vì vậy, Tiffany nên trên giá trị giống hệt nhau 1060 00:46:43,550 --> 00:46:45,820 để David, trong đó có vẻ dự phòng cho một thời điểm, 1061 00:46:45,820 --> 00:46:48,820 nhưng đó là tốt bởi vì bây giờ, thứ hai bước, chúng tôi có thể cập nhật tay của David 1062 00:46:48,820 --> 00:46:52,680 điểm tại Tiffany, và sau đó nếu chúng ta chỉ cần loại sạch mọi thứ lên 1063 00:46:52,680 --> 00:46:55,740 như thể đây là loại giống như mùa xuân, bây giờ đó là một chèn chính xác. 1064 00:46:55,740 --> 00:46:56,700 Vì vậy, tuyệt vời. 1065 00:46:56,700 --> 00:46:57,970 Vì vậy, bây giờ chúng tôi đang gần như ở đó. 1066 00:46:57,970 --> 00:47:01,075 Hãy chèn một thức giá trị như giá trị 20. 1067 00:47:01,075 --> 00:47:03,010 Nếu chúng ta có thể malloc một tình nguyện viên cuối cùng? 1068 00:47:03,010 --> 00:47:04,140 Nào lên. 1069 00:47:04,140 --> 00:47:06,224 Vì vậy, con này nhiều hơn một chút khéo léo. 1070 00:47:06,224 --> 00:47:08,390 Nhưng thực sự, các mã chúng tôi viết, mặc dù bằng lời nói, 1071 00:47:08,390 --> 00:47:10,610 là giống như có một bó nếu điều kiện của doanh nghiệp, phải không? 1072 00:47:10,610 --> 00:47:12,318 Chúng tôi đã có một điều kiện kiểm tra nếu nó thuộc về 1073 00:47:12,318 --> 00:47:13,840 ở cuối, có thể là khởi đầu. 1074 00:47:13,840 --> 00:47:15,940 Chúng tôi cần một số loại vòng lặp để tìm vị trí ở giữa. 1075 00:47:15,940 --> 00:47:17,400 Vì vậy, hãy làm điều đó với tên của bạn là gì? 1076 00:47:17,400 --> 00:47:17,700 >> ERIC: Eric. 1077 00:47:17,700 --> 00:47:18,340 >> DAVID Malan: Eric? 1078 00:47:18,340 --> 00:47:18,660 Eric. 1079 00:47:18,660 --> 00:47:19,368 Rất hân hạnh được biết bạn. 1080 00:47:19,368 --> 00:47:20,490 Vì vậy, chúng tôi có 20. 1081 00:47:20,490 --> 00:47:21,220 Ít hơn năm? 1082 00:47:21,220 --> 00:47:21,530 Không. 1083 00:47:21,530 --> 00:47:22,160 Ít hơn chín? 1084 00:47:22,160 --> 00:47:22,410 Không. 1085 00:47:22,410 --> 00:47:23,050 Ít hơn 17? 1086 00:47:23,050 --> 00:47:23,550 Không. 1087 00:47:23,550 --> 00:47:23,740 ĐƯỢC. 1088 00:47:23,740 --> 00:47:25,701 Ông thuộc ở đây và Tên của bạn một lần nữa là? 1089 00:47:25,701 --> 00:47:26,200 SUE: Sue. 1090 00:47:26,200 --> 00:47:26,880 DAVID Malan: Sue. 1091 00:47:26,880 --> 00:47:27,379 ALEX: Alex. 1092 00:47:27,379 --> 00:47:28,790 DAVID Malan: Sue, Alex, và? 1093 00:47:28,790 --> 00:47:29,290 ERIC: Eric. 1094 00:47:29,290 --> 00:47:30,120 DAVID Malan: Eric. 1095 00:47:30,120 --> 00:47:32,140 Có bàn tay cần phải được cập nhật đầu tiên? 1096 00:47:32,140 --> 00:47:32,930 >> Đung Eric. 1097 00:47:32,930 --> 00:47:33,429 ĐƯỢC. 1098 00:47:33,429 --> 00:47:35,200 Vì vậy, Eric phải chỉ ở đâu? 1099 00:47:35,200 --> 00:47:35,930 Ở tuổi 22. 1100 00:47:35,930 --> 00:47:36,430 Tốt. 1101 00:47:36,430 --> 00:47:38,180 Và bây giờ những gì tiếp theo? 1102 00:47:38,180 --> 00:47:40,800 Sue sau đó có thể chỉ ở Eric và bây giờ, nếu các bạn chỉ 1103 00:47:40,800 --> 00:47:44,077 làm cho một số phòng, mà là tốt trực quan, bây giờ chúng tôi đã thực hiện việc chèn. 1104 00:47:44,077 --> 00:47:47,160 Vì vậy, bây giờ chúng ta hãy xem xét một câu hỏi, nhưng cảm ơn bạn rất nhiều cho các tình nguyện viên của chúng tôi. 1105 00:47:47,160 --> 00:47:48,090 Thực hiện rất tốt. 1106 00:47:48,090 --> 00:47:50,831 Bạn có thể giữ những người, nếu bạn muốn. 1107 00:47:50,831 --> 00:47:54,140 Và chúng tôi có một món quà chia tay đáng yêu nếu mỗi bạn muốn lấy một quả bóng căng thẳng. 1108 00:47:54,140 --> 00:47:56,030 Hãy để tôi chỉ cần vượt qua này xuống. 1109 00:47:56,030 --> 00:47:58,430 Vì vậy, các takeaway của việc này là gì? 1110 00:47:58,430 --> 00:48:02,430 Điều này có vẻ là tuyệt vời trong chừng mực chúng ta có bây giờ 1111 00:48:02,430 --> 00:48:06,360 giới thiệu một thay thế cho một mảng đó không phải là quá giới hạn 1112 00:48:06,360 --> 00:48:07,780 tới một mảng của một số kích thước cố định. 1113 00:48:07,780 --> 00:48:09,380 Họ có thể phát triển năng động. 1114 00:48:09,380 --> 00:48:13,220 >> Nhưng giống như chúng ta đã thấy trong tuần quá khứ, chúng ta không bao giờ có được bất cứ điều gì miễn phí, 1115 00:48:13,220 --> 00:48:15,740 như chắc chắn có một thương mại-off ở đây. 1116 00:48:15,740 --> 00:48:18,890 Vì vậy, với một bề nổi của một liên kết danh sách, là năng động này? 1117 00:48:18,890 --> 00:48:21,590 Khả năng này để phát triển và thẳng thắn, chúng tôi đã có thể làm xóa 1118 00:48:21,590 --> 00:48:23,570 và chúng tôi có thể co lại khi cần thiết. 1119 00:48:23,570 --> 00:48:24,710 Giá những gì chúng ta đang trả tiền? 1120 00:48:24,710 --> 00:48:28,510 1121 00:48:28,510 --> 00:48:30,340 Hai lần như nhiều không gian, đầu tiên của tất cả. 1122 00:48:30,340 --> 00:48:34,010 Nếu bạn nhìn vào bức tranh, không còn Tôi lưu trữ một danh sách các số nguyên. 1123 00:48:34,010 --> 00:48:36,740 Tôi đang lưu trữ một danh sách các số nguyên cộng với con trỏ. 1124 00:48:36,740 --> 00:48:38,240 Vì vậy, tôi tăng gấp đôi số lượng của không gian. 1125 00:48:38,240 --> 00:48:40,740 Bây giờ, có lẽ đó không phải là như vậy một việc lớn 4 byte, 8 byte, 1126 00:48:40,740 --> 00:48:43,160 nhưng nó chắc chắn có thể thêm up cho các tập dữ liệu lớn. 1127 00:48:43,160 --> 00:48:45,570 Nhược điểm khác là gì? 1128 00:48:45,570 --> 00:48:46,070 Yeah? 1129 00:48:46,070 --> 00:48:48,010 >> Đung Chúng ta phải đi qua chúng một-by-một. 1130 00:48:48,010 --> 00:48:48,760 DAVID Malan: Yeah. 1131 00:48:48,760 --> 00:48:50,260 Chúng tôi phải đi qua chúng một-by-một. 1132 00:48:50,260 --> 00:48:53,860 Bạn biết đấy, chúng tôi đã từ bỏ siêu này tính năng thuận tiện của khung vuông 1133 00:48:53,860 --> 00:48:57,240 ký hiệu, đúng hơn được gọi là truy cập ngẫu nhiên, 1134 00:48:57,240 --> 00:48:59,280 đó chúng ta chỉ có thể nhảy đến một yếu tố cá nhân 1135 00:48:59,280 --> 00:49:01,470 nhưng bây giờ nếu tôi vẫn còn tình nguyện viên của tôi ở đây, 1136 00:49:01,470 --> 00:49:04,660 nếu tôi muốn tìm số 22, tôi không thể chỉ 1137 00:49:04,660 --> 00:49:06,620 nhảy đến khung một cái gì đó một cái gì đó. 1138 00:49:06,620 --> 00:49:10,530 Tôi có xem qua danh sách, nhiều ví dụ như tìm kiếm của chúng tôi một cách tuyến tính, 1139 00:49:10,530 --> 00:49:12,260 để tìm số 22. 1140 00:49:12,260 --> 00:49:14,340 Vì vậy, chúng tôi dường như đã phải trả giá đó. 1141 00:49:14,340 --> 00:49:16,430 Nhưng dù sao chúng ta có thể giải quyết các vấn đề khác. 1142 00:49:16,430 --> 00:49:18,587 >> Trong thực tế, để tôi giới thiệu chỉ là một vài hình ảnh. 1143 00:49:18,587 --> 00:49:20,920 Vì vậy, nếu bạn đã được xuống để Nhà trường Mather mới đây, 1144 00:49:20,920 --> 00:49:23,320 bạn sẽ nhớ lại rằng họ ngăn xếp của khay như thế này, 1145 00:49:23,320 --> 00:49:26,300 chúng ta mượn những từ Annenberg trước khi đến lớp. 1146 00:49:26,300 --> 00:49:28,930 Vì vậy, chồng này của khay, mặc dù, là đại diện thực sự 1147 00:49:28,930 --> 00:49:30,860 của một cấu trúc dữ liệu khoa học máy tính. 1148 00:49:30,860 --> 00:49:32,910 Có một cấu trúc dữ liệu khoa học máy tính 1149 00:49:32,910 --> 00:49:38,010 được biết đến như một chồng mà rất độc đáo vay chính nó để chính xác này trực quan. 1150 00:49:38,010 --> 00:49:41,380 Vì vậy, nếu mỗi người trong các khay không phải là một khay nhưng cũng giống như một số và tôi muốn 1151 00:49:41,380 --> 00:49:45,010 để lưu trữ số, tôi có thể đặt một xuống đây, 1152 00:49:45,010 --> 00:49:48,320 và tôi có thể đặt một xuống đây, và tiếp tục xếp số 1153 00:49:48,320 --> 00:49:53,180 trên đầu trang của một người khác, và những gì có tiềm năng hữu ích về điều này 1154 00:49:53,180 --> 00:49:55,450 là hàm ý là những gì cấu trúc dữ liệu này? 1155 00:49:55,450 --> 00:49:58,045 Mà số tôi có thể kéo ra đầu tiên thuận tiện nhất? 1156 00:49:58,045 --> 00:50:00,640 1157 00:50:00,640 --> 00:50:03,030 Gần đây nhất là một đặt trên đó. 1158 00:50:03,030 --> 00:50:06,430 >> Vì vậy, đây là những gì chúng ta sẽ gọi trong khoa học máy tính là một cấu trúc dữ liệu LIFO. 1159 00:50:06,430 --> 00:50:08,070 Kéo vào, ra đầu tiên. 1160 00:50:08,070 --> 00:50:10,800 Và chúng ta sẽ thấy lý do tại sao trước khi dài có thể có ích nhưng bây giờ, 1161 00:50:10,800 --> 00:50:12,200 chỉ xem xét tài sản. 1162 00:50:12,200 --> 00:50:15,158 Và đó là loại ngu ngốc nếu bạn nghĩ về cách phòng ăn hiện nó. 1163 00:50:15,158 --> 00:50:17,910 Mỗi lần họ khay sạch và đặt những cái tươi trên đầu trang, 1164 00:50:17,910 --> 00:50:22,160 bạn có thể có một sạch sẽ trước nhưng cuối cùng rất bẩn và bụi bặm 1165 00:50:22,160 --> 00:50:24,360 khay ở đáy nếu bạn không bao giờ thực sự 1166 00:50:24,360 --> 00:50:26,820 được để dưới cùng của mà đống, bởi vì bạn chỉ 1167 00:50:26,820 --> 00:50:29,380 giữ đặt mới và những người sạch trên đầu trang của nó. 1168 00:50:29,380 --> 00:50:31,840 Điều tương tự cũng có thể xảy ra trong một siêu thị quá. 1169 00:50:31,840 --> 00:50:35,450 Nếu bạn có một trường hợp màn hình hiển thị sữa và mỗi khi CVS 1170 00:50:35,450 --> 00:50:37,610 hoặc bất cứ ai được nhiều sữa hơn, bạn chỉ cần đẩy các loại sữa 1171 00:50:37,610 --> 00:50:39,880 Bạn đã có để trở lại và bạn đặt những cái mới lên phía trước, 1172 00:50:39,880 --> 00:50:43,088 bạn sẽ có một số khá khó chịu sữa ở cuối của cấu trúc dữ liệu, 1173 00:50:43,088 --> 00:50:46,390 bởi vì nó luôn luôn ở phía dưới hoặc tương đương nó luôn luôn ở phía sau. 1174 00:50:46,390 --> 00:50:50,407 >> Nhưng có một cách khác để suy nghĩ về xếp dữ liệu và ví dụ, điều này. 1175 00:50:50,407 --> 00:50:53,490 Nếu bạn là một trong những người thích xếp hàng bên ngoài cửa hàng Apple 1176 00:50:53,490 --> 00:50:55,610 khi một sản phẩm mới xuất hiện ra, có lẽ bạn đang 1177 00:50:55,610 --> 00:50:58,780 không sử dụng một ngăn xếp dữ liệu cấu trúc bởi vì bạn 1178 00:50:58,780 --> 00:51:03,070 sẽ xa lánh mọi người khác là ai xếp hàng để mua một số món đồ chơi mới. 1179 00:51:03,070 --> 00:51:06,610 Thay vào đó, có lẽ bạn đang sử dụng những loại cấu trúc dữ liệu 1180 00:51:06,610 --> 00:51:10,050 hoặc những loại hệ thống trong thế giới thực? 1181 00:51:10,050 --> 00:51:13,493 Hy vọng rằng nó là một đường, hoặc nhiều hơn đúng hay hơn Anh giống như một hàng đợi. 1182 00:51:13,493 --> 00:51:17,700 Và nó chỉ ra một hàng đợi cũng là một cấu trúc dữ liệu trong khoa học máy tính, 1183 00:51:17,700 --> 00:51:19,700 nhưng một hàng đợi có rất tài sản khác nhau. 1184 00:51:19,700 --> 00:51:20,820 Nó không phải LIFO. 1185 00:51:20,820 --> 00:51:21,990 Kéo vào, ra đầu tiên. 1186 00:51:21,990 --> 00:51:22,800 Thiên Chúa cấm. 1187 00:51:22,800 --> 00:51:24,280 Đó là thay vì FIFO. 1188 00:51:24,280 --> 00:51:26,110 Vào trước ra trước. 1189 00:51:26,110 --> 00:51:27,970 Và đó là một điều tốt cho công bằng 'sake 1190 00:51:27,970 --> 00:51:30,428 chắc chắn khi bạn đang xếp hàng up siêu sáng sớm. 1191 00:51:30,428 --> 00:51:33,400 Nếu bạn nhận được ở đó đầu tiên, bạn muốn nhận ra đầu tiên là tốt. 1192 00:51:33,400 --> 00:51:35,880 >> Và vì vậy tất cả những dữ liệu này cấu trúc, hàng đợi và ngăn xếp 1193 00:51:35,880 --> 00:51:39,220 và chùm của người khác, hóa ra bạn có thể suy nghĩ về điều này như chỉ là một mảng. 1194 00:51:39,220 --> 00:51:41,820 Đây là một mảng, có thể một kích thước cố định 4, nhưng nó muốn 1195 00:51:41,820 --> 00:51:44,990 là loại tốt đẹp nếu chúng ta chỉ có thể chồng chất khay gần như vô hạn cao nếu chúng ta 1196 00:51:44,990 --> 00:51:46,780 có nhiều khay hoặc số. 1197 00:51:46,780 --> 00:51:48,840 Vì vậy, có lẽ chúng ta muốn sử dụng một danh sách liên kết ở đây, 1198 00:51:48,840 --> 00:51:51,800 nhưng thương mại-off là có được tiềm năng mà chúng ta cần nhiều bộ nhớ hơn, 1199 00:51:51,800 --> 00:51:55,930 phải mất một ít thời gian hơn, nhưng chúng tôi không hạn chế chiều cao của ngăn xếp, 1200 00:51:55,930 --> 00:51:59,550 giống như trường hợp màn hình hiển thị của Mather có thể giới hạn kích thước của ngăn xếp, 1201 00:51:59,550 --> 00:52:03,117 và vì vậy đây là quyết định thiết kế hoặc tùy chọn có sẵn cho chúng tôi cuối cùng. 1202 00:52:03,117 --> 00:52:04,950 Vì vậy, với những dữ liệu này cấu trúc, chúng tôi đã bắt đầu 1203 00:52:04,950 --> 00:52:09,360 nhìn thấy cận trên mới có khả năng về những gì trước đây đã được siêu nhanh 1204 00:52:09,360 --> 00:52:11,260 và chúng ta sẽ để lại off ngày hôm nay và nơi 1205 00:52:11,260 --> 00:52:13,200 chúng tôi sẽ hy vọng để có được là vào thứ tư, chúng tôi sẽ 1206 00:52:13,200 --> 00:52:15,740 bắt đầu nhìn vào một dữ liệu cấu trúc cho phép chúng ta tìm kiếm 1207 00:52:15,740 --> 00:52:18,260 thông qua các dữ liệu trong thời gian cuối đăng nhập lại. 1208 00:52:18,260 --> 00:52:21,470 Và chúng ta thấy rằng, nhớ lại, trong tuần zero và một với tìm kiếm nhị phân hoặc phân chia 1209 00:52:21,470 --> 00:52:22,180 và chinh phục. 1210 00:52:22,180 --> 00:52:26,240 Nó quay trở lại và tốt hơn nữa, Chén thánh cho trận này 1211 00:52:26,240 --> 00:52:29,510 sẽ được để đến với các cấu trúc dữ liệu mà chạy thật sự 1212 00:52:29,510 --> 00:52:32,070 hoặc về mặt lý thuyết trong thời gian liên tục, theo đó 1213 00:52:32,070 --> 00:52:34,760 nó không quan trọng bao nhiêu hàng triệu hoặc hàng tỉ thứ 1214 00:52:34,760 --> 00:52:38,470 chúng tôi có trong cấu trúc dữ liệu, nó sẽ đưa chúng ta thời gian liên tục, có thể một bước 1215 00:52:38,470 --> 00:52:41,387 hoặc hai bước hoặc 10 bước, nhưng con số liên tục của bước 1216 00:52:41,387 --> 00:52:42,970 để tìm kiếm thông qua cấu trúc dữ liệu. 1217 00:52:42,970 --> 00:52:46,300 Điều đó thực sự sẽ là Chén thánh nhưng thêm vào đó hôm thứ Tư. 1218 00:52:46,300 --> 00:52:49,045 Xem ya sau đó. 1219 00:52:49,045 --> 00:52:53,704 >> [MUSIC CHƠI] 1220 00:52:53,704 --> 00:56:08,448