1 00:00:00,000 --> 00:00:01,110 >> [MUSIC CHƠI] 2 00:00:01,110 --> 00:00:10,567 3 00:00:10,567 --> 00:00:11,650 DAVID J. Malan: Được rồi. 4 00:00:11,650 --> 00:00:15,610 Đây là CS50, và điều này là kết thúc của Tuần Bốn. 5 00:00:15,610 --> 00:00:19,420 Và một trong những chủ đề hôm nay là pháp y kỹ thuật số, 6 00:00:19,420 --> 00:00:20,989 nghệ thuật phục hồi thông tin. 7 00:00:20,989 --> 00:00:22,780 Và thực sự, mặc dù bạn đang ở giữa 8 00:00:22,780 --> 00:00:25,070 ngay bây giờ hòa bình tại Ba và Breakout, vào tuần tới, 9 00:00:25,070 --> 00:00:27,880 sẽ tập trung vào chính xác lĩnh vực này. 10 00:00:27,880 --> 00:00:30,686 >> Vì vậy, một trong những công việc thú vị nhất mà tôi từng đã có được trở lại trường học sau đại học, 11 00:00:30,686 --> 00:00:33,560 khi tôi đang làm việc cho các địa phương Middlesex Biện Lý Quận 12 00:00:33,560 --> 00:00:34,950 văn phòng, làm pháp y làm việc. 13 00:00:34,950 --> 00:00:37,450 Vì vậy, về cơ bản, Massachusetts Cảnh sát Nhà nước, nhân dịp, 14 00:00:37,450 --> 00:00:40,100 khi làm việc trên trường hợp sẽ mang lại những thứ như ổ đĩa cứng 15 00:00:40,100 --> 00:00:42,185 và đĩa mềm và thẻ nhớ và các loại tương tự. 16 00:00:42,185 --> 00:00:44,060 Và họ sẽ giao cho tôi và người thầy của tôi, 17 00:00:44,060 --> 00:00:48,070 và mục tiêu của chúng tôi là tìm ra bằng chứng, nếu có bất kỳ, trên các phương tiện truyền thông. 18 00:00:48,070 --> 00:00:50,700 Bây giờ cái nhìn thoáng qua, bạn có thể đã thấy trên thế giới này pháp y 19 00:00:50,700 --> 00:00:53,000 trong phương tiện truyền thông, truyền hình và phim ảnh. 20 00:00:53,000 --> 00:00:55,730 Nhưng công việc tôi đã có, và dám khẳng định rằng thế giới đó, 21 00:00:55,730 --> 00:00:57,550 không phải là khá như bạn sẽ nhìn thấy nó. 22 00:00:57,550 --> 00:01:00,794 Chúng ta hãy nhìn vào những gì bạn đã có thể nhìn thấy. 23 00:01:00,794 --> 00:01:01,460 [VIDEO xem lại] 24 00:01:01,460 --> 00:01:02,930 -Ok. 25 00:01:02,930 --> 00:01:05,380 Bây giờ, chúng ta có được một cái nhìn tốt ở bạn. 26 00:01:05,380 --> 00:01:06,850 >> [MUSIC CHƠI] 27 00:01:06,850 --> 00:01:12,260 28 00:01:12,260 --> 00:01:12,932 >> -Hold Nó. 29 00:01:12,932 --> 00:01:13,657 Chạy trở lại đó. 30 00:01:13,657 --> 00:01:14,733 >> -Chờ Một phút. 31 00:01:14,733 --> 00:01:15,233 Đi sang phải. 32 00:01:15,233 --> 00:01:16,371 33 00:01:16,371 --> 00:01:16,870 -Có. 34 00:01:16,870 --> 00:01:17,369 Đóng băng đó. 35 00:01:17,369 --> 00:01:17,930 -Toàn Màn hình. 36 00:01:17,930 --> 00:01:18,376 >> -Ok. 37 00:01:18,376 --> 00:01:18,875 Đóng băng đó. 38 00:01:18,875 --> 00:01:20,160 -Tighten Lên trên đó, được không? 39 00:01:20,160 --> 00:01:22,126 >> -Vector Chân vào chàng trai của bánh xe lại. 40 00:01:22,126 --> 00:01:24,435 >> -Zoom Trong ngay tại chỗ này. 41 00:01:24,435 --> 00:01:28,580 >> -Với Quyền thiết bị, các hình ảnh có thể được mở rộng và sắc nét. 42 00:01:28,580 --> 00:01:29,330 >> Cái gì vậy? 43 00:01:29,330 --> 00:01:30,780 >> -Nó Là một chương trình nâng cao. 44 00:01:30,780 --> 00:01:32,170 >> -Cần Bạn rõ ràng là bất kỳ? 45 00:01:32,170 --> 00:01:33,070 >> Tôi không biết. 46 00:01:33,070 --> 00:01:34,150 Chúng ta hãy nâng cao nó. 47 00:01:34,150 --> 00:01:35,440 >> -Enhance Mục A6. 48 00:01:35,440 --> 00:01:36,570 49 00:01:36,570 --> 00:01:38,562 Tôi tăng cường các chi tiết, và- 50 00:01:38,562 --> 00:01:40,020 -I Nghĩ rằng có đủ để tăng cường. 51 00:01:40,020 --> 00:01:40,976 Phát hành nó để màn hình của tôi. 52 00:01:40,976 --> 00:01:42,559 >> -I Tăng cường sự phản chiếu trong mắt cô ấy. 53 00:01:42,559 --> 00:01:44,322 -Let Đang chạy qua tăng cường video. 54 00:01:44,322 --> 00:01:45,210 >> -Edgar, Bạn có thể nâng cao này? 55 00:01:45,210 --> 00:01:45,710 >> -Hang Trên. 56 00:01:45,710 --> 00:01:47,570 57 00:01:47,570 --> 00:01:49,458 >> -Tôi Được làm việc trên phản ánh này. 58 00:01:49,458 --> 00:01:50,402 >> Phản ánh -Có của một ai đó. 59 00:01:50,402 --> 00:01:50,902 >> -Reflection. 60 00:01:50,902 --> 00:01:52,870 -Có Là một sự phản ánh của khuôn mặt của người đàn ông. 61 00:01:52,870 --> 00:01:53,694 >> Phản ánh -Các! 62 00:01:53,694 --> 00:01:54,610 -Có Là một sự phản ánh. 63 00:01:54,610 --> 00:01:55,880 -Zoom Ở trên gương. 64 00:01:55,880 --> 00:01:57,860 Bạn có thể thấy một sự phản ánh. 65 00:01:57,860 --> 00:01:59,630 >> Bạn -Có nâng cao hình ảnh từ đây? 66 00:01:59,630 --> 00:02:00,377 67 00:02:00,377 --> 00:02:01,210 Bạn -Có nâng cao nó? 68 00:02:01,210 --> 00:02:02,190 Bạn -Có nâng cao nó? 69 00:02:02,190 --> 00:02:03,066 Chúng tôi -Có tăng cường này? 70 00:02:03,066 --> 00:02:03,898 Bạn -Có nâng cao nó? 71 00:02:03,898 --> 00:02:04,740 -Hold Trên một giây. 72 00:02:04,740 --> 00:02:05,281 Tôi sẽ tăng cường. 73 00:02:05,281 --> 00:02:06,470 -Zoom Ở trên cửa. 74 00:02:06,470 --> 00:02:06,970 -Times 10. 75 00:02:06,970 --> 00:02:08,009 -Zoom. 76 00:02:08,009 --> 00:02:08,509 -Move Trong. 77 00:02:08,509 --> 00:02:09,340 , Gấp. 78 00:02:09,340 --> 00:02:10,094 -Chờ, Dừng lại. 79 00:02:10,094 --> 00:02:10,750 -Stop. 80 00:02:10,750 --> 00:02:11,250 -Pause Nó. 81 00:02:11,250 --> 00:02:13,542 -Rotate Chúng tôi 75 độ xung quanh theo chiều dọc, xin vui lòng. 82 00:02:13,542 --> 00:02:14,750 83 00:02:14,750 --> 00:02:16,127 >> -Stop. 84 00:02:16,127 --> 00:02:19,330 Quay trở lại phần về cánh cửa một lần nữa. 85 00:02:19,330 --> 00:02:21,420 >> -Got Một tăng cường hình ảnh có thể bitmap? 86 00:02:21,420 --> 00:02:24,420 >> -Có Chúng ta có thể sử dụng Pradeep Singh phương pháp để xem vào cửa sổ. 87 00:02:24,420 --> 00:02:25,902 >> -Các Phần mềm là nhà nước của nghệ thuật. 88 00:02:25,902 --> 00:02:26,866 >> -Các Eigenvalue tắt. 89 00:02:26,866 --> 00:02:29,758 >> -Với Quyền sự kết hợp của algorithms-- 90 00:02:29,758 --> 00:02:32,168 >> Cậu ấy lấy ánh sáng của các thuật toán để cấp độ tiếp theo, 91 00:02:32,168 --> 00:02:34,110 và tôi có thể sử dụng chúng để tăng cường bức ảnh này. 92 00:02:34,110 --> 00:02:36,840 >> -Lock Về và mở rộng các trục z. 93 00:02:36,840 --> 00:02:37,351 >> -Enhance. 94 00:02:37,351 --> 00:02:37,850 Tăng cường. 95 00:02:37,850 --> 00:02:38,720 -Enhance. 96 00:02:38,720 --> 00:02:40,070 -Freeze Và nâng cao. 97 00:02:40,070 --> 00:02:43,420 [END IMG xem lại] 98 00:02:43,420 --> 00:02:45,830 DAVID J. Malan: Vì vậy, những người đang có tất cả các từ, nhưng họ không 99 00:02:45,830 --> 00:02:47,870 được sử dụng trong câu một cách chính xác. 100 00:02:47,870 --> 00:02:52,370 Và thực sự trong tương lai, bất cứ lúc nào, xin vui lòng, bạn nghe ai đó nói một lời, 101 00:02:52,370 --> 00:02:54,250 "Tăng cường", tiếng cười khúc khích một chút. 102 00:02:54,250 --> 00:02:57,190 Bởi vì khi bạn cố gắng để nâng cao, Ví dụ, đây là những gì sẽ xảy ra. 103 00:02:57,190 --> 00:02:58,580 >> Vì vậy, đây là một bức ảnh tuyệt đẹp. 104 00:02:58,580 --> 00:02:59,720 Đây là Daven riêng của CS50. 105 00:02:59,720 --> 00:03:03,740 Và giả sử rằng chúng ta muốn tập trung vào các nháy mắt, 106 00:03:03,740 --> 00:03:05,870 hoặc phản ánh của kẻ xấu đó là rõ ràng 107 00:03:05,870 --> 00:03:07,820 chụp bởi camera an ninh. 108 00:03:07,820 --> 00:03:10,330 Đây là những gì sẽ xảy ra khi bạn phóng to một hình ảnh 109 00:03:10,330 --> 00:03:14,060 chỉ có một số hữu hạn bit liên kết với nó. 110 00:03:14,060 --> 00:03:15,420 >> Đó là những gì bạn sẽ nhận được. 111 00:03:15,420 --> 00:03:19,190 Và quả thực, trong mắt của Daven là nhưng bốn, có lẽ sáu pixel 112 00:03:19,190 --> 00:03:22,110 mà soạn chính xác những gì đã le lói ở đó. 113 00:03:22,110 --> 00:03:25,890 Vì vậy, vấn đề Set Bốn cuối cùng sẽ có bạn khám phá thế giới này, đặc biệt 114 00:03:25,890 --> 00:03:28,090 bởi bản chất của một cái gì đó chúng ta gọi là tập tin I / O, nơi 115 00:03:28,090 --> 00:03:31,000 I / O chỉ là một cách ưa thích của nói đầu vào và đầu ra. 116 00:03:31,000 --> 00:03:34,280 >> Vì vậy, cho đến nay, tất cả các tương tác chúng tôi đã có với một máy tính 117 00:03:34,280 --> 00:03:36,770 đã được phần lớn với bạn bàn phím và màn hình, 118 00:03:36,770 --> 00:03:40,770 nhưng không quá nhiều với các ổ đĩa cứng, hoặc lưu các tập tin vượt ra ngoài những người bạn 119 00:03:40,770 --> 00:03:41,620 mình viết. 120 00:03:41,620 --> 00:03:44,570 Chương trình của bạn vậy, đến nay có không được tạo ra, và tiết kiệm, 121 00:03:44,570 --> 00:03:46,270 và cập nhật các tập tin riêng của họ. 122 00:03:46,270 --> 00:03:47,150 >> Vâng, một tập tin là gì? 123 00:03:47,150 --> 00:03:48,105 Vâng, một cái gì đó giống như một JPEG. 124 00:03:48,105 --> 00:03:50,520 Đây là một hình ảnh có lẽ bạn có hoặc tải lên Facebook, 125 00:03:50,520 --> 00:03:51,690 hoặc nhìn thấy bất cứ nơi nào trên web. 126 00:03:51,690 --> 00:03:54,460 Thật vậy, hình ảnh chúng tôi chỉ cưa của Daven là một JPEG. 127 00:03:54,460 --> 00:03:57,570 Và điều thú vị về các tập tin như hình ảnh JPEG 128 00:03:57,570 --> 00:04:02,170 là họ có thể được xác định, thường, bởi mô hình nhất định các bit. 129 00:04:02,170 --> 00:04:05,200 >> Nói cách khác, nó là gì mà phân biệt một JPEG từ GIF 130 00:04:05,200 --> 00:04:08,109 từ một PING từ Word tài liệu từ một file Excel? 131 00:04:08,109 --> 00:04:09,900 Vâng, nó chỉ khác nhau mô hình của các bit. 132 00:04:09,900 --> 00:04:12,820 Và những mô hình khác nhau thường vào lúc bắt đầu của những tập tin. 133 00:04:12,820 --> 00:04:18,200 >> Vì vậy, khi máy tính của bạn mở Word doc, hoặc khi một máy tính sẽ mở ra một JPEG, 134 00:04:18,200 --> 00:04:20,940 có vẻ thường tại lần đầu tiên một số bit trong tập tin. 135 00:04:20,940 --> 00:04:24,059 Và khi nhận ra những mô hình, nó nói, oh, đây là một hình ảnh. 136 00:04:24,059 --> 00:04:25,850 Hãy để tôi hiển thị nó cho người sử dụng như một hình ảnh. 137 00:04:25,850 --> 00:04:27,870 Hoặc, oh, điều này trông giống như một doc Word. 138 00:04:27,870 --> 00:04:30,480 Hãy để tôi chỉ cho người sử dụng như một bài luận. 139 00:04:30,480 --> 00:04:33,020 >> Vì vậy, ví dụ, hình ảnh JPEG, nó quay ra, là 140 00:04:33,020 --> 00:04:35,460 khá tinh vi bên dưới mui xe. 141 00:04:35,460 --> 00:04:40,140 Nhưng ba byte đầu tiên trong hầu hết tất cả các JPEG bắt đầu với ba con số. 142 00:04:40,140 --> 00:04:44,680 Vì vậy, byte không, một, và hai là, trong hầu hết tất cả các định dạng JPEG, 255, sau đó là số 143 00:04:44,680 --> 00:04:46,675 216, sau đó là số 255. 144 00:04:46,675 --> 00:04:48,990 >> Và những gì bạn sẽ có thể bắt đầu thực hiện vào tuần tới 145 00:04:48,990 --> 00:04:52,920 thực sự là chọc bên dưới mui xe của các tập tin như hình ảnh JPEG 146 00:04:52,920 --> 00:04:57,210 và như các tập tin bitmap, và nhìn thấy những gì luôn luôn ở đó càng lâu 147 00:04:57,210 --> 00:04:58,650 như bạn đã sử dụng máy tính. 148 00:04:58,650 --> 00:05:01,860 >> Nhưng những gì không có thường viết như số thập phân như thế này. 149 00:05:01,860 --> 00:05:04,620 Khoa học máy tính không có xu hướng nói trong thập phân. 150 00:05:04,620 --> 00:05:06,139 Họ không thực sự nói chuyện trong hệ nhị phân. 151 00:05:06,139 --> 00:05:07,930 Thông thường, khi chúng ta muốn thể hiện số, 152 00:05:07,930 --> 00:05:10,710 chúng tôi thực sự sử dụng hệ thập lục phân, mà bạn có thể nhớ lại 153 00:05:10,710 --> 00:05:13,027 từ, nói rằng, vấn đề Set Một, trong đó thách thức 154 00:05:13,027 --> 00:05:14,610 bạn phải suy nghĩ về một hệ thống khác nhau. 155 00:05:14,610 --> 00:05:17,170 >> Chúng tôi, tất nhiên, đã quen thuộc với số thập phân, không thông qua chín. 156 00:05:17,170 --> 00:05:18,215 Chúng tôi nói về nhị phân. 157 00:05:18,215 --> 00:05:20,710 Và chúng tôi không thực sự có để sử dụng nhiều ở đây 158 00:05:20,710 --> 00:05:22,470 vào ra, bởi vì máy tính sẽ sử dụng. 159 00:05:22,470 --> 00:05:24,900 Tuy nhiên, các lập trình viên sẽ rất thường xuyên, nhưng không phải lúc nào, 160 00:05:24,900 --> 00:05:29,360 sử dụng hệ thập lục phân, mà chỉ có nghĩa bạn có 16 chữ cái trong bảng chữ cái của bạn, 161 00:05:29,360 --> 00:05:31,330 như trái ngược với hai hoặc 10. 162 00:05:31,330 --> 00:05:34,530 >> Vì vậy, làm thế nào để bạn đếm đến cao hơn chín trong hệ thập lục phân? 163 00:05:34,530 --> 00:05:41,120 Bạn đi 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, đ, e, chỉ cần theo quy ước. 164 00:05:41,120 --> 00:05:43,540 Nhưng điều quan trọng là mỗi trong số này là một biểu tượng duy nhất. 165 00:05:43,540 --> 00:05:44,340 Không có 10. 166 00:05:44,340 --> 00:05:48,400 Không có 11, cho mỗi gia nhập, bởi vì mỗi các chữ số của bạn, giống như trong hệ thập phân 167 00:05:48,400 --> 00:05:51,940 và cũng giống như trong hệ nhị phân, nên chỉ là một nhân vật duy nhất, theo quy ước. 168 00:05:51,940 --> 00:05:55,280 >> Vì vậy, mà sau đó là bảng chữ cái chúng ta có lúc xử lý của chúng tôi cho hệ thập lục phân. 169 00:05:55,280 --> 00:05:58,600 Vì vậy, những gì hiện một JPEG trông giống như nếu bạn là để viết ra những người đầu tiên ba 170 00:05:58,600 --> 00:06:01,980 không byte là số thập phân nhưng, Ví dụ, như hệ thập lục phân? 171 00:06:01,980 --> 00:06:03,640 Và tại sao hex thậm chí tất cả những gì hữu ích? 172 00:06:03,640 --> 00:06:05,290 >> Vâng, một cái nhìn nhanh một ví dụ. 173 00:06:05,290 --> 00:06:09,030 Vì vậy, nếu tôi viết ra các bit đại diện cho các số thập phân numbers-- 174 00:06:09,030 --> 00:06:12,450 này có thể là một chút gỉ bây giờ từ một vài tuần trở lại, 175 00:06:12,450 --> 00:06:14,820 nhưng một trong những trái và một trong những quyền là khá dễ dàng. 176 00:06:14,820 --> 00:06:17,990 255 là số lượng lớn nhất của chúng tôi có thể đại diện với tám bit. 177 00:06:17,990 --> 00:06:18,820 Đó là tất cả những người thân. 178 00:06:18,820 --> 00:06:21,320 Vì vậy, chỉ có một mà là nhẹ thú vị là một trong những trung. 179 00:06:21,320 --> 00:06:24,700 Và nếu bạn loại làm ra toán học, bạn sẽ suy luận rằng, trên thực tế, 180 00:06:24,700 --> 00:06:27,949 rằng mô hình của một và số không đại diện cho 216. 181 00:06:27,949 --> 00:06:30,240 Vì vậy, chúng ta hãy chỉ định cho bây giờ mà những là chính xác. 182 00:06:30,240 --> 00:06:31,730 Nhưng tại sao điều này là thú vị? 183 00:06:31,730 --> 00:06:33,970 >> Vâng, một byte, tất nhiên, là tám bit. 184 00:06:33,970 --> 00:06:38,980 Và nó chỉ ra rằng nếu bạn nghĩ của một byte như hai khối của bốn bit, 185 00:06:38,980 --> 00:06:39,500 như thế này. 186 00:06:39,500 --> 00:06:41,000 Hãy để tôi chỉ cần thêm một số không gian. 187 00:06:41,000 --> 00:06:42,550 Vì vậy, trước, sau. 188 00:06:42,550 --> 00:06:46,520 Tôi đã chỉ cần thêm một số không gian màu trắng vì lợi ích trực quan ở đây. 189 00:06:46,520 --> 00:06:51,840 Làm thế nào có thể bây giờ chúng tôi đại diện cho trong, nói, thập lục phân mỗi quad bit, 190 00:06:51,840 --> 00:06:52,880 mỗi bộ bốn bit? 191 00:06:52,880 --> 00:06:56,420 >> Vì vậy, ví dụ, bên trái bây giờ, chúng tôi có 1111 trong hệ nhị phân. 192 00:06:56,420 --> 00:07:00,420 Con số trong hệ thập phân là gì, nếu bạn làm ra toán học? 193 00:07:00,420 --> 00:07:03,780 Bạn có nơi những người thân, nơi twos, nơi bốn chân, và nơi Tám. 194 00:07:03,780 --> 00:07:04,341 >> TƯỢNG: 15. 195 00:07:04,341 --> 00:07:05,340 DAVID J. Malan: Đó là 15. 196 00:07:05,340 --> 00:07:08,340 Vì vậy, nếu chúng ta làm tám cộng với bốn cộng với hai cộng một, chúng tôi nhận được 15. 197 00:07:08,340 --> 00:07:11,790 Vì vậy, tôi có thể viết ra 15 dưới đây 1111, nhưng toàn bộ các điểm ở đây 198 00:07:11,790 --> 00:07:13,190 là hệ thập lục phân, không phải thập phân. 199 00:07:13,190 --> 00:07:17,310 Vì vậy, thay vì viết xuống 15, 1-5, Tôi sẽ viết rằng trong hex, 200 00:07:17,310 --> 00:07:22,311 mà nếu bạn nghĩ lại, nếu bạn có không thông qua f, những gì được 15 sẽ là? 201 00:07:22,311 --> 00:07:22,810 TƯỢNG: f. 202 00:07:22,810 --> 00:07:24,434 DAVID J. Malan: Thực ra đó là e. 203 00:07:24,434 --> 00:07:29,140 Và bạn có thể làm việc mà ra bằng cách nói, tốt, nếu một là 10, sau đó OK, e là 15. 204 00:07:29,140 --> 00:07:33,250 Vì vậy, trên thực tế, chúng ta có thể viết lại cùng một tập hợp các con số như f f. 205 00:07:33,250 --> 00:07:35,750 Và sau đó, nếu chúng ta làm một chút về toán học, chúng tôi sẽ suy luận rằng đó là d. 206 00:07:35,750 --> 00:07:38,650 Tám là khá dễ dàng, bởi vì chúng tôi có một trong những nơi Tám. 207 00:07:38,650 --> 00:07:40,620 Và sau đó, chúng tôi có một vài chi tiết f f. 208 00:07:40,620 --> 00:07:44,669 >> Vì vậy, những gì con người có xu hướng làm theo quy ước khi họ sử dụng hệ thập lục phân là họ chỉ 209 00:07:44,669 --> 00:07:47,710 viết này một chút ngắn gọn hơn, thoát khỏi hầu hết các không gian màu trắng. 210 00:07:47,710 --> 00:07:50,890 Và chỉ để được siêu rõ ràng để độc giả rằng đây là hệ thập lục phân, 211 00:07:50,890 --> 00:07:54,670 quy ước đơn giản trong con người là bạn viết không 212 00:07:54,670 --> 00:07:58,000 x, trong đó không có ý nghĩa khác hơn một định hình ảnh của, 213 00:07:58,000 --> 00:07:59,590 ở đây có một số hex. 214 00:07:59,590 --> 00:08:04,210 >> Và sau đó, bạn đặt hai chữ số, f f trong trường hợp này, sau đó d một, sau đó f f. 215 00:08:04,210 --> 00:08:06,700 Vì vậy, câu chuyện dài ngắn, hệ thập lục phân chỉ có xu hướng 216 00:08:06,700 --> 00:08:11,990 là hữu ích bởi vì mỗi mình chữ số, không thông qua f, hoàn toàn dòng 217 00:08:11,990 --> 00:08:13,880 với một mô hình của bốn bit. 218 00:08:13,880 --> 00:08:18,080 >> Vì vậy, nếu bạn có hai chữ số thập lục phân, không thông qua F, một lần nữa và một lần nữa, 219 00:08:18,080 --> 00:08:20,256 cung cấp cho bạn một cách hoàn hảo tám bit hoặc một byte. 220 00:08:20,256 --> 00:08:22,380 Vì vậy, đó là lý do tại sao nó có xu hướng thông thường là hữu ích. 221 00:08:22,380 --> 00:08:24,990 Không có trí tuệ nội dung thực sự vượt ra ngoài đó, 222 00:08:24,990 --> 00:08:27,010 khác với tính thực tế của nó. 223 00:08:27,010 --> 00:08:29,310 >> Bây giờ hình ảnh JPEG không phải là duy nhất tập tin định dạng đồ họa. 224 00:08:29,310 --> 00:08:33,230 Bạn có thể nhớ lại rằng có các tập tin như thế này trên thế giới, 225 00:08:33,230 --> 00:08:34,830 ít nhất là từ một vài năm trở lại. 226 00:08:34,830 --> 00:08:37,580 >> Vì vậy, đây là thực sự cài đặt trong Windows XP 227 00:08:37,580 --> 00:08:39,960 trên hàng triệu máy tính trên toàn thế giới. 228 00:08:39,960 --> 00:08:43,000 Và đây là một tập tin bitmap, BMP. 229 00:08:43,000 --> 00:08:47,690 Và một tập tin bitmap, như bạn sẽ thấy tiếp theo tuần, chỉ có nghĩa là một mô hình của dấu chấm, 230 00:08:47,690 --> 00:08:51,710 pixel như chúng được gọi, một bản đồ trên bit, thực sự. 231 00:08:51,710 --> 00:08:55,160 >> Vì vậy, những gì là thú vị, tuy nhiên, về định dạng tập tin này, BMP, là 232 00:08:55,160 --> 00:08:58,590 rằng bên dưới mui xe, nó có nhiều hơn chỉ là ba byte 233 00:08:58,590 --> 00:09:01,020 mà soạn tiêu đề của nó, vì vậy để nói chuyện, vài miếng đầu tiên. 234 00:09:01,020 --> 00:09:03,330 Nó thực sự có vẻ hơi phức tạp ở cái nhìn đầu tiên. 235 00:09:03,330 --> 00:09:04,704 Và bạn sẽ thấy điều này trong tập P. 236 00:09:04,704 --> 00:09:06,810 Và nhận được một cái gì đó ra cụ thể này ngay bây giờ 237 00:09:06,810 --> 00:09:10,720 không phải là quá quan trọng, vì chỉ thực tế rằng vào đầu mỗi bitmap 238 00:09:10,720 --> 00:09:13,823 tập tin, một định dạng đồ họa, có một bó toàn bộ các con số. 239 00:09:13,823 --> 00:09:14,980 240 00:09:14,980 --> 00:09:16,720 >> Bây giờ Microsoft, tác giả của định dạng này, 241 00:09:16,720 --> 00:09:18,820 có xu hướng gọi những điều không ints và ký tự 242 00:09:18,820 --> 00:09:22,259 và nổi nhưng lời nói và d lời nói và chờ đợi và byte. 243 00:09:22,259 --> 00:09:23,800 Vì vậy, chúng chỉ là các kiểu dữ liệu khác nhau. 244 00:09:23,800 --> 00:09:25,170 Họ là những cái tên khác nhau cho cùng một điều. 245 00:09:25,170 --> 00:09:26,740 Tuy nhiên, bạn sẽ thấy rằng trong P Set Bốn. 246 00:09:26,740 --> 00:09:31,450 >> Nhưng điều này chỉ là để nói rằng nếu một con người double-click một số tập tin BMP vào mình 247 00:09:31,450 --> 00:09:35,015 hoặc ổ đĩa cứng của mình, và một cửa sổ mở ra lên cho anh ta hoặc cô hình ảnh, 248 00:09:35,015 --> 00:09:38,500 đã xảy ra bởi vì các điều hành hệ thống có lẽ nhận thấy không chỉ 249 00:09:38,500 --> 00:09:41,460 phần mở rộng tập tin BMP trong tên tập tin, 250 00:09:41,460 --> 00:09:45,010 nhưng cũng có một thực tế là có một số ước để mô hình của các bit 251 00:09:45,010 --> 00:09:47,490 ngay từ đầu của file bitmap. 252 00:09:47,490 --> 00:09:50,270 >> Nhưng bây giờ chúng ta tập trung vào một tập tin phức tạp như vậy, 253 00:09:50,270 --> 00:09:52,120 nhưng thay vào đó một cái gì đó như thế này. 254 00:09:52,120 --> 00:09:55,190 Giả sử ở đây trong GEdit, tôi chỉ có sự khởi đầu 255 00:09:55,190 --> 00:09:57,070 của một chương trình khá đơn giản. 256 00:09:57,070 --> 00:09:58,860 Tôi đã có một số bao gồm lên hàng đầu. 257 00:09:58,860 --> 00:10:02,120 Bây giờ tôi đã có # include "structs.h" nhưng Tôi sẽ trở lại đó trong một thời điểm. 258 00:10:02,120 --> 00:10:03,974 Nhưng điều này rất hữu ích cho bây giờ. 259 00:10:03,974 --> 00:10:05,890 Vì vậy, đây là một chương trình đó là sẽ thực hiện 260 00:10:05,890 --> 00:10:07,335 như cơ sở dữ liệu của công ty đăng ký. 261 00:10:07,335 --> 00:10:09,710 Vì vậy, một cơ sở dữ liệu của học sinh, và tất cả học sinh trên thế giới 262 00:10:09,710 --> 00:10:13,190 có một cái tên và một ngôi nhà và có lẽ một số công cụ khác, nhưng chúng tôi sẽ giữ nó đơn giản. 263 00:10:13,190 --> 00:10:15,140 Mỗi học sinh có một cái tên và một ngôi nhà. 264 00:10:15,140 --> 00:10:17,700 >> Vì vậy, nếu tôi muốn viết một Chương trình có mục đích trong cuộc sống 265 00:10:17,700 --> 00:10:19,860 chỉ để lặp từ số không vào đến ba, 266 00:10:19,860 --> 00:10:22,070 nếu có ba học sinh tại Đại học Harvard. 267 00:10:22,070 --> 00:10:25,350 Và tôi chỉ muốn có được, sử dụng GetString, Tên của mỗi học sinh và nhà ở, 268 00:10:25,350 --> 00:10:26,600 và sau đó chỉ cần in ra những điều này. 269 00:10:26,600 --> 00:10:28,630 >> Đây là loại giống như tuần Một, hai tuần thứ bây giờ, 270 00:10:28,630 --> 00:10:30,810 nơi mà tôi chỉ muốn có một cho vòng lặp hoặc một cái gì đó như thế. 271 00:10:30,810 --> 00:10:34,500 Và tôi muốn gọi một vài GetString lần, và sau đó in f một vài lần. 272 00:10:34,500 --> 00:10:37,340 Vì vậy, làm thế nào tôi có thể làm điều này, tuy nhiên, khi cả tên và một ngôi nhà 273 00:10:37,340 --> 00:10:39,070 tham gia cho mỗi học sinh? 274 00:10:39,070 --> 00:10:42,830 >> Vì vậy, bản năng đầu tiên của tôi có thể được để làm một cái gì đó như thế này. 275 00:10:42,830 --> 00:10:49,620 Lần đầu tiên tôi có thể nói, tốt, cho tôi, nói, một mảng các chuỗi gọi tên. 276 00:10:49,620 --> 00:10:51,530 Và tôi không muốn có một hardcode ba ở đây. 277 00:10:51,530 --> 00:10:53,064 Tôi muốn gì để đặt ở đó? 278 00:10:53,064 --> 00:10:55,730 Vì vậy, SINH VIÊN, bởi vì đó chỉ là một hằng số khai báo ở trên, 279 00:10:55,730 --> 00:10:57,860 chỉ vì vậy tôi không cần phải hardcode ba ở nhiều nơi. 280 00:10:57,860 --> 00:11:00,859 Bằng cách này, tôi có thể thay đổi nó một nơi, và nó ảnh hưởng đến sự thay đổi ở khắp mọi nơi. 281 00:11:00,859 --> 00:11:04,470 Và sau đó, tôi có thể làm chuỗi nhà HỌC SINH. 282 00:11:04,470 --> 00:11:10,250 >> Và bây giờ, tôi có thể làm điều gì đó như for (int i = 0; i 00:11:14,390 Vì vậy, tôi đánh máy nhanh, nhưng đây là có lẽ cú pháp quen thuộc bây giờ. 284 00:11:14,390 --> 00:11:17,030 >> Và bây giờ, đây là gần đây. 285 00:11:17,030 --> 00:11:22,890 Nếu tôi muốn đặt vào thứ i tên của học sinh, tôi nghĩ rằng tôi làm điều này. 286 00:11:22,890 --> 00:11:26,480 Và sau đó, không phải là tên nhưng ngôi nhà trong ngoặc tôi. 287 00:11:26,480 --> 00:11:29,930 Tôi làm điều này, GetString, và để cho tôi quay trở lại và sửa chữa đường dây này. 288 00:11:29,930 --> 00:11:30,430 Đồng ý không? 289 00:11:30,430 --> 00:11:31,200 Không đồng ý? 290 00:11:31,200 --> 00:11:32,366 Đó không phải là rất dễ sử dụng. 291 00:11:32,366 --> 00:11:33,890 Tôi đã không nói với người sử dụng phải làm gì. 292 00:11:33,890 --> 00:11:36,520 >> Nhưng bây giờ, nếu tôi cũng muốn sau này, chúng ta hãy 293 00:11:36,520 --> 00:11:40,060 nói, in những điều này out-- để TODO sau. 294 00:11:40,060 --> 00:11:42,330 Tôi sẽ làm nhiều hơn với this-- này cho là đang 295 00:11:42,330 --> 00:11:45,970 thực hiện đúng nhận được tên và nhà ở, ba 296 00:11:45,970 --> 00:11:48,870 trong số họ tổng cộng của mỗi, từ một người sử dụng. 297 00:11:48,870 --> 00:11:51,280 >> Nhưng đây không phải là thiết kế rất tốt, phải không? 298 00:11:51,280 --> 00:11:55,220 Nếu học sinh không chỉ có một tên và một ngôi nhà, mà còn một số ID, 299 00:11:55,220 --> 00:11:57,770 và một số điện thoại, và một địa chỉ email, 300 00:11:57,770 --> 00:12:00,280 và có thể là một trang nhà, và Twitter có thể là một xử lý, 301 00:12:00,280 --> 00:12:03,730 và bất kỳ số lượng các chi tiết khác liên kết với một sinh viên hay một người, 302 00:12:03,730 --> 00:12:04,610 nói chung. 303 00:12:04,610 --> 00:12:07,720 Làm thế nào chúng ta sẽ bắt đầu thêm chức năng để chương trình này? 304 00:12:07,720 --> 00:12:14,080 >> Vâng, tôi cảm thấy như cách đơn giản nhất might được để làm một cái gì đó như thế nào, chúng ta hãy nói, 305 00:12:14,080 --> 00:12:16,490 SINH VIÊN int id. 306 00:12:16,490 --> 00:12:18,380 Vì vậy, tôi có thể đặt tất cả các ID của họ trong đó. 307 00:12:18,380 --> 00:12:22,240 Và sau đó, một cái gì đó như số điện thoại, 308 00:12:22,240 --> 00:12:24,400 Tôi không chắc chắn làm thế nào để đại diện cho rằng chỉ được nêu ra. 309 00:12:24,400 --> 00:12:30,280 Vì vậy, chúng ta hãy đi trước và chỉ gọi này Twitter SINH VIÊN, mà 310 00:12:30,280 --> 00:12:33,550 là một chút lạ, nhưng-- và một loạt các lĩnh vực hơn. 311 00:12:33,550 --> 00:12:36,360 >> Tôi đã bắt đầu có hiệu quả sao chép và dán ở đây. 312 00:12:36,360 --> 00:12:39,416 Và điều này là sẽ phát triển khá khó sử dụng khá nhanh chóng, đúng không? 313 00:12:39,416 --> 00:12:42,290 Nó sẽ không được tốt đẹp nếu có trên thế giới một cấu trúc dữ liệu được biết đến 314 00:12:42,290 --> 00:12:45,600 không phải là một int hoặc một chuỗi, nhưng một cái gì đó mức độ cao hơn, một trừu tượng, vì vậy 315 00:12:45,600 --> 00:12:47,570 để nói chuyện, được biết đến như một sinh viên? 316 00:12:47,570 --> 00:12:50,220 C đã không đến với built-in chức năng cho sinh viên, 317 00:12:50,220 --> 00:12:52,260 nhưng những gì nếu tôi muốn để cho nó như vậy? 318 00:12:52,260 --> 00:12:55,640 >> Vâng, nó quay ra, tôi sẽ mở một tập tin gọi là structs.h đây, 319 00:12:55,640 --> 00:12:57,090 và bạn có thể làm chính xác điều đó. 320 00:12:57,090 --> 00:12:58,290 Và chúng ta sẽ bắt đầu làm điều này ngay bây giờ. 321 00:12:58,290 --> 00:13:01,490 Và bên dưới mui xe của P Set Ba, bạn đã được làm điều này ngay bây giờ. 322 00:13:01,490 --> 00:13:05,920 Không có những điều như một g rect hoặc một hình bầu dục g trong ngôn ngữ lập trình C. 323 00:13:05,920 --> 00:13:10,570 >> Folks tại Đại học Stanford thực hiện những các kiểu dữ liệu bằng cách sử dụng phương pháp này ở đây, 324 00:13:10,570 --> 00:13:13,900 tuyên bố dữ liệu mới của mình loại sử dụng một từ khóa mới 325 00:13:13,900 --> 00:13:16,744 gọi là cấu trúc và một một gọi là typedef. 326 00:13:16,744 --> 00:13:19,660 Và thực sự, mặc dù cú pháp nhìn một chút khác nhau từ các công cụ 327 00:13:19,660 --> 00:13:23,550 chúng ta đã thấy trước đây, trong Về nguyên tắc, đó là siêu đơn giản. 328 00:13:23,550 --> 00:13:25,297 >> Điều này chỉ có nghĩa là "định nghĩa một kiểu." 329 00:13:25,297 --> 00:13:27,255 Đó sẽ là một cấu trúc, và một cấu trúc 330 00:13:27,255 --> 00:13:29,400 cũng giống như một container cho nhiều điều. 331 00:13:29,400 --> 00:13:31,780 Và cơ cấu đang diễn ra để có một chuỗi gọi tên, 332 00:13:31,780 --> 00:13:33,210 và một chuỗi gọi là nhà. 333 00:13:33,210 --> 00:13:37,520 Và chúng ta hãy gọi, chỉ cho thuận tiện, toàn bộ học sinh này cấu trúc dữ liệu. 334 00:13:37,520 --> 00:13:40,320 >> Vì vậy, thời điểm này bạn có thể dấu chấm phẩy, bạn có bây giờ 335 00:13:40,320 --> 00:13:43,280 tạo ra dữ liệu của riêng bạn loại được gọi là sinh viên 336 00:13:43,280 --> 00:13:46,420 mà bây giờ đứng bên cạnh int, và float, char, và chuỗi, 337 00:13:46,420 --> 00:13:50,270 và g rect, và g hình bầu dục, và bất kỳ số những thứ khác người đã phát minh ra. 338 00:13:50,270 --> 00:13:53,340 >> Vì vậy, những gì hữu ích về vấn đề này bây giờ là nếu tôi quay trở lại 339 00:13:53,340 --> 00:13:57,430 để tái cấu trúc 0 và kết thúc này thực hiện, mà tôi đã viết 340 00:13:57,430 --> 00:14:02,080 trước đây, nhận thấy rằng tất cả của sự hỗn độn không thể tránh khỏi 341 00:14:02,080 --> 00:14:05,490 là về để bắt đầu xảy ra khi tôi thêm số điện thoại và Twitters và tất cả 342 00:14:05,490 --> 00:14:07,370 những thứ khác để định nghĩa của học sinh, 343 00:14:07,370 --> 00:14:11,810 bây giờ nó ngắn gọn thúc như chỉ là một mảng của các học sinh. 344 00:14:11,810 --> 00:14:15,500 >> Và mỗi người trong số những sinh viên hiện nay có nhiều thứ bên trong của nó. 345 00:14:15,500 --> 00:14:16,930 Vì vậy mà chỉ còn để lại một câu hỏi. 346 00:14:16,930 --> 00:14:19,700 Làm thế nào để bạn có được vào tên, và ngôi nhà, và ID, 347 00:14:19,700 --> 00:14:21,640 và bất cứ điều gì khác là bên trong của học sinh? 348 00:14:21,640 --> 00:14:22,930 Siêu đơn giản, là tốt. 349 00:14:22,930 --> 00:14:25,730 Cú pháp mới, nhưng một ý tưởng đơn giản. 350 00:14:25,730 --> 00:14:29,239 >> Bạn chỉ cần chỉ số vào mảng, như chúng ta đã làm tuần trước và điều này. 351 00:14:29,239 --> 00:14:31,030 Và những gì rõ đoạn mới của cú pháp? 352 00:14:31,030 --> 00:14:32,590 353 00:14:32,590 --> 00:14:35,880 Chỉ cần., Có nghĩa là "đi vào bên trong cấu trúc và được lĩnh vực này được gọi là 354 00:14:35,880 --> 00:14:39,030 tên, có lĩnh vực được gọi là nhà, có lĩnh vực được gọi là học sinh. " 355 00:14:39,030 --> 00:14:41,940 >> Vì vậy, trong P Set Ba, nếu bạn vẫn làm việc trên đó, 356 00:14:41,940 --> 00:14:44,020 và hầu hết mọi người vẫn còn được, nhận ra rằng khi bạn 357 00:14:44,020 --> 00:14:46,130 bắt đầu sử dụng những thứ như rects g và g hình bầu dục 358 00:14:46,130 --> 00:14:50,201 và những thứ khác mà không có vẻ đến từ Tuần Zero, Một, hoặc hai, 359 00:14:50,201 --> 00:14:52,950 nhận ra rằng đó là bởi vì Stanford tuyên bố một số loại dữ liệu mới. 360 00:14:52,950 --> 00:14:56,160 >> Và quả thực, đó là chính xác những gì chúng tôi sẽ làm, là tốt, P Set Bốn, khi 361 00:14:56,160 --> 00:14:59,880 chúng ta bắt đầu để đối phó với điều như hình ảnh, ảnh, và nhiều hơn nữa. 362 00:14:59,880 --> 00:15:02,882 Vì vậy, đó chỉ là một lời trêu ghẹo và một mô hình về tinh thần cho những gì sắp đến. 363 00:15:02,882 --> 00:15:04,590 Bây giờ, tôi procrastinated một chút sáng nay. 364 00:15:04,590 --> 00:15:09,560 Tôi đã loại tò mò để xem những gì hình nền Microsoft thực sự 365 00:15:09,560 --> 00:15:10,310 trông giống như ngày hôm nay. 366 00:15:10,310 --> 00:15:15,200 Và hóa ra một người nào đó trong năm 2006 thực sự đi đến gần như chính xác 367 00:15:15,200 --> 00:15:19,210 cùng một chỗ để chụp ảnh trong thực tế những gì trông giống như những ngày này. 368 00:15:19,210 --> 00:15:21,380 Các lĩnh vực bây giờ là một chút mọc. 369 00:15:21,380 --> 00:15:24,850 >> Vì vậy, bây giờ nói các hình ảnh, chúng ta hãy mang lại Daven đây 370 00:15:24,850 --> 00:15:26,890 trên màn hình và Nicholas, và chỉ nhắc nhở bạn 371 00:15:26,890 --> 00:15:30,540 nếu bạn muốn tham gia với chúng tôi để ăn trưa Thứ sáu này, người đứng đầu để URL thông thường của chúng tôi 372 00:15:30,540 --> 00:15:31,440 ở đây. 373 00:15:31,440 --> 00:15:33,530 >> Vì vậy, nơi nào họ rời khỏi tháo hôm qua? 374 00:15:33,530 --> 00:15:35,140 Chúng tôi giới thiệu vấn đề này, phải không? 375 00:15:35,140 --> 00:15:37,610 Điều này dường như là một chính xác thực hiện trao đổi, 376 00:15:37,610 --> 00:15:40,460 nhờ đó mà bạn dùng hai ints, một gọi là, một gọi là b, 377 00:15:40,460 --> 00:15:44,130 trao đổi chúng, giống như Laura đã làm ở đây trên sân khấu với sữa và nước, 378 00:15:44,130 --> 00:15:46,820 bằng cách sử dụng tạm thời biến, hoặc một cốc rỗng, 379 00:15:46,820 --> 00:15:50,540 để chúng tôi có thể đặt b trong một và một trong b mà không làm cho một mớ hỗn độn của sự vật. 380 00:15:50,540 --> 00:15:51,560 Chúng tôi sử dụng một biến. 381 00:15:51,560 --> 00:15:52,870 Nó được gọi là tạm thời. 382 00:15:52,870 --> 00:15:55,520 >> Nhưng những gì là cơ bản vấn đề với mã này hôm thứ Hai? 383 00:15:55,520 --> 00:15:57,700 384 00:15:57,700 --> 00:15:58,870 Vấn đề ở đây là gì? 385 00:15:58,870 --> 00:16:00,106 386 00:16:00,106 --> 00:16:00,605 Yeah. 387 00:16:00,605 --> 00:16:01,970 >> TƯỢNG: Nó chiếm nhiều không gian hơn. 388 00:16:01,970 --> 00:16:04,719 >> DAVID J. Malan: Đưa lên hơn không gian, bởi vì tôi đang sử dụng một biến, 389 00:16:04,719 --> 00:16:05,400 và đó là OK. 390 00:16:05,400 --> 00:16:07,300 Đó là sự thật, nhưng tôi sẽ nói đó là OK. 391 00:16:07,300 --> 00:16:10,030 Đó là chỉ có 32 bit trong lớn chương trình của sự vật, do đó, không phải là một vấn đề lớn. 392 00:16:10,030 --> 00:16:10,655 Suy nghĩ khác? 393 00:16:10,655 --> 00:16:12,572 TƯỢNG: Nó chỉ giao dịch hoán đổi các biến tại địa phương. 394 00:16:12,572 --> 00:16:13,571 DAVID J. Malan: Chính xác. 395 00:16:13,571 --> 00:16:15,090 Nó chỉ hoán đổi các biến tại địa phương. 396 00:16:15,090 --> 00:16:18,173 Bởi vì bất cứ lúc nào bạn gọi một function-- khi tôi đã có các khay từ Annenberg 397 00:16:18,173 --> 00:16:19,840 Lần cuối cùng, bạn có chính ở phía dưới. 398 00:16:19,840 --> 00:16:23,560 Ngay sau khi bạn gọi một chức năng được gọi là trao đổi, trao đổi không nhận được x và y, 399 00:16:23,560 --> 00:16:24,400 các giá trị ban đầu. 400 00:16:24,400 --> 00:16:26,392 Trao đổi get gì, chúng tôi đã yêu cầu bồi thường? 401 00:16:26,392 --> 00:16:27,100 TƯỢNG: bản sao. 402 00:16:27,100 --> 00:16:28,090 DAVID J. Malan: Vì vậy, bản sao của chúng. 403 00:16:28,090 --> 00:16:31,120 Vì vậy, nó được một và hai, nếu bạn nhớ lại ví dụ từ lần cuối cùng, 404 00:16:31,120 --> 00:16:34,730 nhưng một bản sao của một và hai được trao đổi thành công. 405 00:16:34,730 --> 00:16:38,550 Nhưng tiếc là cuối cùng, những giá trị vẫn như nhau. 406 00:16:38,550 --> 00:16:41,880 Vì vậy, chúng ta có thể thấy điều này với chúng tôi người bạn mới, hy vọng GDB, 407 00:16:41,880 --> 00:16:45,180 mà bạn hoặc TF và Ca của có được hướng dẫn bạn hướng tới như sau. 408 00:16:45,180 --> 00:16:51,210 >> Vì vậy, không thu hồi trao đổi trông like-- hãy mở this-- trông như thế này. 409 00:16:51,210 --> 00:16:54,160 Chúng tôi khởi tạo x một, y hai. 410 00:16:54,160 --> 00:16:55,620 Đã có một loạt in f. 411 00:16:55,620 --> 00:16:58,080 Nhưng sau đó, các cuộc gọi quan trọng ở đây là để trao đổi, mà 412 00:16:58,080 --> 00:17:00,260 là chính xác mã chúng tôi chỉ thấy một chút thời gian trước đây. 413 00:17:00,260 --> 00:17:03,180 Đó là chính xác đầu tiên Trong nháy mắt, nhưng chức năng, 414 00:17:03,180 --> 00:17:06,800 Chương trình này không làm việc, bởi vì nó không thường xuyên trao đổi x và y. 415 00:17:06,800 --> 00:17:10,190 >> Vì vậy, chúng ta hãy xem này, một ấm nhanh lên đây với GDB, một ./noswap. 416 00:17:10,190 --> 00:17:11,867 417 00:17:11,867 --> 00:17:15,200 Một loạt các thông tin mà áp đảo Tôi sẽ thoát khỏi với điều khiển L cho bây giờ. 418 00:17:15,200 --> 00:17:17,516 Và bây giờ, tôi sẽ đi trước và chạy nó. 419 00:17:17,516 --> 00:17:19,349 Và thật không may, đó Không phải là hữu ích. 420 00:17:19,349 --> 00:17:22,355 Nó chạy chương trình bên trong này chương trình gọi là GDB, một trình gỡ lỗi, 421 00:17:22,355 --> 00:17:23,730 nhưng nó không cho tôi poke xung quanh. 422 00:17:23,730 --> 00:17:26,229 >> Vì vậy, làm thế nào tôi có thể thực sự tạm dừng thực hiện trong chương trình này? 423 00:17:26,229 --> 00:17:27,410 424 00:17:27,410 --> 00:17:28,329 Vì vậy, phá vỡ. 425 00:17:28,329 --> 00:17:32,340 Và tôi có thể phá vỡ bất cứ số lượng, một, 10, 15 dòng. 426 00:17:32,340 --> 00:17:35,530 Nhưng tôi cũng có thể phá vỡ tượng trưng bằng cách nói phá vỡ chính. 427 00:17:35,530 --> 00:17:38,980 Và đó sẽ thiết lập ngắt điểm, dường như ở dòng 16 trong chính. 428 00:17:38,980 --> 00:17:40,050 Và ở đâu là dòng 16? 429 00:17:40,050 --> 00:17:42,960 Chúng ta hãy đi đến các mã và đi lên noswap. 430 00:17:42,960 --> 00:17:46,930 Và quả thực, dòng 16 là đầu tiên trong chương trình. 431 00:17:46,930 --> 00:17:52,130 >> Vì vậy, bây giờ, nếu tôi đi trước và loại chạy thời gian này, Enter, nó dừng lại. 432 00:17:52,130 --> 00:17:53,080 Vì vậy, hãy poke xung quanh. 433 00:17:53,080 --> 00:17:55,716 In x-- tại sao x không? 434 00:17:55,716 --> 00:17:56,705 435 00:17:56,705 --> 00:17:57,830 Và bỏ qua những ký hiệu đô la. 436 00:17:57,830 --> 00:17:59,725 Đó là chỉ dành cho những người biết thưởng sử dụng của chương trình. 437 00:17:59,725 --> 00:18:00,780 438 00:18:00,780 --> 00:18:03,140 Tại sao không x tại thời điểm này? 439 00:18:03,140 --> 00:18:03,640 Yeah. 440 00:18:03,640 --> 00:18:07,061 >> TƯỢNG: Nó dừng lại ngay trước khi đường 16, không thực sự trên đường 16. 441 00:18:07,061 --> 00:18:08,060 DAVID J. Malan: Chính xác. 442 00:18:08,060 --> 00:18:11,630 GDB, theo mặc định, đã dừng lại thực hiện ngay trước khi dòng 16. 443 00:18:11,630 --> 00:18:14,820 Vì vậy, nó đã không được thực hiện, trong đó có nghĩa là x là một số giá trị không rõ. 444 00:18:14,820 --> 00:18:17,150 Và chúng tôi đã may mắn rằng đó là một cái gì đó sạch như bằng không. 445 00:18:17,150 --> 00:18:20,310 Vì vậy, bây giờ nếu tôi gõ tiếp theo, bây giờ nó thực hiện 16. 446 00:18:20,310 --> 00:18:22,000 Nó đang đợi tôi để thực hiện 17. 447 00:18:22,000 --> 00:18:23,400 Hãy để tôi đi trước và in x. 448 00:18:23,400 --> 00:18:24,094 Đó là một. 449 00:18:24,094 --> 00:18:25,260 Hãy để tôi đi trước và in y. 450 00:18:25,260 --> 00:18:26,176 Tôi sẽ thấy gì bây giờ? 451 00:18:26,176 --> 00:18:27,660 452 00:18:27,660 --> 00:18:28,560 >> TƯỢNG: [không nghe được] 453 00:18:28,560 --> 00:18:29,165 >> DAVID J. Malan: A to hơn chút. 454 00:18:29,165 --> 00:18:30,040 >> TƯỢNG: [không nghe được] 455 00:18:30,040 --> 00:18:30,537 456 00:18:30,537 --> 00:18:32,120 DAVID J. Malan: Không hoàn toàn là một sự đồng thuận. 457 00:18:32,120 --> 00:18:34,760 Vì vậy, có, chúng ta thấy một số giá trị rác. 458 00:18:34,760 --> 00:18:37,862 Bây giờ, y là 134514064 có. 459 00:18:37,862 --> 00:18:39,320 Vâng, nó chỉ là một số giá trị rác. 460 00:18:39,320 --> 00:18:41,350 Chương trình của tôi sử dụng bộ nhớ RAM cho các mục đích khác nhau. 461 00:18:41,350 --> 00:18:42,350 Có các chức năng khác. 462 00:18:42,350 --> 00:18:44,040 Những người khác đã viết bên trong máy tính của tôi. 463 00:18:44,040 --> 00:18:46,789 Vì vậy, những bit đã được sử dụng các giá trị khác, và những gì tôi nhìn thấy 464 00:18:46,789 --> 00:18:49,470 là những tàn tích của một số sử dụng trước của bộ nhớ. 465 00:18:49,470 --> 00:18:53,350 >> Vì vậy, không có việc lớn, bởi vì ngay như tôi loại tiếp theo và sau đó in y, 466 00:18:53,350 --> 00:18:55,640 nó khởi tạo giá trị mà tôi muốn. 467 00:18:55,640 --> 00:18:57,400 Vì vậy, bây giờ, chúng ta hãy đi trước nhanh hơn một chút. 468 00:18:57,400 --> 00:18:58,540 N cho tới. 469 00:18:58,540 --> 00:18:59,570 Hãy làm điều đó một lần nữa. 470 00:18:59,570 --> 00:19:00,530 Hãy làm điều đó một lần nữa. 471 00:19:00,530 --> 00:19:02,404 Nhưng tôi không muốn nhấn nó ở đây, bởi vì nếu tôi 472 00:19:02,404 --> 00:19:05,110 muốn xem những gì đang xảy ra bên trong hoán đổi, lệnh là gì? 473 00:19:05,110 --> 00:19:05,520 >> TƯỢNG: bước. 474 00:19:05,520 --> 00:19:06,436 >> DAVID J. Malan: bước. 475 00:19:06,436 --> 00:19:09,800 Vì vậy, đây bước tôi vào một chức năng, chứ không phải trên nó. 476 00:19:09,800 --> 00:19:12,270 Và bây giờ, đó là một chút khó hiểu trung thực, nhưng điều này chỉ là 477 00:19:12,270 --> 00:19:14,581 nói với tôi tôi đang ở dòng 33 giờ. 478 00:19:14,581 --> 00:19:15,580 Và chúng ta hãy làm điều này một lần nữa. 479 00:19:15,580 --> 00:19:16,080 In tạm thời. 480 00:19:16,080 --> 00:19:17,129 481 00:19:17,129 --> 00:19:20,170 Giá trị rác, tiêu cực thời gian này, nhưng đó chỉ là vẫn còn một giá trị rác. 482 00:19:20,170 --> 00:19:22,810 Vì vậy, hãy làm gì tiếp theo, in tạm thời. 483 00:19:22,810 --> 00:19:27,130 Nó khởi tạo 1, là giá trị của x, hay còn gọi là a. 484 00:19:27,130 --> 00:19:29,110 >> Bây giờ, ở đâu chúng tôi một x và đến từ đâu? 485 00:19:29,110 --> 00:19:32,510 Vâng, thông báo trong chính, chúng tôi được gọi là các giá trị x và y. 486 00:19:32,510 --> 00:19:34,740 Sau đó chúng tôi vượt qua họ để trao đổi như sau. 487 00:19:34,740 --> 00:19:37,010 X đến đầu tiên, dấu phẩy y. 488 00:19:37,010 --> 00:19:40,020 Và sau đó, trao đổi có thể gọi họ là x và y. 489 00:19:40,020 --> 00:19:42,630 Nhưng cho rõ ràng, đó là gọi họ là a và b. 490 00:19:42,630 --> 00:19:45,970 Nhưng a và b tại đang có được bản sao của x và y tương ứng. 491 00:19:45,970 --> 00:19:50,660 >> Vì vậy, nếu tôi trở lại GDB, tạm thời hiện là một trong và bây giờ là một. 492 00:19:50,660 --> 00:19:56,130 Nhưng nếu tôi làm gì tiếp theo và bây giờ làm in một, một đã được chuyển qua. 493 00:19:56,130 --> 00:20:00,030 Sữa đã được đổ vào các cựu kính nước cam, hoặc ngược lại. 494 00:20:00,030 --> 00:20:04,750 >> Và nếu tôi làm gì tiếp theo một lần nữa, và bây giờ nếu tôi in ra như là một kiểm tra sanity, 495 00:20:04,750 --> 00:20:07,687 một vẫn còn là hai, nhưng bây giờ là một trong những b. 496 00:20:07,687 --> 00:20:08,770 Thành thật mà nói, nó vẫn còn đó. 497 00:20:08,770 --> 00:20:10,670 Tôi không quan tâm những gì là tạm thời. 498 00:20:10,670 --> 00:20:16,850 Nhưng ngay khi tôi bây giờ gõ, chúng ta hãy nói, tiếp tục quay trở lại, bây giờ tôi đang ở cuối 499 00:20:16,850 --> 00:20:17,480 chương trình. 500 00:20:17,480 --> 00:20:20,730 Và thật không may, x là vẫn còn một và y vẫn là hai. 501 00:20:20,730 --> 00:20:22,272 >> Vì vậy, các tiện ích của GDB có là gì? 502 00:20:22,272 --> 00:20:23,980 Nó không giúp tôi sửa chữa vấn đề cho mỗi gia nhập, 503 00:20:23,980 --> 00:20:26,265 nhưng hy vọng giúp tôi hiểu nó bằng cách thực hiện 504 00:20:26,265 --> 00:20:30,000 mà có, logic của tôi là đúng, nhưng mã của tôi không có cuối cùng 505 00:20:30,000 --> 00:20:31,450 một ảnh hưởng lâu dài. 506 00:20:31,450 --> 00:20:34,570 Vì vậy, đó là một vấn đề chúng tôi đi đến nay giải quyết ngày hôm nay. 507 00:20:34,570 --> 00:20:37,870 >> Nhưng chúng ta đạt được điều đó bằng cách này. 508 00:20:37,870 --> 00:20:39,230 String là một lời nói dối. 509 00:20:39,230 --> 00:20:41,860 Nó cũng không phải là một kiểu dữ liệu tồn tại trong C. Đó là 510 00:20:41,860 --> 00:20:44,750 là một từ đồng nghĩa với một số thời gian cho cái gì khác, 511 00:20:44,750 --> 00:20:47,300 và chúng ta có thể cho thấy như sau. 512 00:20:47,300 --> 00:20:53,282 >> Hãy để tôi đi trước và mở ra một chương trình được gọi là so sánh-0. 513 00:20:53,282 --> 00:20:56,240 Và thay vì gõ này ra, chúng tôi sẽ bắt đầu đi qua các mã 514 00:20:56,240 --> 00:20:58,040 Tôi đã viết, nhưng nó chỉ là một vài dòng. 515 00:20:58,040 --> 00:20:59,570 Vì vậy, đây là so sánh-0. 516 00:20:59,570 --> 00:21:02,380 Và điều đầu tiên tôi đang làm là nhận được một dòng văn bản. 517 00:21:02,380 --> 00:21:05,610 >> Nhưng hãy chú ý những gì tôi làm cho lần đầu tiên. 518 00:21:05,610 --> 00:21:07,910 Những điểm khác biệt rõ ràng về dòng 21? 519 00:21:07,910 --> 00:21:10,020 520 00:21:10,020 --> 00:21:11,402 Trên thực tế, chờ một phút. 521 00:21:11,402 --> 00:21:12,110 Đây là bản sao hai. 522 00:21:12,110 --> 00:21:13,568 Đó không phải là ngay cả những chương trình thích hợp. 523 00:21:13,568 --> 00:21:14,780 Được rồi, spoiler cảnh báo. 524 00:21:14,780 --> 00:21:16,890 Được rồi, vậy bao giờ nhớ rằng. 525 00:21:16,890 --> 00:21:18,520 Đó là câu trả lời cho một câu hỏi trong tương lai. 526 00:21:18,520 --> 00:21:21,450 >> Dưới đây là so sánh-0, và tôi về để có được một dòng văn bản. 527 00:21:21,450 --> 00:21:22,435 Chương trình đơn giản hơn nhiều. 528 00:21:22,435 --> 00:21:23,560 Vì vậy, đây là đơn giản. 529 00:21:23,560 --> 00:21:28,070 Điều này giống như Tuần Một, Tuần thứ Hai tại thời điểm này. string s = GetString. 530 00:21:28,070 --> 00:21:29,700 Bây giờ, tôi nói lại lần nữa ở đây. 531 00:21:29,700 --> 00:21:31,830 chuỗi t = GetString. 532 00:21:31,830 --> 00:21:35,300 Và sau đó, điều cuối cùng trong này chương trình, như tên gọi của nó, 533 00:21:35,300 --> 00:21:37,090 là tôi sẽ cố gắng để so sánh chúng. 534 00:21:37,090 --> 00:21:40,709 >> Vì vậy, nếu s, chuỗi đầu tiên, bằng = t, sau đó tôi 535 00:21:40,709 --> 00:21:42,250 sẽ nói bạn gõ cùng một điều. 536 00:21:42,250 --> 00:21:44,291 Khác, tôi sẽ nói bạn gõ những điều khác nhau. 537 00:21:44,291 --> 00:21:45,880 Vì vậy, hãy biên dịch và chạy chương trình này. 538 00:21:45,880 --> 00:21:48,481 Vì vậy, hãy so sánh không. 539 00:21:48,481 --> 00:21:48,980 Có vẻ tốt. 540 00:21:48,980 --> 00:21:50,490 Không có lỗi biên dịch. 541 00:21:50,490 --> 00:21:52,386 >> Hãy để tôi đi trước giờ và gõ ./compare-0. 542 00:21:52,386 --> 00:21:55,230 543 00:21:55,230 --> 00:21:59,220 Hãy để tôi đi trước và nói điều gì đó : Daven và một cái gì đó: Rob. 544 00:21:59,220 --> 00:22:00,450 Và tôi gõ những điều khác nhau. 545 00:22:00,450 --> 00:22:01,250 Cho đến nay, như vậy tốt. 546 00:22:01,250 --> 00:22:02,680 Chương trình có vẻ là đúng. 547 00:22:02,680 --> 00:22:03,880 >> Nhưng chúng ta hãy chạy nó một lần nữa. 548 00:22:03,880 --> 00:22:05,800 Nói điều gì đó: Gabe. 549 00:22:05,800 --> 00:22:07,140 Nói điều gì đó: Gabe. 550 00:22:07,140 --> 00:22:08,520 551 00:22:08,520 --> 00:22:09,020 Tất cả các quyền. 552 00:22:09,020 --> 00:22:10,851 Có lẽ tôi nhấn thanh không gian hoặc một cái gì đó sôi nổi. 553 00:22:10,851 --> 00:22:11,600 Hãy làm điều đó một lần nữa. 554 00:22:11,600 --> 00:22:13,020 Vì vậy, Zamyla. 555 00:22:13,020 --> 00:22:13,970 556 00:22:13,970 --> 00:22:14,470 Zamyla. 557 00:22:14,470 --> 00:22:15,740 558 00:22:15,740 --> 00:22:17,330 Những thứ khác nhau. 559 00:22:17,330 --> 00:22:19,430 Vì vậy, những gì đang xảy ra? 560 00:22:19,430 --> 00:22:23,200 >> Vì vậy, chúng tôi có hai dòng mã, GetString được gọi là hai lần. 561 00:22:23,200 --> 00:22:25,760 Và sau đó, tôi chỉ đơn giản là cố gắng để so sánh s và t. 562 00:22:25,760 --> 00:22:28,370 Nhưng những gì thực sự đang xảy ra sau đó? 563 00:22:28,370 --> 00:22:31,180 Vâng, về chữ viết tay của tôi để bán thịt ví dụ này phần nào. 564 00:22:31,180 --> 00:22:34,630 Và chúng ta hãy thực sự ném này lên trên đây, là tốt. 565 00:22:34,630 --> 00:22:37,390 566 00:22:37,390 --> 00:22:45,712 >> Vì vậy, chúng tôi có một dòng như string s = GetString. 567 00:22:45,712 --> 00:22:48,295 Vì vậy, đó chỉ đơn giản là người đầu tiên dòng thú vị từ chương trình. 568 00:22:48,295 --> 00:22:49,920 569 00:22:49,920 --> 00:22:52,974 Nhưng tất cả những gì thời gian này đã được xảy ra dưới mui xe? 570 00:22:52,974 --> 00:22:55,890 Vâng, trên tay trái bên là chuỗi, đó là một số loại biến, 571 00:22:55,890 --> 00:22:56,785 và nó được gọi là s. 572 00:22:56,785 --> 00:23:00,019 Vì vậy, tôi biết rằng điều này là sử dụng bộ nhớ, hoặc bộ nhớ RAM, trong máy tính của tôi bằng cách nào đó. 573 00:23:00,019 --> 00:23:02,060 Vì vậy, tôi sẽ trừu tượng vẽ đó là một hình vuông. 574 00:23:02,060 --> 00:23:04,820 32 bit, nó quay ra, nhưng thêm vào đó trong tương lai. 575 00:23:04,820 --> 00:23:06,410 Và sau đó, những gì đang xảy ra ở đây? 576 00:23:06,410 --> 00:23:08,700 >> Vâng, rõ ràng là GetString được một chuỗi từ người sử dụng. 577 00:23:08,700 --> 00:23:11,360 Và có GetString Zamyla hoặc Gabe hoặc Daven. 578 00:23:11,360 --> 00:23:14,640 Vì vậy, hãy chọn đầu tiên của những người, đó là Daven. 579 00:23:14,640 --> 00:23:19,174 Vì vậy, hiệu quả, những gì có GetString tôi trong đó trường hợp đầu tiên là D-một-v-e-n. 580 00:23:19,174 --> 00:23:22,690 581 00:23:22,690 --> 00:23:25,045 Và sau đó, những gì người khác đã làm nó cho tôi bí mật? 582 00:23:25,045 --> 00:23:25,920 TƯỢNG: [không nghe được] 583 00:23:25,920 --> 00:23:28,720 DAVID J. Malan: Yeah, các / 0 hoặc null nhân vật. 584 00:23:28,720 --> 00:23:30,550 Vì vậy, nó có hiệu quả đã cho tôi một chuỗi. 585 00:23:30,550 --> 00:23:34,550 Nhưng chúng ta đã biết từ trước trông thấy một chuỗi chỉ là một mảng 586 00:23:34,550 --> 00:23:37,895 của các nhân vật, và nó kết thúc bằng nhân vật trọng điểm đặc biệt này, / 0. 587 00:23:37,895 --> 00:23:39,220 588 00:23:39,220 --> 00:23:42,310 >> Nhưng nếu điều này là đúng và đây là một hình vuông, 589 00:23:42,310 --> 00:23:44,160 điều này rõ ràng là một hình chữ nhật lớn hơn nhiều. 590 00:23:44,160 --> 00:23:46,830 Và quả thực, đây là, Tôi khẳng định, chỉ có 32 bit. 591 00:23:46,830 --> 00:23:49,500 Và điều này rõ ràng là hơn 32 bit, bởi vì điều này có lẽ 592 00:23:49,500 --> 00:23:51,583 tám cộng với tám cộng với tám cộng với tám cộng với tám, 593 00:23:51,583 --> 00:23:53,320 chỉ vì byte trong ASCII. 594 00:23:53,320 --> 00:23:57,030 Làm thế nào có hề Chúng ta đang đi để phù hợp với Daven vào ô nhỏ ở đây? 595 00:23:57,030 --> 00:23:59,880 >> Vâng, những gì đang thực sự làm GetString? 596 00:23:59,880 --> 00:24:03,680 Vâng, lưới này ở đây đại diện bộ nhớ máy tính của tôi hay RAM. 597 00:24:03,680 --> 00:24:07,564 Vì vậy, hãy tự ý nói rằng nếu từng đại diện cho một byte, 598 00:24:07,564 --> 00:24:09,730 sau đó chúng ta có thể nghĩ của mỗi byte là có một địa chỉ, 599 00:24:09,730 --> 00:24:13,830 33 như Oxford Street, hoặc 34 Oxford Street, hoặc 35 đường Oxford. 600 00:24:13,830 --> 00:24:16,700 >> Vì vậy, giống như những ngôi nhà có địa chỉ và các tòa nhà có địa chỉ, 601 00:24:16,700 --> 00:24:19,810 do đó, làm byte cá nhân bộ nhớ có địa chỉ hoặc số 602 00:24:19,810 --> 00:24:21,042 mà nhận diện chúng. 603 00:24:21,042 --> 00:24:22,000 Bây giờ, đây là tùy ý. 604 00:24:22,000 --> 00:24:25,370 Tuy nhiên, để giữ cho nó đơn giản, tôi sẽ sử dụng hệ thập lục phân chỉ theo quy ước, 605 00:24:25,370 --> 00:24:28,200 nhưng 0x có nghĩa là không có gì khác hơn "này là hệ thập lục phân." 606 00:24:28,200 --> 00:24:31,030 và tôi sẽ cho rằng "D" kết thúc tại Byte Một trong bộ nhớ. 607 00:24:31,030 --> 00:24:34,210 >> Tôi đã không có gì khác xảy ra trong bộ nhớ, vì vậy Daven có vị trí đầu tiên 608 00:24:34,210 --> 00:24:35,509 tại Byte Một. 609 00:24:35,509 --> 00:24:36,800 Điều này, sau đó, sẽ là 0x2. 610 00:24:36,800 --> 00:24:37,831 611 00:24:37,831 --> 00:24:38,705 Điều này sẽ 0x3. 612 00:24:38,705 --> 00:24:39,840 613 00:24:39,840 --> 00:24:41,800 Đây sẽ là 0x4. 614 00:24:41,800 --> 00:24:43,025 Điều này sẽ 0x5. 615 00:24:43,025 --> 00:24:44,025 Đây sẽ là 0x6. 616 00:24:44,025 --> 00:24:45,560 617 00:24:45,560 --> 00:24:48,290 >> Nhưng một khi bạn bắt đầu suy nghĩ về những gì đang làm của máy tính 618 00:24:48,290 --> 00:24:50,710 bên dưới mui xe, bạn có thể bắt đầu để suy ra 619 00:24:50,710 --> 00:24:54,960 làm thế nào bạn, cách đây vài năm, sẽ C đã thực hiện chính nó. 620 00:24:54,960 --> 00:24:58,360 GetString có thể là gì returning-- bởi vì nó 621 00:24:58,360 --> 00:25:00,946 cảm thấy như nó không trở về Daven, mỗi gia nhập, 622 00:25:00,946 --> 00:25:03,320 bởi vì anh ấy chắc chắn sẽ không để phù hợp với box-- này ít 623 00:25:03,320 --> 00:25:05,090 vì vậy những gì được GetString có thể quay trở lại? 624 00:25:05,090 --> 00:25:07,958 625 00:25:07,958 --> 00:25:08,920 >> TƯỢNG: [không nghe được] 626 00:25:08,920 --> 00:25:10,540 >> DAVID J. Malan: Các vị trí của Daven. 627 00:25:10,540 --> 00:25:12,770 Và nó đã làm điều này kể từ tuần One. 628 00:25:12,770 --> 00:25:16,150 GetString gì thực sự là trở về không phải là một chuỗi, mỗi gia nhập. 629 00:25:16,150 --> 00:25:17,780 Đó là một trong những lời nói dối nhỏ màu trắng. 630 00:25:17,780 --> 00:25:22,520 Nó trả lại địa chỉ của chuỗi trong bộ nhớ, địa chỉ duy nhất. 631 00:25:22,520 --> 00:25:24,820 Daven sống tại 33 đường Oxford. 632 00:25:24,820 --> 00:25:29,310 Nhưng ngắn gọn hơn, Gavin sống tại 0x1, Địa chỉ Number One. 633 00:25:29,310 --> 00:25:32,280 >> Vì vậy, những gì được đưa vào này hộp nhỏ sau đó, để được rõ ràng, 634 00:25:32,280 --> 00:25:35,930 chỉ là địa chỉ của chuỗi. 635 00:25:35,930 --> 00:25:38,110 Vì vậy, tất cả thời gian này, điều này có được diễn ra. 636 00:25:38,110 --> 00:25:41,650 Tuy nhiên, điều này gợi ý bây giờ là nếu tất cả s có 637 00:25:41,650 --> 00:25:44,710 là một số bên trong của nó, ai để ngăn chặn bạn, các lập trình viên, 638 00:25:44,710 --> 00:25:47,970 từ việc đưa bất kỳ số nào trong bất kỳ thay đổi và chỉ nhảy 639 00:25:47,970 --> 00:25:49,080 với đoạn bộ nhớ? 640 00:25:49,080 --> 00:25:51,320 Và quả thực, chúng ta sẽ thấy đó là một mối đe dọa thời gian tới. 641 00:25:51,320 --> 00:25:53,500 >> Nhưng hiện nay, điều này cảm thấy không đủ. 642 00:25:53,500 --> 00:25:55,630 Nếu tôi nói, cho tôi một chuỗi, bạn cho tôi Daven. 643 00:25:55,630 --> 00:25:57,230 Nhưng bạn không thực sự cho tôi Daven. 644 00:25:57,230 --> 00:25:59,310 Tất cả các bạn cho tôi là địa chỉ của Daven. 645 00:25:59,310 --> 00:26:04,310 Làm thế nào để sau đó biết chắc chắn Daven nơi bắt đầu và ends-- 646 00:26:04,310 --> 00:26:07,140 những câu chuyện của nhận weird-- Daven nơi bắt đầu và kết thúc, 647 00:26:07,140 --> 00:26:10,435 và sau đó, tiếp theo chuỗi trong bộ nhớ bắt đầu? 648 00:26:10,435 --> 00:26:11,520 649 00:26:11,520 --> 00:26:13,620 >> Vâng, nếu bạn đang giao tôi bắt đầu Daven, 650 00:26:13,620 --> 00:26:17,230 về cơ bản, làm thế nào để tôi biết nơi cuối tên của ông là gì? 651 00:26:17,230 --> 00:26:20,550 Đó là ký tự null đặc biệt, là tất cả các quan trọng hơn bây giờ 652 00:26:20,550 --> 00:26:23,040 nếu dây bên dưới mui xe chỉ đơn giản là xác định 653 00:26:23,040 --> 00:26:25,820 duy nhất bởi vị trí của họ trong bộ nhớ. 654 00:26:25,820 --> 00:26:28,130 Vì vậy, tất cả thời gian này, đó là những gì đã xảy ra. 655 00:26:28,130 --> 00:26:32,470 >> Vì vậy, khi chúng ta nhìn tại mã ở đây, giải thích 656 00:26:32,470 --> 00:26:35,790 nếu bạn làm lỗi trong dòng 26. 657 00:26:35,790 --> 00:26:39,560 Tại sao Zamyla và Zamyla khác nhau? 658 00:26:39,560 --> 00:26:41,330 Tại sao Gabe và Gabe khác nhau? 659 00:26:41,330 --> 00:26:42,154 Vâng, ở phía sau. 660 00:26:42,154 --> 00:26:43,390 >> TƯỢNG: Họ có địa chỉ khác nhau. 661 00:26:43,390 --> 00:26:45,931 >> DAVID J. Malan: Đơn giản là vì họ có địa chỉ khác nhau. 662 00:26:45,931 --> 00:26:48,820 Bởi vì khi bạn gọi GetString một lần nữa, mà tôi sẽ làm một cách nhanh chóng ở đây, 663 00:26:48,820 --> 00:26:52,870 nếu điều này là dòng thứ hai, chuỗi t, như tôi đã làm trong chương trình, 664 00:26:52,870 --> 00:26:55,030 bằng một cuộc gọi đến GetString. 665 00:26:55,030 --> 00:26:56,370 666 00:26:56,370 --> 00:26:58,670 Về sau, tôi gọi GetString, tôi sẽ 667 00:26:58,670 --> 00:27:00,190 để có được một đoạn khác nhau của bộ nhớ. 668 00:27:00,190 --> 00:27:02,220 >> GetString được phép yêu cầu người điều hành 669 00:27:02,220 --> 00:27:03,800 hệ thống hơn và nhiều bộ nhớ hơn. 670 00:27:03,800 --> 00:27:07,894 Nó sẽ không để tái sử dụng cùng sáu byte mỗi lần duy nhất. 671 00:27:07,894 --> 00:27:09,810 Nó sẽ có được một mới đoạn bộ nhớ, mà 672 00:27:09,810 --> 00:27:12,780 có nghĩa là t là sẽ nhận được một số giá trị khác ở đây. 673 00:27:12,780 --> 00:27:15,380 >> Vì vậy, khi tôi làm bằng s = t, bạn không so sánh 674 00:27:15,380 --> 00:27:17,880 D chống lại điều này và A chống lại V này và chống lại điều này. 675 00:27:17,880 --> 00:27:19,588 Bạn đang so sánh này chống lại điều này, mà 676 00:27:19,588 --> 00:27:24,020 thẳng thắn là useless-- khá useful-- là khá vô dụng, bởi vì những người thực sự 677 00:27:24,020 --> 00:27:25,830 quan tâm đến nơi mà các chuỗi trong bộ nhớ? 678 00:27:25,830 --> 00:27:26,850 >> Và quả thực, chúng ta không có. 679 00:27:26,850 --> 00:27:28,980 Và chúng tôi sẽ không bắt đầu đặc biệt quan tâm. 680 00:27:28,980 --> 00:27:34,180 Chỉ trong phạm vi mà lỗi có thể phát sinh và các mối đe dọa an ninh có thể phát sinh sẽ 681 00:27:34,180 --> 00:27:36,100 chúng tôi thực sự bắt đầu quan tâm về việc này. 682 00:27:36,100 --> 00:27:37,230 Vì vậy, hãy khắc phục vấn đề này. 683 00:27:37,230 --> 00:27:39,650 Hóa ra, bạn sửa chữa nó siêu đơn giản. 684 00:27:39,650 --> 00:27:42,600 >> Và chúng ta hãy thực sự, trước khi tôi cho thấy một lần nữa, điều gì sẽ 685 00:27:42,600 --> 00:27:47,170 bạn làm gì nếu trong một lớp học CS50, và bạn phải thực hiện 686 00:27:47,170 --> 00:27:48,600 một so sánh với hai dây. 687 00:27:48,600 --> 00:27:51,440 Bạn rõ ràng không thể chỉ cần sử dụng bằng s = t. 688 00:27:51,440 --> 00:27:54,090 Nhưng chỉ một cách hợp lý, làm thế nào bạn sẽ so sánh chuỗi này 689 00:27:54,090 --> 00:27:56,370 chống lại chuỗi này sử dụng mã C? 690 00:27:56,370 --> 00:27:56,880 Yeah. 691 00:27:56,880 --> 00:27:58,780 >> TƯỢNG: Chỉ cần làm cho vòng lặp [không nghe được] 692 00:27:58,780 --> 00:28:00,670 693 00:28:00,670 --> 00:28:01,670 DAVID J. Malan: hoàn hảo. 694 00:28:01,670 --> 00:28:02,900 TƯỢNG: [không nghe được] 695 00:28:02,900 --> 00:28:03,310 DAVID J. Malan: Vâng. 696 00:28:03,310 --> 00:28:05,390 Chỉ cần sử dụng một vòng lặp hoặc một trong khi vòng lặp hoặc bất cứ điều gì. 697 00:28:05,390 --> 00:28:08,710 Nhưng chỉ cần áp dụng các ý tưởng cơ bản là nếu đây là một đoạn bộ nhớ hoặc một mảng 698 00:28:08,710 --> 00:28:11,590 và đây là, lặp qua cả hai cùng một lúc. 699 00:28:11,590 --> 00:28:12,960 Và chỉ cần so sánh các chữ cái. 700 00:28:12,960 --> 00:28:14,260 >> Và bạn đã có được một chút cẩn thận, bởi vì bạn 701 00:28:14,260 --> 00:28:16,247 không muốn một ngón tay đi quá khứ khác 702 00:28:16,247 --> 00:28:18,080 bởi vì một chuỗi còn hơn khác. 703 00:28:18,080 --> 00:28:21,380 Vì vậy, bạn sẽ muốn kiểm tra giá trị đặc biệt này ở cuối, null. 704 00:28:21,380 --> 00:28:24,017 Nhưng nó thực sự là, trong kết thúc, đơn giản như vậy. 705 00:28:24,017 --> 00:28:26,100 Và thẳng thắn mà nói, chúng ta không cần phát minh lại bánh xe. 706 00:28:26,100 --> 00:28:27,960 Đây là phiên bản hai. 707 00:28:27,960 --> 00:28:32,910 Và những gì tôi sẽ nói ở đây là thay vì so sánh tương đương với s = t, 708 00:28:32,910 --> 00:28:38,964 Tôi thay vì sẽ nói, nếu chuỗi so sánh các s t bằng dấu phẩy = 0. 709 00:28:38,964 --> 00:28:40,130 Bây giờ, những gì được chuỗi so sánh? 710 00:28:40,130 --> 00:28:43,046 >> Hóa ra, đó là một chức năng mà đi kèm với C, có mục đích trong cuộc sống 711 00:28:43,046 --> 00:28:44,650 là để so sánh hai chuỗi. 712 00:28:44,650 --> 00:28:48,300 Và khuấy so sánh, nếu chúng ta đọc nó người đàn ông trang hoặc tài liệu hoặc CS50 713 00:28:48,300 --> 00:28:50,630 tài liệu tham khảo, nó sẽ chỉ đơn giản là nói với bạn rằng khuấy 714 00:28:50,630 --> 00:28:55,730 so sánh lợi nhuận hoặc là một tiêu cực số hoặc một số tích cực hay không, 715 00:28:55,730 --> 00:28:57,660 nơi không có nghĩa là họ đang bằng nhau. 716 00:28:57,660 --> 00:28:58,570 >> Vì vậy, chỉ phỏng đoán. 717 00:28:58,570 --> 00:29:00,390 Nó có nghĩa là gì nếu khuấy động lợi nhuận so sánh 718 00:29:00,390 --> 00:29:02,110 giá trị âm hoặc giá trị tích cực? 719 00:29:02,110 --> 00:29:02,785 720 00:29:02,785 --> 00:29:04,285 TƯỢNG: Lớn hơn hoặc ít hơn. 721 00:29:04,285 --> 00:29:05,570 DAVID J. Malan: Yeah, lớn hơn hoặc ít hơn. 722 00:29:05,570 --> 00:29:08,640 Vì vậy, nếu bạn muốn sắp xếp toàn bộ bó dây trong một dictionary-- 723 00:29:08,640 --> 00:29:12,975 như chúng ta sẽ dần dần xuống road-- chức năng hoàn hảo để sử dụng khả năng, 724 00:29:12,975 --> 00:29:15,850 bởi vì nó sẽ làm điều đó so sánh các chuỗi cho bạn, và nói 725 00:29:15,850 --> 00:29:20,060 bạn thực hiện một đến trước b, hoặc làm b đến trước một bảng chữ cái. 726 00:29:20,060 --> 00:29:21,490 Chúng tôi có thể làm chính xác điều đó. 727 00:29:21,490 --> 00:29:23,620 >> Và tôi đã làm một việc thông báo khác điều trong ví dụ này. 728 00:29:23,620 --> 00:29:26,870 Những gì người khác đã thay đổi cao hơn trong chức năng chính này? 729 00:29:26,870 --> 00:29:28,500 730 00:29:28,500 --> 00:29:29,350 Char *. 731 00:29:29,350 --> 00:29:31,150 Và đây là lời nói dối khác. 732 00:29:31,150 --> 00:29:33,750 Tất cả thời gian này, khi bạn đã được viết chuỗi, 733 00:29:33,750 --> 00:29:38,350 chúng tôi đã bí mật viết lại chuỗi như char * để kêu vang thực sự 734 00:29:38,350 --> 00:29:39,270 hiểu bạn. 735 00:29:39,270 --> 00:29:42,450 >> Nói cách khác, trong CS50.h và như chúng ta cuối cùng sẽ thấy, 736 00:29:42,450 --> 00:29:45,950 chúng tôi thực hiện một chuỗi gọi là từ đồng nghĩa đó là điều tương tự như char *. 737 00:29:45,950 --> 00:29:49,910 Và bây giờ, chỉ biết rằng *, Trong bối cảnh này, ít nhất, 738 00:29:49,910 --> 00:29:51,286 có nghĩa là địa chỉ. 739 00:29:51,286 --> 00:29:52,210 >> Địa chỉ của những gì? 740 00:29:52,210 --> 00:29:56,390 Vâng, thực tế là tôi đã nói char *, và không phải int * hoặc nổi *, 741 00:29:56,390 --> 00:30:00,820 có nghĩa là char * là địa chỉ của một char. 742 00:30:00,820 --> 00:30:06,770 Vì vậy, hộp nhỏ này ở đây, hay còn gọi là chuỗi, thực sự là kiểu char *, 743 00:30:06,770 --> 00:30:10,490 mà chỉ đơn giản là một cách nói, trong hộp này sẽ đi một địa chỉ. 744 00:30:10,490 --> 00:30:12,430 Và những gì địa chỉ tham khảo? 745 00:30:12,430 --> 00:30:13,780 Rõ ràng, một char. 746 00:30:13,780 --> 00:30:16,410 >> Nhưng chúng ta có thể hoàn toàn có int * và những thứ khác. 747 00:30:16,410 --> 00:30:20,790 Nhưng hiện nay, char * thực sự nhiều nhất là đơn giản và một trong những quan tâm. 748 00:30:20,790 --> 00:30:23,310 Vì vậy, vấn đề này sẽ tăng lên, tuy nhiên, một lần nữa. 749 00:30:23,310 --> 00:30:24,830 >> Giả sử tôi mở ra chương trình này. 750 00:30:24,830 --> 00:30:27,670 Hãy xem nếu bây giờ chúng ta có thể dự đoán những gì sai với mã này. 751 00:30:27,670 --> 00:30:31,140 Vì vậy, trong chương trình này, sao chép-0, tôi sẽ đi trước và một lần nữa gọi 752 00:30:31,140 --> 00:30:34,190 GetString và lưu trữ các giá trị trong s. 753 00:30:34,190 --> 00:30:38,800 >> Và sau đó, tại sao tôi làm điều này, cũng giống như một lời nhắc nhở từ tuần qua? 754 00:30:38,800 --> 00:30:40,960 Chúng tôi đã nói rằng GetString đôi khi trả về null. 755 00:30:40,960 --> 00:30:42,793 Có nghĩa là gì nếu GetString trả về null? 756 00:30:42,793 --> 00:30:45,040 757 00:30:45,040 --> 00:30:46,034 Một cái gì đó đã đi sai. 758 00:30:46,034 --> 00:30:48,950 Nó có thể có nghĩa là chuỗi quá lớn, ra của máy tính của bộ nhớ. 759 00:30:48,950 --> 00:30:51,724 Nó xảy ra siêu, siêu, siêu hiếm khi, nhưng nó có thể xảy ra. 760 00:30:51,724 --> 00:30:53,890 Chúng tôi muốn kiểm tra cho nó, và đó là tất cả chúng ta đang làm. 761 00:30:53,890 --> 00:30:57,910 >> Bởi vì chúng ta sẽ thấy bây giờ, nếu bạn không bắt đầu kiểm tra thường xuyên cho những thứ 762 00:30:57,910 --> 00:31:00,870 như vô giá trị, có lẽ bạn thực sự bắt đầu đi 763 00:31:00,870 --> 00:31:03,106 đến các địa chỉ trong bộ nhớ không hợp lệ. 764 00:31:03,106 --> 00:31:05,980 Và bạn sẽ bắt đầu gây ngày càng có nhiều lỗi phân khúc. 765 00:31:05,980 --> 00:31:08,360 Hoặc trong một máy Mac hoặc PC, chỉ cần làm cho máy tính treo 766 00:31:08,360 --> 00:31:10,340 hoặc một chương trình đóng băng, có khả năng. 767 00:31:10,340 --> 00:31:14,930 >> Vì vậy, bây giờ, tôi khẳng định trong bản sao-0.c, mà tôi đang đi để sao chép các chuỗi bằng cách 768 00:31:14,930 --> 00:31:15,685 của dòng 28. 769 00:31:15,685 --> 00:31:16,850 770 00:31:16,850 --> 00:31:18,750 Và sau đó, tôi sẽ yêu cầu bồi thường ở phía dưới 771 00:31:18,750 --> 00:31:21,430 ở đây là tôi sẽ để thay đổi một trong số họ. 772 00:31:21,430 --> 00:31:22,330 >> Vì vậy, nhận thấy điều này. 773 00:31:22,330 --> 00:31:24,370 Tôi gọi strlen người bạn cũ của chúng tôi. 774 00:31:24,370 --> 00:31:28,960 Và chỉ cần giải thích bằng tiếng Anh những dòng này 34 đang làm gì? 775 00:31:28,960 --> 00:31:32,480 T khung 0 gì đại diện bên trái. 776 00:31:32,480 --> 00:31:32,980 Yeah. 777 00:31:32,980 --> 00:31:34,339 >> TƯỢNG: nhân vật đầu tiên của t? 778 00:31:34,339 --> 00:31:35,880 DAVID J. Malan: nhân vật đầu tiên của t. 779 00:31:35,880 --> 00:31:36,379 Đó là nó. 780 00:31:36,379 --> 00:31:40,024 Ký tự đầu tiên của t, tôi muốn giao phiên bản chữ hoa 781 00:31:40,024 --> 00:31:41,190 của nhân vật đầu tiên trong t. 782 00:31:41,190 --> 00:31:43,200 Vì vậy, đây được tận dụng chữ cái đầu tiên. 783 00:31:43,200 --> 00:31:46,340 Và sau đó, điều cuối cùng tôi làm trong chương trình này là tôi khẳng định đây là 784 00:31:46,340 --> 00:31:50,340 ban đầu, s, và đây là bản sao, t. 785 00:31:50,340 --> 00:31:54,610 >> Nhưng dựa trên những câu chuyện chúng ta chỉ nói về những gì thực sự là chuỗi, 786 00:31:54,610 --> 00:31:57,520 là những gì dòng 28 thực sự làm, và những gì là 787 00:31:57,520 --> 00:31:59,405 lỗi kết quả sẽ được trên màn hình? 788 00:31:59,405 --> 00:32:01,300 789 00:32:01,300 --> 00:32:03,500 >> Vì vậy, đầu tiên, câu hỏi đầu tiên, 28. 790 00:32:03,500 --> 00:32:09,040 Là chuỗi t = s thực sự làm gì? 791 00:32:09,040 --> 00:32:16,430 Nếu chúng tôi có trên tay trái bên đây chuỗi t = s; 792 00:32:16,430 --> 00:32:19,400 cung cấp cho tôi một hộp ở đây và một hộp ở đây. 793 00:32:19,400 --> 00:32:25,530 Và giả sử địa chỉ này là 0x, hãy nói, 50 thời gian này, tùy tiện. 794 00:32:25,530 --> 00:32:28,847 Những gì hiện chuỗi t = s làm bên dưới mui xe? 795 00:32:28,847 --> 00:32:30,340 >> TƯỢNG: [không nghe được] 796 00:32:30,340 --> 00:32:34,100 >> DAVID J. Malan: Nó lưu trữ bộ nhớ giải quyết có, vì vậy 0x50 đến đó. 797 00:32:34,100 --> 00:32:37,980 Vì vậy, nếu bây giờ, tôi đi đến đầu tiên nhân vật trong t và chữ hoa nó, 798 00:32:37,980 --> 00:32:39,535 những gì tôi đang làm gì để có hiệu quả không? 799 00:32:39,535 --> 00:32:41,300 800 00:32:41,300 --> 00:32:43,450 Tôi đang thực sự làm điều tương tự, phải không? 801 00:32:43,450 --> 00:32:47,680 Bởi vì nếu Địa chỉ 0x50-- và chỉ cần, tôi không có nhiều chỗ trên bảng ở đây, 802 00:32:47,680 --> 00:32:51,750 nhưng cho rằng điều này là 0x50 xuống đây, một nơi nào đó trong bộ nhớ máy tính của tôi. 803 00:32:51,750 --> 00:32:55,825 >> Và tôi đã, ví dụ, Gabe trong chữ thường ở đây, như thế này. 804 00:32:55,825 --> 00:32:57,120 805 00:32:57,120 --> 00:33:01,980 Và tôi đã nói khung t 0 được viết hoa. 806 00:33:01,980 --> 00:33:04,860 Vâng, t khung là 0 chữ cái đầu tiên trong t. 807 00:33:04,860 --> 00:33:07,840 Vì vậy, ít g sẽ trở thành lớn G. Nhưng vấn đề 808 00:33:07,840 --> 00:33:09,410 được, những gì s cũng chỉ ra? 809 00:33:09,410 --> 00:33:10,300 >> TƯỢNG: Cùng. 810 00:33:10,300 --> 00:33:11,841 >> DAVID J. Malan: Điều chính xác. 811 00:33:11,841 --> 00:33:16,342 Vì vậy, một lời giải thích đơn giản có lẽ, thậm chí nếu cú ​​pháp là một chút lạ. 812 00:33:16,342 --> 00:33:17,050 Vì vậy, hãy làm điều này. 813 00:33:17,050 --> 00:33:20,210 Làm bản sao-0 và sau đó ./copy-0. 814 00:33:20,210 --> 00:33:21,820 815 00:33:21,820 --> 00:33:24,110 Nói điều gì đó: Gabe. 816 00:33:24,110 --> 00:33:26,760 Và thật không may, cả hai chúng hiện nay đã được vốn hóa, 817 00:33:26,760 --> 00:33:29,500 nhưng cho rằng cơ bản Vì lý do đó chúng tôi chỉ đơn giản là 818 00:33:29,500 --> 00:33:32,350 bây giờ đối phó với địa chỉ. 819 00:33:32,350 --> 00:33:36,470 >> Vì vậy, làm thế nào để chúng ta bắt đầu address-- không chơi chữ intended-- 820 00:33:36,470 --> 00:33:39,270 làm thế nào để chúng ta bắt đầu để giải quyết vấn đề này cụ thể không? 821 00:33:39,270 --> 00:33:44,400 Vâng, trong copy1.c, mọi thứ đang đi để có được một ít phức tạp hơn. 822 00:33:44,400 --> 00:33:49,310 Nhưng tôi sẽ yêu cầu một giải pháp khái niệm đơn giản. 823 00:33:49,310 --> 00:33:50,852 >> Vì vậy, khó để có được cái nhìn đầu tiên. 824 00:33:50,852 --> 00:33:53,560 Sẽ không dễ dàng cho người đầu tiên khi bạn gõ nó ra, có lẽ, 825 00:33:53,560 --> 00:33:57,440 nhưng nếu vấn đề là chỉ đơn giản là làm t = s chỉ 826 00:33:57,440 --> 00:33:59,694 bản sao địa chỉ, những gì, một lần nữa nếu tôi có thể chọn bạn, 827 00:33:59,694 --> 00:34:02,110 sẽ là giải pháp để thực sự sao chép một chuỗi? 828 00:34:02,110 --> 00:34:04,906 829 00:34:04,906 --> 00:34:06,770 >> TƯỢNG: Chúng tôi sẽ có thể sử dụng một vòng nữa. 830 00:34:06,770 --> 00:34:06,890 >> DAVID J. Malan: Vâng. 831 00:34:06,890 --> 00:34:08,390 Vì vậy, chúng ta sẽ cần một vòng lặp lại. 832 00:34:08,390 --> 00:34:11,800 Và bởi vì nếu chúng ta muốn sao chép một chuỗi s thành chuỗi khác, 833 00:34:11,800 --> 00:34:14,120 chúng tôi có thể muốn làm điều đó nhân vật của nhân vật. 834 00:34:14,120 --> 00:34:17,199 Nhưng vấn đề là, nếu đây là ban đầu s, 835 00:34:17,199 --> 00:34:22,159 bây giờ chúng ta cần phải bắt đầu một cách rõ ràng cấp phát bộ nhớ cho t. 836 00:34:22,159 --> 00:34:24,320 >> Nói cách khác, chúng ta hãy vẽ lại một lần cuối cùng này. 837 00:34:24,320 --> 00:34:28,659 Nếu đây là chuỗi s = GetString. 838 00:34:28,659 --> 00:34:30,956 839 00:34:30,956 --> 00:34:32,455 Và chúng ta hãy đặt này ở đây, là tốt. 840 00:34:32,455 --> 00:34:36,639 841 00:34:36,639 --> 00:34:37,420 Đây là GetString. 842 00:34:37,420 --> 00:34:39,070 843 00:34:39,070 --> 00:34:43,860 Và sau đó, hình ảnh cho một cái gì đó như vậy là có được như trước, 844 00:34:43,860 --> 00:34:44,360 g-a-b-điện tử / 0. 845 00:34:44,360 --> 00:34:47,294 846 00:34:47,294 --> 00:34:48,960 Điều đó có vẻ một chút gì đó như thế này. 847 00:34:48,960 --> 00:34:53,650 Và s do đó, chúng tôi gọi đây là 0x50, và đó sẽ là 51, 52. 848 00:34:53,650 --> 00:34:54,409 >> Vì vậy, đây là 0x50. 849 00:34:54,409 --> 00:34:55,679 850 00:34:55,679 --> 00:34:59,690 Và sau đó, tôi làm chuỗi t. 851 00:34:59,690 --> 00:35:02,450 Trong bộ nhớ, đó là chỉ cần đi để cho tôi một hình vuông nhỏ như thế này. 852 00:35:02,450 --> 00:35:04,080 Vì vậy, bước quan trọng là những gì bây giờ? 853 00:35:04,080 --> 00:35:09,870 Nếu tôi muốn sao chép của thành t, những gì trống chúng ta cần phải điền vào đây? 854 00:35:09,870 --> 00:35:12,050 Hoặc làm những gì chúng ta cần phải làm ở mức cao? 855 00:35:12,050 --> 00:35:14,101 856 00:35:14,101 --> 00:35:14,600 Vâng? 857 00:35:14,600 --> 00:35:16,200 858 00:35:16,200 --> 00:35:17,020 Một người nào đó? 859 00:35:17,020 --> 00:35:17,690 Yeah. 860 00:35:17,690 --> 00:35:19,214 >> TƯỢNG: Chúng ta cần phải [không nghe được]. 861 00:35:19,214 --> 00:35:21,380 DAVID J. Malan: Vâng, chúng tôi cần phải điền vào khoảng trống này. 862 00:35:21,380 --> 00:35:24,340 Tôi không thể sao chép và sau đó lợi dụng tên của Gabe 863 00:35:24,340 --> 00:35:28,120 cho đến khi tôi yêu cầu hệ điều hành cho một đoạn bộ nhớ 864 00:35:28,120 --> 00:35:30,640 đó là ít nhất là lớn như bản gốc. 865 00:35:30,640 --> 00:35:32,130 Vì vậy, mà lá chúng tôi với một câu hỏi. 866 00:35:32,130 --> 00:35:36,080 >> Làm thế nào để yêu cầu hệ điều hành không chỉ cần cho một chút đơn giản pointer-- 867 00:35:36,080 --> 00:35:38,530 như thế này được gọi là, một địa chỉ, một pointer-- không 868 00:35:38,530 --> 00:35:40,980 cho một hộp nhỏ đơn giản như thế này được gọi là một chuỗi? 869 00:35:40,980 --> 00:35:44,200 Làm thế nào để yêu cầu người điều hành hệ thống cho một đoạn lớn của bộ nhớ? 870 00:35:44,200 --> 00:35:48,430 Như vậy đến nay, tôi đã chỉ nhận lại rằng gián tiếp bằng cách gọi GetString. 871 00:35:48,430 --> 00:35:50,740 Vậy làm thế nào được GetString thậm chí còn nhận được bộ nhớ của nó? 872 00:35:50,740 --> 00:35:53,430 >> Vâng, nó chỉ ra rằng có chức năng này khác ở đây 873 00:35:53,430 --> 00:35:55,160 mà bây giờ chúng ta sẽ bắt đầu sử dụng. 874 00:35:55,160 --> 00:35:59,780 Bây giờ, điều này có vẻ than-- cách bí ẩn hơn và tôi là người duy nhất có thể nhìn thấy it-- 875 00:35:59,780 --> 00:36:03,150 dòng này có vẻ cách bí ẩn hơn sau đó nó phải ở cái nhìn đầu tiên. 876 00:36:03,150 --> 00:36:04,650 Nhưng chúng ta hãy trêu chọc nó ngoài. 877 00:36:04,650 --> 00:36:07,950 >> Ở phía bên trái, tôi có char * t. 878 00:36:07,950 --> 00:36:13,280 Vì vậy, bằng tiếng Anh, hãy bắt đầu xây dựng câu thích hợp trong thuật ngữ kỹ thuật. 879 00:36:13,280 --> 00:36:19,757 Vì vậy, đây được phân bổ một biến kiểu char * được gọi là t. 880 00:36:19,757 --> 00:36:21,090 Bây giờ, điều đó thực sự có nghĩa gì? 881 00:36:21,090 --> 00:36:23,881 >> Vâng, điều đó có nghĩa, những gì tôi sẽ để đưa vào biến này được gọi là t? 882 00:36:23,881 --> 00:36:24,780 883 00:36:24,780 --> 00:36:26,402 Một địa chỉ của một char. 884 00:36:26,402 --> 00:36:28,360 Vì vậy, đó chỉ là đơn giản, cách hợp lý hơn 885 00:36:28,360 --> 00:36:29,930 mô tả phía bên trái. 886 00:36:29,930 --> 00:36:32,890 Vì vậy, tạo ra hộp này ở đây chỉ. 887 00:36:32,890 --> 00:36:34,760 Vì vậy, các bên phải, có lẽ, sẽ 888 00:36:34,760 --> 00:36:37,170 phân bổ mà lớn hơn đoạn bộ nhớ như thế nào? 889 00:36:37,170 --> 00:36:38,340 Vì vậy, hãy trêu chọc này ngoài. 890 00:36:38,340 --> 00:36:41,131 >> Nó áp đảo ở cái nhìn đầu tiên, nhưng những gì đang xảy ra bên trong đây? 891 00:36:41,131 --> 00:36:43,740 Trước tiên, có malloc, mà rõ ràng là người bạn mới của chúng tôi, 892 00:36:43,740 --> 00:36:45,450 "Bộ nhớ phân bổ." 893 00:36:45,450 --> 00:36:49,560 Vì vậy, đây là tham số được thông qua vào nó, vì vậy nó là một cuộc tranh luận khá lớn. 894 00:36:49,560 --> 00:36:50,970 Vì vậy, hãy trêu chọc này ngoài. 895 00:36:50,970 --> 00:36:53,410 >> strlen của s, tất nhiên, đại diện gì-- 896 00:36:53,410 --> 00:36:54,142 897 00:36:54,142 --> 00:36:55,600 TƯỢNG: Số lượng ký tự. 898 00:36:55,600 --> 00:36:56,710 DAVID J. Malan: Chỉ cần các số ký tự trong s. 899 00:36:56,710 --> 00:36:59,040 Vì vậy, độ dài của s, chuỗi ban đầu. 900 00:36:59,040 --> 00:37:00,350 Vì vậy, G-một-b-e. 901 00:37:00,350 --> 00:37:02,320 Vì vậy, nó có thể là bốn trong trường hợp này. 902 00:37:02,320 --> 00:37:05,485 Tại sao tôi làm 1 sau gọi strlen của s? 903 00:37:05,485 --> 00:37:06,360 TƯỢNG: [không nghe được] 904 00:37:06,360 --> 00:37:07,590 DAVID J. Malan: Cho rằng ký tự null đặc biệt. 905 00:37:07,590 --> 00:37:11,260 Nếu bạn hỏi tôi chiều dài là những gì Tên Gabe, tôi sẽ nói bốn. 906 00:37:11,260 --> 00:37:14,480 Bên dưới mui xe, tuy nhiên, tôi cần rằng byte thứ năm cho các ký tự null. 907 00:37:14,480 --> 00:37:16,100 Vì vậy, đó là lý do tại sao tôi đang làm 1. 908 00:37:16,100 --> 00:37:21,730 >> Bây giờ chỉ cần trong trường hợp bạn đang chạy này chương trình trên một máy tính khác hơn, nói, 909 00:37:21,730 --> 00:37:24,610 thiết bị CS50, mà kích thước của một char 910 00:37:24,610 --> 00:37:26,350 có thể khác nhau trong máy của riêng tôi 911 00:37:26,350 --> 00:37:30,590 chỉ ra rằng tôi có thể gọi đây điều hành sizeof, chỉ cần yêu cầu máy tính, 912 00:37:30,590 --> 00:37:32,870 kích thước của một là những gì char trên máy tính này? 913 00:37:32,870 --> 00:37:37,400 >> Và bằng cách nhân trong năm này Chẳng hạn bởi kích thước của một char, mà 914 00:37:37,400 --> 00:37:40,440 trên hầu hết các máy tính sẽ chỉ là một, malloc 915 00:37:40,440 --> 00:37:44,830 sẽ bố trí cho tôi lớn này đoạn bộ nhớ ở đây ở bên phải. 916 00:37:44,830 --> 00:37:47,140 Và nó sẽ return-- nó là một function-- vì vậy nó 917 00:37:47,140 --> 00:37:48,265 sẽ trả lại cho tôi những gì? 918 00:37:48,265 --> 00:37:50,914 919 00:37:50,914 --> 00:37:51,830 TƯỢNG: Địa chỉ? 920 00:37:51,830 --> 00:37:53,709 DAVID J. Malan: Địa chỉ của những gì? 921 00:37:53,709 --> 00:37:55,250 TƯỢNG: Trong bộ nhớ của nó được phân bổ? 922 00:37:55,250 --> 00:37:56,450 DAVID J. Malan: Trong bộ nhớ nó được phân bổ. 923 00:37:56,450 --> 00:37:59,189 Vì vậy, tôi không có ý tưởng, thẳng thắn, nơi này là sẽ kết thúc. 924 00:37:59,189 --> 00:38:01,480 Tôi sẽ đề nghị nó sẽ kết thúc tại 0x88. 925 00:38:01,480 --> 00:38:02,770 926 00:38:02,770 --> 00:38:06,009 Hoàn toàn tùy ý, nhưng một nơi nào đó khác hơn là 0x50, 927 00:38:06,009 --> 00:38:08,800 vì hệ điều hành, những gì Windows và Mac OS làm cho tôi, là 928 00:38:08,800 --> 00:38:11,230 hãy chắc chắn rằng nó đem lại cho tôi những phần khác nhau của bộ nhớ RAM. 929 00:38:11,230 --> 00:38:14,210 >> Vì vậy, đây là giá trị nơi này đoạn bộ nhớ có thể kết thúc. 930 00:38:14,210 --> 00:38:16,060 Vì vậy, đây là những gì kết thúc ở đây, 0x88. 931 00:38:16,060 --> 00:38:17,480 932 00:38:17,480 --> 00:38:21,570 Vì vậy, bây giờ rõ ràng, tôi có thể hiểu được rằng điều này là không giống nhau như thế này, 933 00:38:21,570 --> 00:38:23,960 bởi vì họ đang chỉ vào khối khác nhau của bộ nhớ. 934 00:38:23,960 --> 00:38:29,980 Vì vậy, nếu bây giờ tôi thực sự muốn sao chép này trong, chúng ta hãy làm giải pháp đề xuất của bạn. 935 00:38:29,980 --> 00:38:36,870 >> Chúng ta hãy đi, tạo ra một vòng lặp, và làm khung t i được của khung i. 936 00:38:36,870 --> 00:38:39,760 Bởi vì bây giờ tôi có thể sử dụng mảng giống như ký hiệu này, 937 00:38:39,760 --> 00:38:43,390 bởi vì mặc dù rất malloc quát tôi phân bổ bộ nhớ, 938 00:38:43,390 --> 00:38:45,290 bộ nhớ là byte chỉ tiếp giáp. 939 00:38:45,290 --> 00:38:47,240 Byte, byte, byte, trở lại trở lại trở lại. 940 00:38:47,240 --> 00:38:50,030 >> Tôi có thể chắc chắn như một lập trình viên coi nó như là một mảng, mà 941 00:38:50,030 --> 00:38:55,090 có nghĩa là tôi có thể sử dụng điều này cuối cùng quen thuộc ký hiệu của chỉ một số dấu ngoặc vuông. 942 00:38:55,090 --> 00:38:56,462 943 00:38:56,462 --> 00:39:00,020 >> Vì vậy, hãy để tôi dừng lại ở đó, bởi vì này là rất nhiều cùng một lúc, thậm chí 944 00:39:00,020 --> 00:39:03,530 mặc dù ý tưởng cơ bản để recap là chuỗi đó, tất cả thời gian này, 945 00:39:03,530 --> 00:39:05,550 không phải là một kiểu dữ liệu mới cho mỗi gia nhập. 946 00:39:05,550 --> 00:39:10,150 Nó chỉ là một con trỏ được gọi là, địa chỉ của một nhân vật, 947 00:39:10,150 --> 00:39:12,650 mà chỉ có nghĩa đó là một số mà theo quy ước của con người 948 00:39:12,650 --> 00:39:15,350 chúng tôi có xu hướng để viết một cái gì đó như 0x. 949 00:39:15,350 --> 00:39:18,590 >> Nhưng nó chỉ là một số, 33 như Oxford Street, 950 00:39:18,590 --> 00:39:20,530 mà sẽ xảy ra là Địa chỉ nhà của CS. 951 00:39:20,530 --> 00:39:22,000 952 00:39:22,000 --> 00:39:23,545 Bất kỳ câu hỏi về những chi tiết này? 953 00:39:23,545 --> 00:39:24,790 954 00:39:24,790 --> 00:39:25,289 Vâng? 955 00:39:25,289 --> 00:39:28,530 >> TƯỢNG: Tại sao chúng ta kiểm tra cho t bằng vô giá trị? 956 00:39:28,530 --> 00:39:30,740 >> DAVID J. Malan: Tại sao chúng ta kiểm tra t bằng vô giá trị? 957 00:39:30,740 --> 00:39:33,250 Nếu chúng ta đọc documentation-- question-- tuyệt vời cho malloc, 958 00:39:33,250 --> 00:39:37,020 nó sẽ nói trong bản in đẹp, đôi khi malloc có thể trở về null, 959 00:39:37,020 --> 00:39:38,080 giống như GetString. 960 00:39:38,080 --> 00:39:41,820 Và quả thực, GetString trả về null nếu, lần lượt, malloc trả về null, 961 00:39:41,820 --> 00:39:43,130 vì GetString sử dụng malloc. 962 00:39:43,130 --> 00:39:46,400 >> Và điều đó có thể xảy ra nếu hệ điều hành, Mac OS, Windows, bất cứ điều gì, chỉ đơn giản là 963 00:39:46,400 --> 00:39:48,130 ra khỏi bộ nhớ cho bạn. 964 00:39:48,130 --> 00:39:49,820 Vì vậy, đó là những gì xảy ra ở đó. 965 00:39:49,820 --> 00:39:52,910 >> Và hãy để tôi tiết lộ một điều khác mà chỉ có thể thổi tâm trí của bạn 966 00:39:52,910 --> 00:39:55,100 hoặc hoàn toàn quá xa trên đường dây. 967 00:39:55,100 --> 00:39:59,770 Nhưng hãy để tôi kéo lên tương tự cho vòng lặp cho việc sao chép, 968 00:39:59,770 --> 00:40:05,480 mà lúc nãy, thu hồi được này. khung t i được của khung i. 969 00:40:05,480 --> 00:40:06,740 >> Đẹp và thân thiện. 970 00:40:06,740 --> 00:40:09,330 Cảm thấy như Tuần Hai lần nữa. 971 00:40:09,330 --> 00:40:14,920 Tuy nhiên, phiên bản này thực sự có thể viết lại như thế này, trông khó hiểu. 972 00:40:14,920 --> 00:40:18,280 Đó là một kỹ thuật gọi là con trỏ số học, địa chỉ số học. 973 00:40:18,280 --> 00:40:19,600 Nhưng tại sao không làm việc này? 974 00:40:19,600 --> 00:40:22,220 >> Bây giờ khó chịu, các tác giả của C quyết định sử dụng 975 00:40:22,220 --> 00:40:25,070 * biểu tượng cho các mục đích khác nhau. 976 00:40:25,070 --> 00:40:29,020 Chúng tôi đã nhìn thấy nó được sử dụng một lần rồi, char *, có nghĩa là "cho tôi một biến 977 00:40:29,020 --> 00:40:31,210 đó là sẽ có địa chỉ của một char. " 978 00:40:31,210 --> 00:40:33,990 * Vì vậy, char trong bối cảnh đó có nghĩa là "cho tôi một biến." 979 00:40:33,990 --> 00:40:40,050 >> Thật không may, nếu bạn sử dụng mà không cần * một từ trong phía trước của nó, giống như char, 980 00:40:40,050 --> 00:40:41,905 nó bây giờ được gọi là toán tử tham chiếu. 981 00:40:41,905 --> 00:40:43,530 Và chúng ta sẽ thấy nhiều hơn về điều này trước khi dài. 982 00:40:43,530 --> 00:40:44,930 Tuy nhiên, nó chỉ có nghĩa là "đi đến đó." 983 00:40:44,930 --> 00:40:49,070 Nó giống như nói rằng, nếu ai đó đưa cho tôi trên một mảnh giấy "33 Oxford Street," 984 00:40:49,070 --> 00:40:53,830 nếu tôi làm "* 33 Oxford Street," điều đó có nghĩa "Đi theo con đường để xây dựng CS." 985 00:40:53,830 --> 00:40:57,220 >> Vì vậy * chỉ có nghĩa là đi đến đó nếu không có từ trong phía trước của nó. 986 00:40:57,220 --> 00:40:59,100 Vì vậy, là những gì t, để được rõ ràng? 987 00:40:59,100 --> 00:41:03,250 t là địa chỉ của đoạn bộ nhớ đã được trao lại cho tôi. 988 00:41:03,250 --> 00:41:06,650 s là địa chỉ của những gì, để được rõ ràng, trong ví dụ này, chúng tôi đã thảo luận, 989 00:41:06,650 --> 00:41:07,500 của gabe chữ thường? 990 00:41:07,500 --> 00:41:08,990 991 00:41:08,990 --> 00:41:10,005 s là địa chỉ of-- 992 00:41:10,005 --> 00:41:11,585 993 00:41:11,585 --> 00:41:12,460 ĐỐI TƯỢNG: Các chuỗi. 994 00:41:12,460 --> 00:41:14,126 DAVID J. Malan: Trong tên ban đầu của Gabe. 995 00:41:14,126 --> 00:41:16,660 Vì vậy, nó là địa chỉ của đoạn này của bộ nhớ. 996 00:41:16,660 --> 00:41:22,220 Vì vậy, nếu tôi nói t + i-- tôi, thông báo, chỉ là người bạn cũ của chúng tôi. 997 00:41:22,220 --> 00:41:24,770 Nó chỉ là một biến chỉ số đó là lặp lại từ con số không lên trên 998 00:41:24,770 --> 00:41:26,960 với chiều dài của chuỗi s. 999 00:41:26,960 --> 00:41:30,367 Vì vậy, nó sẽ là không, sau đó một, sau đó hai, sau đó ba, sau đó bốn. 1000 00:41:30,367 --> 00:41:33,200 Vì vậy, hãy lắp ráp các mới Mảnh ghép đầu giống như, nếu bạn muốn, 1001 00:41:33,200 --> 00:41:36,140 mặc dù, một lần nữa, cú pháp được thêm rất nhiều phức tạp hơn so với Scratch. 1002 00:41:36,140 --> 00:41:39,522 Vì vậy, t là một địa chỉ + tôi sẽ cung cấp cho tôi 1003 00:41:39,522 --> 00:41:42,480 một số, bởi vì đây là tất cả con số mà chúng tôi đã được vẽ như hex. 1004 00:41:42,480 --> 00:41:43,560 Nhưng chúng chỉ là các con số. 1005 00:41:43,560 --> 00:41:49,960 >> Vì vậy, nếu địa chỉ của chúng tôi đã nói t là 0x88, 0x88 cộng với những gì không. 1006 00:41:49,960 --> 00:41:51,564 1007 00:41:51,564 --> 00:41:53,980 Thậm chí nếu bạn không thoải mái với hex chưa, hãy đoán. 1008 00:41:53,980 --> 00:41:54,410 >> TƯỢNG: Bản gốc. 1009 00:41:54,410 --> 00:41:55,850 >> DAVID J. Malan: Vẫn còn 0x88. 1010 00:41:55,850 --> 00:41:58,910 Vì vậy, những gì hiện * 0x88 nghĩa là gì? 1011 00:41:58,910 --> 00:42:02,670 Nó có nghĩa là "đến đó" có nghĩa là hiệu quả ", đặt ngón tay của bạn ở đây." 1012 00:42:02,670 --> 00:42:06,930 Và giờ đây, ở phía bên tay phải của biểu thức này, * và sau đó trong dấu ngoặc, 1013 00:42:06,930 --> 00:42:11,586 s + i là s, đó là địa chỉ lên đây của g ít. 1014 00:42:11,586 --> 00:42:16,220 s + 0 là, tất nhiên, s, s là bất cứ điều gì. 1015 00:42:16,220 --> 00:42:21,230 >> Vì vậy, bây giờ, nó * s, mà giống như * 33 Oxford Street có nghĩa là đi đến địa chỉ 1016 00:42:21,230 --> 00:42:22,010 s. 1017 00:42:22,010 --> 00:42:24,170 Vì vậy, đây là ngón tay này, tay phải. 1018 00:42:24,170 --> 00:42:26,050 Vì vậy, những gì tôi sẽ sao chép vào những gì? 1019 00:42:26,050 --> 00:42:30,260 Điều bên phải, đó là gabe, ít g đây, vào đây. 1020 00:42:30,260 --> 00:42:32,750 >> Và vì vậy hiệu quả đó lặp đi lặp lại đầu tiên của vòng lặp, 1021 00:42:32,750 --> 00:42:36,200 như bạn đề nghị, mặc dù có vẻ điên phức tạp hơn bất cứ điều gì 1022 00:42:36,200 --> 00:42:42,110 chúng ta đã thấy trước đây, chỉ đơn giản là nói đi ở đây và sao chép nhân vật đó ở đây. 1023 00:42:42,110 --> 00:42:44,700 Nó đem lại cho bạn một bản đồ để cả hai địa điểm. 1024 00:42:44,700 --> 00:42:46,130 >> Và chúng ta sẽ thấy nhiều hơn về điều này. 1025 00:42:46,130 --> 00:42:50,600 Nhưng hiện nay, hy vọng chỉ là để giới thiệu một số trong những ý tưởng cơ bản. 1026 00:42:50,600 --> 00:42:53,550 Và thực sự, chúng ta hãy nhìn vào một chương trình cuối cùng ở đây, 1027 00:42:53,550 --> 00:42:57,480 và sau đó là Claymation hứa, mà sẽ làm cho tất cả mọi thứ rồi. 1028 00:42:57,480 --> 00:42:57,980 Tất cả các quyền. 1029 00:42:57,980 --> 00:43:01,680 Vì vậy, hãy để tôi mở up-- có chúng tôi đi. 1030 00:43:01,680 --> 00:43:02,850 1031 00:43:02,850 --> 00:43:05,440 Vì vậy, hãy me-- chúng tôi sẽ trở lại hình ảnh này trước khi dài. 1032 00:43:05,440 --> 00:43:08,360 Hãy để tôi mở ví dụ cuối cùng ở đây. 1033 00:43:08,360 --> 00:43:09,440 1034 00:43:09,440 --> 00:43:12,710 >> Vì vậy, đây là một siêu, siêu chương trình hoàn thành 1035 00:43:12,710 --> 00:43:15,050 không có gì trong cuộc sống mà thực hiện những điều sau đây. 1036 00:43:15,050 --> 00:43:18,740 Nó đầu tiên khai báo hai biến, x và y, mà không phải là số thời gian này, 1037 00:43:18,740 --> 00:43:19,240 cho mỗi gia nhập. 1038 00:43:19,240 --> 00:43:20,448 Chúng không phải là số nguyên, mỗi gia nhập. 1039 00:43:20,448 --> 00:43:22,899 Họ dường như int *. 1040 00:43:22,899 --> 00:43:25,690 Vì vậy, bất cứ ai, điều đó có nghĩa nếu kiểu dữ liệu của bạn, biến bạn, 1041 00:43:25,690 --> 00:43:26,860 là kiểu int * sao? 1042 00:43:26,860 --> 00:43:30,240 Đó là địa chỉ của một int. 1043 00:43:30,240 --> 00:43:31,990 >> Vì vậy, tôi đã không có ý tưởng, nơi nó được nêu ra. 1044 00:43:31,990 --> 00:43:35,150 Nó chỉ có nghĩa là "đặt, cuối cùng, địa chỉ của một int ở đây. " 1045 00:43:35,150 --> 00:43:38,340 0x50, 0x88, bất cứ nơi nào nó đang ở trong bộ nhớ, một địa chỉ được đến đó. 1046 00:43:38,340 --> 00:43:40,200 Và đó là những gì y là có được, là tốt. 1047 00:43:40,200 --> 00:43:44,920 >> Nếu bây giờ tôi nói x = malloc (sizeof (int)), đây là một cách nói, 1048 00:43:44,920 --> 00:43:49,000 hey hệ điều hành, thông qua malloc, cho tôi đủ bộ nhớ cho các kích thước 1049 00:43:49,000 --> 00:43:52,370 của một int, mà có lẽ là sẽ là 32 bit hay bốn byte. 1050 00:43:52,370 --> 00:43:53,680 >> Vì vậy, những gì malloc trở lại? 1051 00:43:53,680 --> 00:43:55,250 Malloc trả về một địa chỉ. 1052 00:43:55,250 --> 00:43:57,020 Vì vậy, những gì sẽ được lưu trữ trong x? 1053 00:43:57,020 --> 00:44:00,600 Địa chỉ của đoạn bộ nhớ, bốn byte, malloc mà 1054 00:44:00,600 --> 00:44:03,360 chỉ dành cho tôi bằng cách yêu cầu hệ điều hành. 1055 00:44:03,360 --> 00:44:08,240 >> Bây giờ trong khi đó, dòng bốn ở đây, * x = 42. 1056 00:44:08,240 --> 00:44:09,990 Chỉ cần được rõ ràng, những gì đang xảy ra ở đó? 1057 00:44:09,990 --> 00:44:11,530 Ở phía bên trái, * x. 1058 00:44:11,530 --> 00:44:13,610 đó là như * 33 đường Oxford. 1059 00:44:13,610 --> 00:44:15,523 Vì vậy * x có nghĩa là gì? 1060 00:44:15,523 --> 00:44:16,450 >> TƯỢNG: Tới. 1061 00:44:16,450 --> 00:44:17,908 >> DAVID J. Malan: Tới địa chỉ đó. 1062 00:44:17,908 --> 00:44:20,466 Bất cứ nơi nào mà đoạn bộ nhớ, hãy đến đó. 1063 00:44:20,466 --> 00:44:21,979 Và đặt những gì đang có, rõ ràng? 1064 00:44:21,979 --> 00:44:22,520 TƯỢNG: 42. 1065 00:44:22,520 --> 00:44:23,580 DAVID J. Malan: 42. 1066 00:44:23,580 --> 00:44:25,650 Được rồi, * y, cùng một ý tưởng. 1067 00:44:25,650 --> 00:44:26,860 Tới địa chỉ trong y. 1068 00:44:26,860 --> 00:44:31,740 Đặt con số 13 đó, nhưng y tại thời điểm này là gì? 1069 00:44:31,740 --> 00:44:33,172 1070 00:44:33,172 --> 00:44:34,630 TƯỢNG: Không có bộ nhớ cho y. 1071 00:44:34,630 --> 00:44:35,710 DAVID J. Malan: Có không có bộ nhớ cho y. 1072 00:44:35,710 --> 00:44:38,215 Vì vậy, những gì y có thể chứa, như chúng ta đã nói? 1073 00:44:38,215 --> 00:44:38,520 >> TƯỢNG: Thùng đựng rác. 1074 00:44:38,520 --> 00:44:39,480 >> DAVID J. Malan: Một số giá trị rác. 1075 00:44:39,480 --> 00:44:41,320 Bây giờ, giá trị rác vẫn là một con số. 1076 00:44:41,320 --> 00:44:43,160 Nó vẫn có thể bị nhầm lẫn với một địa chỉ. 1077 00:44:43,160 --> 00:44:45,160 Nó như thể một người nào đó viết vội một cái gì đó xuống, 1078 00:44:45,160 --> 00:44:48,002 và tôi hiểu sai nó như là ý nghĩa một số tòa nhà xuống đường phố. 1079 00:44:48,002 --> 00:44:50,460 Và nếu bạn chỉ cần cố gắng để đi vào xây dựng một số bạn không sở hữu, 1080 00:44:50,460 --> 00:44:53,710 hoặc một số đoạn bộ nhớ bạn có không được đưa ra, những điều xấu có thể xảy ra. 1081 00:44:53,710 --> 00:44:57,740 Máy tính có thể sụp đổ, hoặc một số khác hành vi không xác định có thể xảy ra. 1082 00:44:57,740 --> 00:45:01,310 >> Vì vậy, giới thiệu, sau đó, để Binky là điều này. 1083 00:45:01,310 --> 00:45:04,290 Tôi vẫn còn nhớ, 20 một số năm lẻ sau đó, 1084 00:45:04,290 --> 00:45:07,200 nơi tôi là khi tôi cuối cùng hiểu con trỏ. 1085 00:45:07,200 --> 00:45:09,520 >> Mà là để nói, nếu bạn rời khỏi đây trong ba phút 1086 00:45:09,520 --> 00:45:12,170 và nghĩ rằng tôi không hiểu con trỏ, nhận ra 1087 00:45:12,170 --> 00:45:14,410 Tôi đã nhớ trong 20 năm đối với một số lý do điên 1088 00:45:14,410 --> 00:45:17,140 khi nào và lý do tại sao cuối cùng nó bị chìm trong, ngồi với giảng dạy của tôi 1089 00:45:17,140 --> 00:45:19,501 đồng, Nishat Mehta trong sau của Eliot ăn Hall. 1090 00:45:19,501 --> 00:45:21,250 Bây giờ, tôi đã nhớ này bởi vì đây là 1091 00:45:21,250 --> 00:45:23,920 một trong những chủ đề tôi, trong Đặc biệt, phải vật lộn với. 1092 00:45:23,920 --> 00:45:26,470 Và sau đó, nó cuối cùng nhấn vào, như tôi dám nói rất nhiều chủ đề 1093 00:45:26,470 --> 00:45:27,460 cuối cùng sẽ. 1094 00:45:27,460 --> 00:45:32,590 Và bây giờ, để làm cho rằng cảm thấy tất cả các hạnh phúc hơn và thuyết phục hơn nữa, 1095 00:45:32,590 --> 00:45:35,360 chúng ta hãy có một cái nhìn cuối cùng của chúng tôi ba phút cuối cùng ở đây tại Binky, 1096 00:45:35,360 --> 00:45:37,675 từ một người bạn của chúng tôi, Nick Parlante từ Stanford. 1097 00:45:37,675 --> 00:45:38,910 1098 00:45:38,910 --> 00:45:41,580 >> [VIDEO xem lại] 1099 00:45:41,580 --> 00:45:42,750 >> Này, Binky. 1100 00:45:42,750 --> 00:45:43,500 Thức dậy! 1101 00:45:43,500 --> 00:45:45,960 Đó là thời gian cho con trỏ thú vị. 1102 00:45:45,960 --> 00:45:47,012 >> Cái gì vậy? 1103 00:45:47,012 --> 00:45:48,723 Tìm hiểu về con trỏ? 1104 00:45:48,723 --> 00:45:50,580 Oh, hay qúa! 1105 00:45:50,580 --> 00:45:53,563 >> -Vâng, Để bắt đầu, tôi đoán chúng tôi sẽ cần một vài con trỏ. 1106 00:45:53,563 --> 00:45:54,390 >> -Ok. 1107 00:45:54,390 --> 00:45:57,930 Đoạn mã này cấp phát hai con trỏ, mà có thể trỏ đến số nguyên. 1108 00:45:57,930 --> 00:45:58,430 -Ok. 1109 00:45:58,430 --> 00:46:02,140 Vâng, tôi nhìn thấy hai con trỏ, nhưng họ dường như không được trỏ đến bất cứ điều gì. 1110 00:46:02,140 --> 00:46:02,980 >> -Điều Đó là đúng. 1111 00:46:02,980 --> 00:46:05,100 Ban đầu, con trỏ không chỉ để bất cứ điều gì. 1112 00:46:05,100 --> 00:46:08,030 Những điều họ chỉ để được gọi là pointees, và cài đặt chúng lên của 1113 00:46:08,030 --> 00:46:09,370 một bước riêng biệt. 1114 00:46:09,370 --> 00:46:10,220 >> Ồ, đúng rồi. 1115 00:46:10,220 --> 00:46:10,950 Tôi biết điều đó. 1116 00:46:10,950 --> 00:46:12,385 Các pointees là riêng biệt. 1117 00:46:12,385 --> 00:46:14,315 Er, vì vậy làm thế nào để phân bổ một pointee? 1118 00:46:14,315 --> 00:46:15,340 1119 00:46:15,340 --> 00:46:15,960 >> -Ok. 1120 00:46:15,960 --> 00:46:18,970 Vâng, mã này giao một pointee nguyên mới, 1121 00:46:18,970 --> 00:46:20,950 và điều này một phần bộ x để trỏ đến nó. 1122 00:46:20,950 --> 00:46:22,050 1123 00:46:22,050 --> 00:46:23,230 >> Này, có vẻ tốt hơn. 1124 00:46:23,230 --> 00:46:25,060 Vì vậy, làm cho nó làm một cái gì đó. 1125 00:46:25,060 --> 00:46:25,990 >> -Ok. 1126 00:46:25,990 --> 00:46:30,455 Tôi sẽ tới đích của con trỏ đến x lưu trữ số 42 vào pointee của nó. 1127 00:46:30,455 --> 00:46:32,830 Đối với thủ thuật này, tôi sẽ cần tôi Magic Wand của dereferencing. 1128 00:46:32,830 --> 00:46:34,130 1129 00:46:34,130 --> 00:46:36,080 >> -Your Magic Wand của dereferencing? 1130 00:46:36,080 --> 00:46:37,357 1131 00:46:37,357 --> 00:46:38,190 That-- đó là tuyệt vời. 1132 00:46:38,190 --> 00:46:39,340 1133 00:46:39,340 --> 00:46:41,080 >> -Đây Là những gì các mã như thế nào. 1134 00:46:41,080 --> 00:46:44,110 Tôi sẽ chỉ cần thiết lập số lượng, và [POP] 1135 00:46:44,110 --> 00:46:44,700 >> Này, xem xét. 1136 00:46:44,700 --> 00:46:46,140 Có nó đi. 1137 00:46:46,140 --> 00:46:50,980 >> -Vậy Làm một tới đích vào x sau mũi tên để truy cập pointee của nó. 1138 00:46:50,980 --> 00:46:53,160 Trong trường hợp này, một cửa hàng 42 trong đó. 1139 00:46:53,160 --> 00:46:57,710 Này hãy thử sử dụng nó để lưu trữ số 13 thông qua con trỏ khác, y. 1140 00:46:57,710 --> 00:46:58,760 >> -Ok. 1141 00:46:58,760 --> 00:47:03,270 Tôi sẽ chỉ đi qua đây để y, và nhận được con số 13 thiết lập. 1142 00:47:03,270 --> 00:47:07,930 Và sau đó, lấy của Wand Dereferencing và chỉ [BUZZ] 1143 00:47:07,930 --> 00:47:08,960 >> Ồ! 1144 00:47:08,960 --> 00:47:09,500 >> Oh, hey! 1145 00:47:09,500 --> 00:47:11,090 Điều đó không làm việc. 1146 00:47:11,090 --> 00:47:15,630 Nói, Binky, tôi không nghĩ rằng dereferencing y là một ý tưởng tốt, bởi vì bạn đã biết, 1147 00:47:15,630 --> 00:47:17,850 lập pointee là một bước riêng biệt. 1148 00:47:17,850 --> 00:47:20,450 Và tôi không bao giờ nghĩ rằng chúng ta đã làm được. 1149 00:47:20,450 --> 00:47:21,480 >> Điểm Tốt. 1150 00:47:21,480 --> 00:47:21,980 -Yeah. 1151 00:47:21,980 --> 00:47:25,680 Chúng tôi bố trí con trỏ y, nhưng chúng tôi không bao giờ đặt nó để trỏ đến một pointee. 1152 00:47:25,680 --> 00:47:27,190 1153 00:47:27,190 --> 00:47:28,616 >> -Rất Quan sát. 1154 00:47:28,616 --> 00:47:30,240 Này, bạn đang tìm kiếm tốt có, Binky. 1155 00:47:30,240 --> 00:47:33,400 Bạn có thể sửa chữa nó sao cho các điểm y đến pointee giống như x? 1156 00:47:33,400 --> 00:47:34,000 >> -Sure. 1157 00:47:34,000 --> 00:47:36,780 Tôi sẽ sử dụng Magic Wand của tôi của con trỏ chuyển nhượng. 1158 00:47:36,780 --> 00:47:38,740 >> -Là đó sẽ là một vấn đề như trước đây? 1159 00:47:38,740 --> 00:47:39,240 -Không. 1160 00:47:39,240 --> 00:47:40,660 Điều này không chạm vào pointees. 1161 00:47:40,660 --> 00:47:44,450 Nó chỉ thay đổi một con trỏ đến chỉ ra những điều tương tự như nhau. 1162 00:47:44,450 --> 00:47:45,450 >> Oh, tôi nhìn thấy. 1163 00:47:45,450 --> 00:47:48,200 Bây giờ y điểm cùng vị trí x. 1164 00:47:48,200 --> 00:47:48,910 Vì vậy, chờ đợi. 1165 00:47:48,910 --> 00:47:49,950 Bây giờ, y là cố định. 1166 00:47:49,950 --> 00:47:51,120 Nó có một pointee. 1167 00:47:51,120 --> 00:47:54,510 Vì vậy, bạn có thể thử các Wand của Dereferencing một lần nữa để gửi 13 qua. 1168 00:47:54,510 --> 00:47:56,510 >> -Uh, OK. 1169 00:47:56,510 --> 00:47:58,160 Ở đây nó đi. [POP] 1170 00:47:58,160 --> 00:47:59,340 >> Này, nhìn vào đó. 1171 00:47:59,340 --> 00:48:00,750 Bây giờ dereferencing công trình trên y. 1172 00:48:00,750 --> 00:48:04,991 Và bởi vì các con trỏ được chia sẻ rằng một pointee, cả hai đều 13 xem. 1173 00:48:04,991 --> 00:48:05,490 -Yeah. 1174 00:48:05,490 --> 00:48:06,870 Chia sẻ, bất cứ điều gì. 1175 00:48:06,870 --> 00:48:08,820 Vì vậy, chúng ta sẽ hoán đổi vị trí bây giờ? 1176 00:48:08,820 --> 00:48:09,440 >> Oh, nhìn. 1177 00:48:09,440 --> 00:48:10,830 Chúng tôi hết thời gian. 1178 00:48:10,830 --> 00:48:11,570 >> -But-- 1179 00:48:11,570 --> 00:48:13,530 >> -Chỉ Nhớ các quy tắc ba con trỏ. 1180 00:48:13,530 --> 00:48:16,560 Number One, cấu trúc cơ bản là bạn có một con trỏ, 1181 00:48:16,560 --> 00:48:18,680 và nó chỉ qua một pointee. 1182 00:48:18,680 --> 00:48:20,640 Tuy nhiên, con trỏ và pointee riêng biệt, 1183 00:48:20,640 --> 00:48:22,610 và lỗi thường gặp là để thiết lập một con trỏ, 1184 00:48:22,610 --> 00:48:25,000 nhưng quên để cho nó một pointee. 1185 00:48:25,000 --> 00:48:28,170 >> Số Hai, con trỏ dereferencing bắt đầu từ con trỏ 1186 00:48:28,170 --> 00:48:31,050 và sau mũi tên của mình đối với để truy cập pointee của nó. 1187 00:48:31,050 --> 00:48:33,400 Như chúng ta đều biết, điều này chỉ hoạt động nếu có 1188 00:48:33,400 --> 00:48:36,270 một pointee, trong đó loại sẽ trở lại Quy tắc số một. 1189 00:48:36,270 --> 00:48:39,000 >> Số Ba, con trỏ chuyển nhượng mất một con trỏ 1190 00:48:39,000 --> 00:48:42,320 và thay đổi nó để trỏ đến các cùng pointee như một con trỏ. 1191 00:48:42,320 --> 00:48:44,160 Vì vậy, sau khi chuyển nhượng, hai con trỏ 1192 00:48:44,160 --> 00:48:45,910 sẽ trỏ đến pointee cùng. 1193 00:48:45,910 --> 00:48:47,990 Đôi khi, đó được gọi là chia sẻ. 1194 00:48:47,990 --> 00:48:49,740 Và đó là tất cả để có nó, thực sự. 1195 00:48:49,740 --> 00:48:50,277 Tạm biệt bây giờ. 1196 00:48:50,277 --> 00:48:51,110 [END IMG xem lại] 1197 00:48:51,110 --> 00:48:52,568 DAVID J. Malan: Đó là nó cho CS50. 1198 00:48:52,568 --> 00:48:55,110 Chúng ta sẽ thấy bạn vào tuần tới. 1199 00:48:55,110 --> 00:48:56,064