1 00:00:00,000 --> 00:00:03,395 >> [MUSIC CHƠI] 2 00:00:03,395 --> 00:00:11,031 3 00:00:11,031 --> 00:00:13,280 DAVID J. Malan: Điều này giống như Hội thảo sinh viên năm nhất ngày hôm nay. 4 00:00:13,280 --> 00:00:14,060 ĐƯỢC. 5 00:00:14,060 --> 00:00:15,024 Vì vậy, rất mưa ra. 6 00:00:15,024 --> 00:00:17,690 Điều này có xu hướng xảy ra vào ngày thứ Tư, nhưng tất cả các cơ hội hơn 7 00:00:17,690 --> 00:00:18,700 cho câu hỏi ngày hôm nay. 8 00:00:18,700 --> 00:00:22,210 Vì vậy, hãy bắt đầu thực sự với bộ phim chỉ trong một khoảnh khắc. 9 00:00:22,210 --> 00:00:24,560 Nhưng chúng ta sẽ bắt đầu grandly như mọi khi. 10 00:00:24,560 --> 00:00:28,000 >> Đây là CS50, và điều này là kết thúc của tuần 4. 11 00:00:28,000 --> 00:00:30,820 Vì vậy, nếu bạn đã từng xem TV hoặc một trong đó phim 12 00:00:30,820 --> 00:00:34,690 có một số chuyên gia máy tính và cảnh sát, hay FBI, hoặc một số cơ quan 13 00:00:34,690 --> 00:00:36,930 đang cố gắng để bắt một số kẻ thù, tốt, bạn đã 14 00:00:36,930 --> 00:00:40,850 có lẽ nghe những biểu "tăng cường" nhờ đó mà kỹ thuật nào đó mà 15 00:00:40,850 --> 00:00:44,750 kỳ diệu phóng to vô hạn xa để nhìn thấy những tên tội phạm 16 00:00:44,750 --> 00:00:48,640 minh nhân dân hoặc số tấm giấy phép ngay cả trong ánh sáng lung linh của một gương 17 00:00:48,640 --> 00:00:50,390 hoặc các tia sáng lóe lên trong mắt của một ai đó. 18 00:00:50,390 --> 00:00:55,196 Vì vậy, thực sự, chúng ta hãy nhìn vào một vài cảnh như vậy từ Hollywood. 19 00:00:55,196 --> 00:00:55,862 [VIDEO PLAYBACK] 20 00:00:55,862 --> 00:00:59,243 -Ok, Bây giờ chúng ta có được một cái nhìn tốt ở bạn. 21 00:00:59,243 --> 00:01:06,488 22 00:01:06,488 --> 00:01:07,415 >> -Giữ lấy nó. 23 00:01:07,415 --> 00:01:08,267 Chạy lại đó. 24 00:01:08,267 --> 00:01:09,121 >> -Đợi một lát. 25 00:01:09,121 --> 00:01:11,300 Đi sang phải. 26 00:01:11,300 --> 00:01:12,209 >> -Có, Đóng băng đó. 27 00:01:12,209 --> 00:01:12,750 -Toàn màn hình. 28 00:01:12,750 --> 00:01:13,558 -Ok, Đóng băng đó. 29 00:01:13,558 --> 00:01:14,820 -Tighten Lên trên đó, bạn sẽ? 30 00:01:14,820 --> 00:01:16,530 -Vector Ở trên đó chàng bằng bánh xe trở lại. 31 00:01:16,530 --> 00:01:19,400 -Zoom Ở ngay trên chỗ này. 32 00:01:19,400 --> 00:01:22,846 -Với Quyền thiết bị, hình ảnh có thể được mở rộng và sắc nét. 33 00:01:22,846 --> 00:01:24,065 -Cái gì thế? 34 00:01:24,065 --> 00:01:25,600 -Nó Là một chương trình nâng cao. 35 00:01:25,600 --> 00:01:26,860 -Cần Bạn rõ ràng là bất kỳ? 36 00:01:26,860 --> 00:01:27,890 -Tôi không biết. 37 00:01:27,890 --> 00:01:29,050 Chúng ta hãy nâng cao nó. 38 00:01:29,050 --> 00:01:31,575 >> -Enhance Phần A6. 39 00:01:31,575 --> 00:01:33,642 >> -Tôi Tăng cường các chi tiết, và- Tôi nghĩ rằng có 40 00:01:33,642 --> 00:01:35,433 đủ để tăng cường, phát hành nó để màn hình của tôi. 41 00:01:35,433 --> 00:01:37,080 -Tôi Tăng cường sự phản chiếu trong mắt cô. 42 00:01:37,080 --> 00:01:38,830 >> -Let Đang chạy này thông qua video nâng cao. 43 00:01:38,830 --> 00:01:40,100 -Edgar, Bạn có thể nâng cao này? 44 00:01:40,100 --> 00:01:41,875 >> -Treo lên. 45 00:01:41,875 --> 00:01:44,010 >> -I've Được làm việc trên sự phản ánh này. 46 00:01:44,010 --> 00:01:44,995 >> Phản ánh -Someone của. 47 00:01:44,995 --> 00:01:45,495 -Reflection. 48 00:01:45,495 --> 00:01:47,399 -Có Là sự phản chiếu của gương mặt của người đàn ông. 49 00:01:47,399 --> 00:01:48,065 -Các Phản ánh. 50 00:01:48,065 --> 00:01:48,981 -Có Một sự phản ánh. 51 00:01:48,981 --> 00:01:50,600 -Zoom Ở trên gương. 52 00:01:50,600 --> 00:01:52,712 -Bạn Có thể thấy một sự phản ánh. 53 00:01:52,712 --> 00:01:54,350 -Có Bạn nâng cao hình ảnh từ đây? 54 00:01:54,350 --> 00:01:55,370 -Có Bạn tăng cường anh phải ở đây? 55 00:01:55,370 --> 00:01:56,210 -Có Bạn nâng cao nó? 56 00:01:56,210 --> 00:01:56,900 Bạn có thể nâng cao nó? 57 00:01:56,900 --> 00:01:57,870 >> Chúng tôi -Có nâng cao này? 58 00:01:57,870 --> 00:01:58,717 >> -Có Bạn nâng cao nó? 59 00:01:58,717 --> 00:02:00,050 -Hold Trên một giây, tôi sẽ tăng cường. 60 00:02:00,050 --> 00:02:00,924 -Zoom Ở trên cửa. 61 00:02:00,924 --> 00:02:01,700 -Times 10. 62 00:02:01,700 --> 00:02:02,586 -Thu phóng. 63 00:02:02,586 --> 00:02:03,490 -Chuyển đến. 64 00:02:03,490 --> 00:02:03,990 -Xem Thêm. 65 00:02:03,990 --> 00:02:04,690 -Wait, Dừng lại. 66 00:02:04,690 --> 00:02:05,190 -Dừng lại. 67 00:02:05,190 --> 00:02:05,970 -Pause Nó. 68 00:02:05,970 --> 00:02:09,460 Xoay 75 độ chúng tôi xung quanh dọc, xin vui lòng. 69 00:02:09,460 --> 00:02:10,962 -Dừng lại. 70 00:02:10,962 --> 00:02:14,040 Quay trở lại phần về cánh cửa, một lần nữa. 71 00:02:14,040 --> 00:02:15,860 >> -Got Một enhancer hình ảnh có thể bitmap? 72 00:02:15,860 --> 00:02:18,776 >> -Hey, Có lẽ chúng ta có thể sử dụng các Pradeep Phương pháp Sen nhìn thấy vào cửa sổ. 73 00:02:18,776 --> 00:02:20,372 Phần mềm -Đây là nhà nước của nghệ thuật. 74 00:02:20,372 --> 00:02:21,845 >> -Các Eigenvalue là tắt. 75 00:02:21,845 --> 00:02:24,300 >> -Với Quyền sự kết hợp của algorithm-- 76 00:02:24,300 --> 00:02:26,755 >> Loại bỏ lấy của -Ông các thuật toán để cấp độ tiếp theo, 77 00:02:26,755 --> 00:02:28,730 và tôi có thể sử dụng chúng để tăng cường bức ảnh này. 78 00:02:28,730 --> 00:02:31,286 >> -Lock Trên và mở rộng các trục z. 79 00:02:31,286 --> 00:02:32,560 >> -Enhance. 80 00:02:32,560 --> 00:02:33,100 >> -Enhance. 81 00:02:33,100 --> 00:02:33,600 >> -Enhance. 82 00:02:33,600 --> 00:02:34,960 -Freeze Và tăng cường. 83 00:02:34,960 --> 00:02:37,180 >> [END PLAYBACK] 84 00:02:37,180 --> 00:02:41,160 >> DAVID J. Malan: Tất cả các bên phải, vì vậy tất cả những người đang thực sự từ. 85 00:02:41,160 --> 00:02:44,450 Họ chỉ cần kết hợp với nhau trong một cách đó không thực sự hợp lý. 86 00:02:44,450 --> 00:02:48,400 Và, trên thực tế, các khóa học CS50 và thích nó có xu hướng làm hỏng rất nhiều TV và phim ảnh 87 00:02:48,400 --> 00:02:48,900 cho bạn. 88 00:02:48,900 --> 00:02:52,330 Bởi vì khi những chuyên gia máy tính đang tuôn ra những điều khoản và nói 89 00:02:52,330 --> 00:02:56,860 thứ ưa thích như vector riêng, và trục z, 90 00:02:56,860 --> 00:02:59,572 và bất kỳ số khác thực sự về kỹ thuật nhiều hơn, 91 00:02:59,572 --> 00:03:02,030 họ đang thực sự chỉ xâu chuỗi từ với nhau tất cả các quá thường xuyên. 92 00:03:02,030 --> 00:03:05,020 Là một trong những niềm hy vọng của chúng tôi là, như một tác dụng phụ của các khóa học lấy 93 00:03:05,020 --> 00:03:08,245 như thế này, sẽ nhiều người trong thế giới thực sự có thể cân nhắc trong 94 00:03:08,245 --> 00:03:12,040 và chỉ bao giờ nên hơi ảnh hưởng đến chất lượng và độ chính xác của các bộ phim? 95 00:03:12,040 --> 00:03:14,350 >> Trong thực tế, chúng ta hãy nhìn vào thực tế. 96 00:03:14,350 --> 00:03:18,070 Vì vậy, đây là hình ảnh của nhân viên Mary, một nghiên cứu sinh giảng dạy của chúng tôi. 97 00:03:18,070 --> 00:03:20,050 Và giả sử cô ấy là nghi ngờ của một cái gì đó. 98 00:03:20,050 --> 00:03:23,730 Chưa hết, có một tia một số mảnh bằng chứng trong mắt cô, 99 00:03:23,730 --> 00:03:25,480 hoặc trong ánh phản chiếu của kính đeo mắt của cô. 100 00:03:25,480 --> 00:03:30,760 Vâng, nếu chúng ta làm đúng như những bộ phim đề xuất, trong đó chúng tôi phóng to và "nâng cao", 101 00:03:30,760 --> 00:03:34,080 này là bao nhiêu thông tin là trong khuôn mặt của Mary 102 00:03:34,080 --> 00:03:36,795 khi chụp ảnh với độ phân giải gốc. 103 00:03:36,795 --> 00:03:39,120 >> Và, trên thực tế, bạn có thể nhìn thấy những dấu chấm. 104 00:03:39,120 --> 00:03:41,900 Và đây là những gì được gọi là điểm ảnh, P-I-X-E-L-S, 105 00:03:41,900 --> 00:03:45,740 mà chỉ là một hình vuông thường đó là một dấu chấm đó soạn một hình ảnh. 106 00:03:45,740 --> 00:03:49,200 Và trở lại trong ngày, và thực sự thậm chí ngày hôm nay với một số TV LED hiện nay 107 00:03:49,200 --> 00:03:51,950 hoặc LCD TV, nếu bạn đã có một trong phòng hay ở nhà, 108 00:03:51,950 --> 00:03:55,100 nếu bạn đi lên siêu gần nó, và đặc biệt nếu đó là một TV hơi cũ, 109 00:03:55,100 --> 00:03:58,760 bạn có thể có lẽ thậm chí nhìn thấy những dấu chấm và đó là những gì soạn một hình ảnh. 110 00:03:58,760 --> 00:04:00,980 >> Và không có thêm thông tin hơn này. 111 00:04:00,980 --> 00:04:05,400 Chúng ta có thể "nâng cao", trong ý nghĩa của làm mịn những điều trên và loại 112 00:04:05,400 --> 00:04:09,040 Suy luận loại, loại gì màu sắc nên được bên cạnh mắt của Mary 113 00:04:09,040 --> 00:04:10,910 vì vậy mà nó không thực sự như vậy pixelated. 114 00:04:10,910 --> 00:04:14,510 Nhưng nếu tôi tiếp tục phóng to, có là kẻ xấu trong mắt cô. 115 00:04:14,510 --> 00:04:16,600 Giống như đó là tất cả các thông tin chúng tôi có. 116 00:04:16,600 --> 00:04:18,920 Bạn không thể tạo thông tin trong không có gì. 117 00:04:18,920 --> 00:04:20,790 Chỉ có duy nhất một hữu hạn số bit có. 118 00:04:20,790 --> 00:04:22,873 >> Vì vậy, trong vấn đề Set 4, nơi bạn có một cơ hội 119 00:04:22,873 --> 00:04:24,580 chơi với loại này của thế giới. 120 00:04:24,580 --> 00:04:27,610 Trong Problem Set 4, bạn sẽ khám phá thế giới đồ họa, và pháp y, 121 00:04:27,610 --> 00:04:30,870 và thực sự viết code mà phục hồi hình ảnh bị mất. 122 00:04:30,870 --> 00:04:33,510 Bạn sẽ viết code mà thao tác hình ảnh hiện tại 123 00:04:33,510 --> 00:04:36,120 và cuối cùng hiểu được những gì xảy ra dưới mui xe. 124 00:04:36,120 --> 00:04:38,540 >> Và, nó quay ra, nó thực sự không phải tất cả những gì phức tạp. 125 00:04:38,540 --> 00:04:41,320 Ví dụ, nếu chúng ta muốn đại diện cho một khuôn mặt cười ở đâu 126 00:04:41,320 --> 00:04:44,160 với các điểm ảnh màu đen, hoặc những chấm đen, 127 00:04:44,160 --> 00:04:47,230 tốt, chúng tôi chỉ đơn giản là có thể đại diện họ là thực sự là một bitmap. 128 00:04:47,230 --> 00:04:50,040 Và nếu bạn đã từng nghe nói rằng biểu bitmap, có lẽ 129 00:04:50,040 --> 00:04:52,330 nó bây giờ bắt đầu để thực hiện một rất ít ý nghĩa hơn ngày hôm nay. 130 00:04:52,330 --> 00:04:53,580 >> Chúng ta đã biết những gì một chút là. 131 00:04:53,580 --> 00:04:54,160 Đó là 0 hoặc 1. 132 00:04:54,160 --> 00:04:56,201 Và một bản đồ chỉ là một cái gì đó giống như một mảnh giấy 133 00:04:56,201 --> 00:04:59,180 cung cấp cho bạn hướng dẫn và có có thể là một mạng lưới các x và y tọa độ. 134 00:04:59,180 --> 00:05:00,540 Vì vậy, đây là một bitmap. 135 00:05:00,540 --> 00:05:03,680 Đó là một bản đồ của các bit theo đó một 1 là rõ ràng 136 00:05:03,680 --> 00:05:07,857 sẽ đại diện cho một điểm ảnh màu trắng, và một 0 sẽ đại diện cho một điểm ảnh màu đen. 137 00:05:07,857 --> 00:05:09,440 Nhưng chúng tôi chắc chắn có thể lật nó xung quanh. 138 00:05:09,440 --> 00:05:11,648 Nó không thực sự quan trọng như vậy miễn là chúng tôi nhất quán. 139 00:05:11,648 --> 00:05:15,570 Và ở đây là làm thế nào, trong binary-- bên trong bộ nhớ của máy tính, hoặc thậm chí bên trong 140 00:05:15,570 --> 00:05:18,160 của một tập tin trên đĩa cứng của bạn drive-- bạn có thể lưu trữ 141 00:05:18,160 --> 00:05:20,240 đơn giản nhất của hình ảnh khuôn mặt cười. 142 00:05:20,240 --> 00:05:23,990 Nhưng chúng ta là gì, tất nhiên, thiếu trong hình ảnh này? 143 00:05:23,990 --> 00:05:24,610 Màu sắc, phải không? 144 00:05:24,610 --> 00:05:28,220 Đây là một bước tiếp theo rõ ràng hoặc nâng cao để cải thiện điều này với màu sắc. 145 00:05:28,220 --> 00:05:32,230 Vì vậy, tiếc với chỉ một bit, 0 hoặc 1, chúng ta có thể đại diện cho màu sắc. 146 00:05:32,230 --> 00:05:36,100 Đó có thể là màu đỏ, hoặc màu xanh, hoặc màu đen, hoặc màu trắng, hoặc màu xanh lá cây, hay màu hồng, 147 00:05:36,100 --> 00:05:37,420 hoặc bất kỳ cặp màu sắc. 148 00:05:37,420 --> 00:05:40,860 Nhưng để đơn giản, chúng tôi sẽ chỉ là giả màu đen và trắng. 149 00:05:40,860 --> 00:05:45,930 >> Vì vậy, những gì chúng ta cần làm một cách hợp lý nếu chúng ta muốn thực hiện màu trong hình ảnh? 150 00:05:45,930 --> 00:05:49,080 Những gì chúng ta phải làm gì? 151 00:05:49,080 --> 00:05:51,900 Cũng giống như nếu các yếu tố hạn chế ở đây là với một chút, bạn chỉ có thể 152 00:05:51,900 --> 00:05:55,977 đại diện cho hai quốc gia, 0 hoặc 1, màu trắng hoặc đen, làm những gì bạn muốn làm gì? 153 00:05:55,977 --> 00:05:56,810 Đung gửi dữ liệu. 154 00:05:56,810 --> 00:05:58,813 DAVID J. Malan: More bit, vâng nhiều dữ liệu hơn, nhiều bit. 155 00:05:58,813 --> 00:06:01,440 Và, thực sự, đó là chính xác như thế nào hình ảnh màu sắc được đại diện. 156 00:06:01,440 --> 00:06:05,120 Thay vì sử dụng một chút, một 0 hoặc 1 cho mỗi pixel, mỗi dấu chấm, 157 00:06:05,120 --> 00:06:06,170 bạn chỉ cần sử dụng nhiều. 158 00:06:06,170 --> 00:06:09,660 Có thể sử dụng 8, có thể, thường sử dụng 24, và quả thật, trong Problem Set 159 00:06:09,660 --> 00:06:13,300 4, bạn sẽ chơi với một tập tin định dạng mà sử dụng 24 bit thường. 160 00:06:13,300 --> 00:06:15,430 >> Nhưng hầu hết các bạn có thể quen thuộc với hình ảnh JPEG. 161 00:06:15,430 --> 00:06:17,460 Nếu bạn đã từng quan ảnh trên điện thoại của bạn, 162 00:06:17,460 --> 00:06:20,360 hoặc tải lên hoặc nhìn thấy một cái gì đó trên Facebook, Flickr hoặc, bất kỳ số 163 00:06:20,360 --> 00:06:24,882 các trang web hình ảnh dựa trên, bạn đã có thể nhìn thấy một hình ảnh JPEG trước. 164 00:06:24,882 --> 00:06:27,840 Và hóa ra, đây là tập tin định dạng chúng ta sẽ sử dụng trong PSet 4, 165 00:06:27,840 --> 00:06:30,340 nhờ đó mà bạn đang đi để phải khôi phục hình ảnh 166 00:06:30,340 --> 00:06:35,160 mà tôi đã vô tình bị xóa từ một hỏng thẻ nhớ trong máy ảnh, 167 00:06:35,160 --> 00:06:35,800 nếu bạn sẽ. 168 00:06:35,800 --> 00:06:38,490 >> Và nó chỉ ra rằng mặc dù JPEG là sophisticated-- khá 169 00:06:38,490 --> 00:06:40,906 nó phức tạp hơn nhiều hơn so với các chấm màu đen và trắng 170 00:06:40,906 --> 00:06:44,480 chúng ta đã thấy một chút thời gian trước đây, bởi vì có các thuật toán thực sự ưa thích mà 171 00:06:44,480 --> 00:06:47,410 được sử dụng để nén ảnh JPEG, vì vậy mà bạn có thể có một thực sự tốt đẹp, 172 00:06:47,410 --> 00:06:49,832 chất lượng hình ảnh nhưng sử dụng tương đối ít bit. 173 00:06:49,832 --> 00:06:51,790 Và chúng tôi sẽ trở lại nén trước khi dài. 174 00:06:51,790 --> 00:06:56,280 Nó chỉ ra rằng người đầu tiên ba byte trong một image-- JPEG 175 00:06:56,280 --> 00:07:02,750 không có vấn đề gì bạn đã chụp một bức ảnh of-- là các giá trị 255, 216, 255. 176 00:07:02,750 --> 00:07:05,990 >> Nói cách khác, nếu bạn chỉ thấy rằng mô hình của các bit, 177 00:07:05,990 --> 00:07:09,180 đại diện ở đây là ba byte, hoặc 24 bit tổng số, 178 00:07:09,180 --> 00:07:13,810 với xác suất cao, bạn có thể suy ra rằng bạn đang nhìn nó lần đầu tiên ba này 179 00:07:13,810 --> 00:07:15,230 byte của một JPEG. 180 00:07:15,230 --> 00:07:18,040 Và đây là những gì được biết đến như chữ ký của một JPEG. 181 00:07:18,040 --> 00:07:20,540 Rất nhiều định dạng tập tin ra có xu hướng bắt đầu 182 00:07:20,540 --> 00:07:23,735 với một số mô hình của 0 và số 1, do đó, Windows, và Mac OS, và iOS, 183 00:07:23,735 --> 00:07:28,272 và Android biết loại tập tin mà họ là, ngoài các tập tin được gọi là 184 00:07:28,272 --> 00:07:29,730 mở rộng mà rất nhiều các tập tin có. 185 00:07:29,730 --> 00:07:32,590 Nếu bạn đã .jpg, đó là một đầu mối để các máy tính. 186 00:07:32,590 --> 00:07:35,310 >> Vì vậy, chúng ta hãy nhìn vào điều này bây giờ một chút về mặt kỹ thuật. 187 00:07:35,310 --> 00:07:37,390 Chúng tôi biết các số thập phân hệ thống là 0 đến 9. 188 00:07:37,390 --> 00:07:38,740 Chúng tôi biết nhị phân 0 và 1. 189 00:07:38,740 --> 00:07:41,842 Và nếu bạn nghĩ lại PSet 0, chúng tôi đã có bạn vật lộn với, 190 00:07:41,842 --> 00:07:43,800 cho một chút, một cái gì đó gọi là hệ thập lục phân, 191 00:07:43,800 --> 00:07:47,320 nơi bạn có 16 chữ số, thay vì 10 hay thay vì 2. 192 00:07:47,320 --> 00:07:50,405 Và những con số, theo quy ước, là 0 đến 9, và một 193 00:07:50,405 --> 00:07:55,040 thông qua f, trong đó đại diện cho những gì f số thập phân, chỉ là một sự tỉnh táo nhanh 194 00:07:55,040 --> 00:07:56,640 kiểm tra? 195 00:07:56,640 --> 00:07:57,610 Vì vậy, 15. 196 00:07:57,610 --> 00:08:01,390 Và một phải đại diện cho 10, chỉ bằng cách bản chất của sự sắp đặt mà tôi đã cho. 197 00:08:01,390 --> 00:08:04,350 Nó chỉ là một ước tùy ý, nhưng nó khá chuẩn. 198 00:08:04,350 --> 00:08:06,870 >> Vì vậy, nếu chúng ta nhìn vào mô hình này ba bytes-- hãy 199 00:08:06,870 --> 00:08:09,620 chỉ bắt đầu nhìn vào nó trong một cách phù hợp với cách 200 00:08:09,620 --> 00:08:12,450 các nhà khoa học máy tính nói chung nhìn và suy nghĩ về các tập tin. 201 00:08:12,450 --> 00:08:15,580 Bạn chắc chắn có thể suy nghĩ về file trong số 0, và số 1, và số thập phân, 202 00:08:15,580 --> 00:08:19,340 nhưng trong thực tế, chúng ta có xu hướng sử dụng hệ nhị phân hoặc thường hơn hexadecimal-- 203 00:08:19,340 --> 00:08:20,760 trở lại từ PSet 0. 204 00:08:20,760 --> 00:08:25,857 Vì vậy, hãy để tôi đề nghị 255, 216, và 255 chỉ là những mô hình của 0 và số 1. 205 00:08:25,857 --> 00:08:28,440 Và bạn có thể kiểm tra điều này nếu bạn muốn làm toán từ tuần 0. 206 00:08:28,440 --> 00:08:30,810 Nhưng, bây giờ, chỉ là giả định rằng điều này là thực sự chính xác. 207 00:08:30,810 --> 00:08:33,850 Tôi chỉ viết lại ba chữ số thập phân số là ba giá trị nhị phân. 208 00:08:33,850 --> 00:08:36,100 Bây giờ những gì tôi sẽ làm là chỉ cần thêm một số không gian màu trắng, 209 00:08:36,100 --> 00:08:37,266 chỉ vì lợi ích của khả năng đọc. 210 00:08:37,266 --> 00:08:39,940 Và thông báo, tôi chỉ cần đi để di chuyển những thứ ngoài. 211 00:08:39,940 --> 00:08:43,090 Vì vậy, trước, sau, trước, sau. 212 00:08:43,090 --> 00:08:46,180 Tôi đang làm gì thú vị khác hơn là chỉ truyền bá những điều trên để 213 00:08:46,180 --> 00:08:50,380 rằng thông báo mỗi bộ tám bit tại là hai bộ bốn bit. 214 00:08:50,380 --> 00:08:54,920 Điều này rất hữu ích vì hệ thập lục phân đặc biệt thời trang 215 00:08:54,920 --> 00:09:00,930 bởi vì mỗi chữ số thập lục phân từ 0 đến f, hay cụ thể hơn là từ 0 đến 15, 216 00:09:00,930 --> 00:09:03,430 có thể được biểu với chính xác bốn bit. 217 00:09:03,430 --> 00:09:07,960 Nói cách khác, trong hệ thập lục phân, nếu bạn muốn đại diện cho một 0, nó chỉ là 0000, 218 00:09:07,960 --> 00:09:08,780 bốn số không. 219 00:09:08,780 --> 00:09:13,997 Và nếu bạn muốn đại diện cho 15, đó là 1111, mà là bốn bit. 220 00:09:13,997 --> 00:09:16,080 Và nếu bạn làm toán, nếu đây là nơi những người thân, 221 00:09:16,080 --> 00:09:18,210 đây là nơi 16s, đó là sẽ cung cấp cho you-- 222 00:09:18,210 --> 00:09:19,960 thay vì đó sẽ đối với: xin lỗi, trong hệ nhị phân, 223 00:09:19,960 --> 00:09:23,660 đó là sẽ cung cấp cho bạn 15, những nơi, nơi twos, bốn chân và Tám nơi. 224 00:09:23,660 --> 00:09:26,821 Vì vậy, hãy để tôi đề nghị rằng thiết lập của bốn bit bên trái 225 00:09:26,821 --> 00:09:28,070 là những gì chúng ta sẽ gọi f. 226 00:09:28,070 --> 00:09:30,110 Đó là số lớn nhất bạn có thể đại diện với bốn bit. 227 00:09:30,110 --> 00:09:33,300 Và chúng ta đã biết từ hệ thập lục phân, f là chữ số lớn nhất trong hệ thập lục phân. 228 00:09:33,300 --> 00:09:36,020 Chúng tôi đã có f khác có, hai nhiều hơn đó. 229 00:09:36,020 --> 00:09:38,980 Và bây giờ, chỉ cần mang về đức tin mà tôi đã thực hiện quyền toán 230 00:09:38,980 --> 00:09:41,890 và rằng nửa trái của những bit, 1101, 231 00:09:41,890 --> 00:09:43,980 là những điều tương tự như d trong hệ thập lục phân. 232 00:09:43,980 --> 00:09:46,490 Và tay phải, năm 1000, chỉ có 8 là. 233 00:09:46,490 --> 00:09:48,140 >> Và ai mà dễ thấy, phải không? 234 00:09:48,140 --> 00:09:51,670 8 represents-- là đúng bên dưới mà nơi Tám. 235 00:09:51,670 --> 00:09:56,040 Vì vậy, chúng tôi có một trong các cột Tám và không có gì trong bốn chân, twos hoặc những người thân. 236 00:09:56,040 --> 00:09:59,830 Vì vậy, doanh nghiệp thông thường hơn, con người có xu hướng viết chữ số thập lục phân như thế này, 237 00:09:59,830 --> 00:10:03,000 bạn chỉ cần đánh bại chúng với nhau, và sau đó bạn có tiền tố họ với 0x. 238 00:10:03,000 --> 00:10:05,920 Nó có nghĩa là không có gì khác hơn một đầu mối trực quan đến một human-- 239 00:10:05,920 --> 00:10:10,350 ở đây có một value-- hexadecimal vì nó có thể không nếu không được rõ ràng. 240 00:10:10,350 --> 00:10:13,629 >> Mà là để nói, cuối cùng, mà các mô hình của các số không và những người thân, 241 00:10:13,629 --> 00:10:16,170 hoặc mô hình của hệ thập lục phân chữ số tương đương mà bạn 242 00:10:16,170 --> 00:10:18,990 sẽ bắt đầu tìm kiếm Vấn đề ở Set 4 là this-- 243 00:10:18,990 --> 00:10:22,120 và vấn đề Set 4 spec sẽ đi bộ bạn thông qua này trong detail-- hơn 244 00:10:22,120 --> 00:10:25,344 nhưng nhận ra là loại phức tạp như điều này có thể tìm ở cái nhìn đầu tiên, 245 00:10:25,344 --> 00:10:27,010 bạn sẽ bắt đầu thấy điều này rất nhiều. 246 00:10:27,010 --> 00:10:30,320 Và trên thực tế, ngay cả trong GDB, các debugger chúng tôi giới thiệu hôm thứ Hai 247 00:10:30,320 --> 00:10:35,440 Dan và giới thiệu trong PSet 3, được đi để thường xuyên cho bạn thấy giá trị thập lục phân 248 00:10:35,440 --> 00:10:39,910 chỉ bởi vì họ có xu hướng được nhiều hơn thông thường hơn so với số thập phân hoặc nhị phân 249 00:10:39,910 --> 00:10:41,157 trong thế giới của máy tính. 250 00:10:41,157 --> 00:10:42,490 Bây giờ chúng ta hãy đặt này vào bối cảnh. 251 00:10:42,490 --> 00:10:48,040 Nhiều người trong số bạn có thể nhớ những điều này hình ảnh ở đây, mà đến từ những gì? 252 00:10:48,040 --> 00:10:51,240 Vista, vì vậy thậm chí còn sớm hơn rằng, Windows XP đã ra mắt này. 253 00:10:51,240 --> 00:10:52,620 Vì vậy, đây là một cảnh quan tuyệt đẹp. 254 00:10:52,620 --> 00:10:55,940 Và trên thực tế, nếu bạn poke quanh online-- Tôi nghĩ rằng đó là một bài viết Wikipedia, 255 00:10:55,940 --> 00:11:00,110 trong đó một người rất ngạc nhiên đi ra ngoài tìm thấy vị trí này trong thế giới thiết lập 256 00:11:00,110 --> 00:11:02,240 của mình hoặc máy ảnh của mình trong chính xác place-- đúng 257 00:11:02,240 --> 00:11:06,510 và điều này hôm nay trông like-- nhưng nó chính xác các thiết lập tương tự. 258 00:11:06,510 --> 00:11:10,060 Hình ảnh này, mặc dù là trong một tập tin định dạng được gọi bitmap, b-m-p. 259 00:11:10,060 --> 00:11:12,910 Và chúng ta sẽ có một siêu Nhìn lướt qua những gì có nghĩa là. 260 00:11:12,910 --> 00:11:17,770 >> Nhưng bitmap chỉ là một cách khác nhau hình ảnh đại diện vẫn còn sử dụng các điểm ảnh 261 00:11:17,770 --> 00:11:19,580 trong 0 và số 1, cuối cùng. 262 00:11:19,580 --> 00:11:23,282 Nhưng ở cái nhìn nhanh chóng, nó có một chữ ký thú vị hơn 263 00:11:23,282 --> 00:11:24,490 lúc bắt đầu của tập tin. 264 00:11:24,490 --> 00:11:26,670 Nó không chỉ là ba byte, chứ không có 265 00:11:26,670 --> 00:11:30,770 một bó toàn bộ các mẫu byte đã được xác định trước ý nghĩa. 266 00:11:30,770 --> 00:11:34,490 Ví dụ, ở đâu đó trong đầu tiên vài byte của một hình ảnh bitmap 267 00:11:34,490 --> 00:11:37,440 là có được kích thước của hình ảnh, chiều rộng của hình ảnh, 268 00:11:37,440 --> 00:11:40,390 chiều cao của hình ảnh, vì vậy siêu dữ liệu hữu ích, nếu bạn sẽ. 269 00:11:40,390 --> 00:11:43,940 Thông tin hữu ích mà Photoshop hay chương trình bất kỳ đồ họa bạn đang sử dụng 270 00:11:43,940 --> 00:11:45,180 thực sự có thể quan tâm. 271 00:11:45,180 --> 00:11:47,170 >> Vì vậy, nhiều hơn về điều này trong Vấn đề đặt 4, nhưng điều này 272 00:11:47,170 --> 00:11:49,220 chỉ là để nói rằng cuối ngày 273 00:11:49,220 --> 00:11:52,390 tất cả các định dạng tập tin mà bạn đã sử dụng cho các tập tin Microsoft Word years--, 274 00:11:52,390 --> 00:11:55,820 File số, các tập tin Excel, bất kỳ số định dạng file 275 00:11:55,820 --> 00:11:57,770 rằng có thể có một số mở rộng tập tin được biết đến 276 00:11:57,770 --> 00:12:00,130 chỉ là 0 và số 1 bên dưới mui xe. 277 00:12:00,130 --> 00:12:02,970 Và con người đã quyết định những gì các công ước là, 278 00:12:02,970 --> 00:12:08,340 những gì các mẫu của 0 và số 1 đại diện cho một file Word so với một tập tin Excel, 279 00:12:08,340 --> 00:12:10,322 so với bất kỳ số lượng các định dạng tập tin khác. 280 00:12:10,322 --> 00:12:12,780 Vì vậy, trong PSet 4, bạn sẽ có một cơ hội để chơi với điều đó. 281 00:12:12,780 --> 00:12:14,405 >> Nhưng những gì nó có nghĩa là phải có một cấu trúc. 282 00:12:14,405 --> 00:12:18,012 Đây thực sự là một segue đẹp hiện nay vào C, mà chỉ có một cặp vợ chồng 283 00:12:18,012 --> 00:12:20,220 Các tính năng bổ sung mà chúng tôi đã không nhìn nào. 284 00:12:20,220 --> 00:12:24,230 Đó là một ngôn ngữ khá nhỏ và là một trong các tính năng tốt đẹp về C là một cấu trúc. 285 00:12:24,230 --> 00:12:27,300 Ví dụ, nếu bạn muốn represent-- hãy 286 00:12:27,300 --> 00:12:33,690 nói rằng bạn muốn có một biến đại diện cho một học sinh trong một số chương trình. 287 00:12:33,690 --> 00:12:37,330 Có lẽ bạn đã viết một khóa học Chương trình đăng ký, hoặc mua sắm lõi 288 00:12:37,330 --> 00:12:38,870 công cụ, hoặc một cái gì đó như thế. 289 00:12:38,870 --> 00:12:42,922 Mẩu dữ liệu liên quan là gì cho một học sinh mà đến với tâm? 290 00:12:42,922 --> 00:12:44,880 Giống như một học sinh đại diện với những giá trị nào? 291 00:12:44,880 --> 00:12:45,732 Yeah? 292 00:12:45,732 --> 00:12:46,940 Bạn có một tên như là một học sinh. 293 00:12:46,940 --> 00:12:48,900 Không một sinh viên điển hình có gì khác? 294 00:12:48,900 --> 00:12:49,320 >> Đung [Không nghe thấy] 295 00:12:49,320 --> 00:12:50,200 >> DAVID J. Malan: Vì vậy, xin lỗi. 296 00:12:50,200 --> 00:12:50,660 >> Đung Age. 297 00:12:50,660 --> 00:12:52,980 >> DAVID J. Malan: Một tuổi hoặc sinh nhật tương đương, yep. 298 00:12:52,980 --> 00:12:53,557 Những gì khác? 299 00:12:53,557 --> 00:12:54,390 Đung số ID? 300 00:12:54,390 --> 00:12:57,460 DAVID J. Malan: Vì vậy, một số ID, có thể một số điện thoại, có thể là một ký túc xá, hoặc ngôi nhà, 301 00:12:57,460 --> 00:12:58,670 hoặc cao đẳng, hoặc một cái gì đó như thế. 302 00:12:58,670 --> 00:13:01,820 Bất kỳ số lượng các mảnh dữ liệu đó bạn có thể có trong danh sách liên lạc của bạn 303 00:13:01,820 --> 00:13:03,890 là những gì có thể xác định một học sinh. 304 00:13:03,890 --> 00:13:08,490 Vì vậy, nếu chúng ta muốn làm điều này, trong code, chúng ta có thể làm một cái gì đó đơn giản như thế này. 305 00:13:08,490 --> 00:13:15,670 Chúng tôi có thể có một chương trình để có hãy nói, int main (void). 306 00:13:15,670 --> 00:13:18,920 Và nếu tôi muốn đại diện cho một sinh viên, tôi có thể có, ví dụ, 307 00:13:18,920 --> 00:13:24,330 một chuỗi gọi tên cho học sinh đó, một chuỗi gọi là ký túc xá cho học sinh đó, 308 00:13:24,330 --> 00:13:26,900 có lẽ một int được gọi là ID cho học sinh đó. 309 00:13:26,900 --> 00:13:30,840 Và bởi vì tôi đang sử dụng chuỗi, tôi cần phải quay trở lại và đưa lên CS50.h. 310 00:13:30,840 --> 00:13:33,300 Có lẽ tôi sẽ cần stdio.h. 311 00:13:33,300 --> 00:13:38,190 Vì vậy, hãy để tôi làm những kiểu đánh phủ đầu và tôi sẽ gọi student.c này cho bây giờ 312 00:13:38,190 --> 00:13:40,080 và tiết kiệm này. 313 00:13:40,080 --> 00:13:44,206 >> Và bây giờ tôi có thể làm điều gì đó với các biến này. 314 00:13:44,206 --> 00:13:46,830 Và chúng tôi chỉ cần đi để viết đó là một nhận xét trong mã giả, 315 00:13:46,830 --> 00:13:48,829 bởi vì nó không phải là thú vị những gì chúng ta làm cho bây giờ. 316 00:13:48,829 --> 00:13:51,242 OK, vì vậy đây là một chương trình mà bằng cách nào đó sẽ lưu giữ một học sinh. 317 00:13:51,242 --> 00:13:53,450 Tôi muốn làm gì nếu tôi muốn để lưu trữ hai sinh viên? 318 00:13:53,450 --> 00:13:55,991 Vì vậy, bản năng đầu tiên của tôi là đi được tất cả các quyền, chờ một phút, 319 00:13:55,991 --> 00:14:01,920 nếu tôi có một sinh viên khác tại sao không phải tôi chỉ cần làm tên chuỗi 2, chuỗi ký túc xá 2, 320 00:14:01,920 --> 00:14:04,190 int id2. 321 00:14:04,190 --> 00:14:06,540 Và chúng tôi đã làm biến mất xuống đường này trước khi 322 00:14:06,540 --> 00:14:10,890 và là những gì chúng tôi giải pháp để những gì có vẻ là loại một bản sao dán hackish 323 00:14:10,890 --> 00:14:11,555 công việc ở đây? 324 00:14:11,555 --> 00:14:12,346 Đung Một mảng. 325 00:14:12,346 --> 00:14:13,830 DAVID J. Malan: Yeah, chúng ta có thể sử dụng một mảng. 326 00:14:13,830 --> 00:14:15,620 Quyền này rất nhanh chóng trở nên khó sử dụng. 327 00:14:15,620 --> 00:14:18,453 Bạn phải sắp xếp các ý bắt đầu đặt tên tất cả các biến. 328 00:14:18,453 --> 00:14:22,190 Và bạn, những con người, cần phải giữ theo dõi mà tương ứng với OK name2 329 00:14:22,190 --> 00:14:25,060 với dorm2 tương ứng với id2. 330 00:14:25,060 --> 00:14:26,200 Nó chỉ trở thành một mớ hỗn độn. 331 00:14:26,200 --> 00:14:29,350 Vì vậy, nó dễ dàng hơn rất nhiều, nhớ lại từ một vài tuần trước đây, 332 00:14:29,350 --> 00:14:34,300 chỉ cần phải gọi tên chuỗi và có thể cung cấp cho chúng ta ba của những người. 333 00:14:34,300 --> 00:14:36,940 Và sau đó có lẽ chúng ta có ký túc xá chuỗi và có 334 00:14:36,940 --> 00:14:41,900 ba của những người, hoặc với một hằng số, int id và có ba trong số những người. 335 00:14:41,900 --> 00:14:45,250 Nhưng ngay cả bây giờ điều này cảm thấy một chút cẩu thả, phải. 336 00:14:45,250 --> 00:14:49,440 Chúng ta đang nói về các học sinh và chưa Tôi đang thực sự ở vào mức độ thấp 337 00:14:49,440 --> 00:14:50,470 chi tiết thực hiện. 338 00:14:50,470 --> 00:14:52,790 Học sinh là một cái tên và một ký túc xá và ID. 339 00:14:52,790 --> 00:14:59,814 >> Tại sao tôi không thể chỉ khai báo một biến gọi học sinh và gọi nó là. 340 00:14:59,814 --> 00:15:02,230 Và nếu tôi muốn học sinh khác, tại sao tôi không chỉ gọi nó là t. 341 00:15:02,230 --> 00:15:05,260 Hoặc nếu tôi muốn toàn bộ một bó sinh viên, tại sao tôi không thể chỉ 342 00:15:05,260 --> 00:15:09,740 nói rằng tôi có một lớp học toàn bộ sinh viên, và đó là ba trong số họ. 343 00:15:09,740 --> 00:15:12,470 Nói cách khác, tại sao tôi không thể đến với kiểu dữ liệu của mình, gọi 344 00:15:12,470 --> 00:15:15,641 Sinh viên, trong số đó là một tên, là một ID, là một ký túc xá, 345 00:15:15,641 --> 00:15:16,890 là bất kỳ số lượng các lĩnh vực khác. 346 00:15:16,890 --> 00:15:19,030 Và hóa ra bạn có thể làm chính xác điều đó. 347 00:15:19,030 --> 00:15:21,850 >> Vì vậy, C có tính năng này được gọi là cấu trúc. 348 00:15:21,850 --> 00:15:24,700 Đó là một tính năng ngôn ngữ cho phép chúng ta thực hiện chính xác này. 349 00:15:24,700 --> 00:15:28,370 Tôi sẽ đi trước và mở ra structs.h 350 00:15:28,370 --> 00:15:32,299 nơi chúng ta sẽ thấy sau đây định nghĩa của một học sinh. 351 00:15:32,299 --> 00:15:35,215 Hóa ra - và điều này thậm chí còn đơn giản hơn so với một liên quan đến một ID 352 00:15:35,215 --> 00:15:36,080 một phút trước. 353 00:15:36,080 --> 00:15:39,120 Nếu bạn muốn đi lên với kiểu dữ liệu tự chế của bạn, 354 00:15:39,120 --> 00:15:42,750 và ngoài ra để int, và char và nổi và tất cả những người khác đang tồn tại, 355 00:15:42,750 --> 00:15:45,810 bạn có thể làm như vậy bằng cách theo nghĩa đen viết typedef struct, 356 00:15:45,810 --> 00:15:47,880 sau đó một số dấu ngoặc, bên trong của bạn 357 00:15:47,880 --> 00:15:51,460 danh sách các biến mà bạn muốn kết hợp với dữ liệu tùy chỉnh mới này 358 00:15:51,460 --> 00:15:55,670 gõ như một cái tên và một ký túc xá, và sau đó sau khi các dấu ngoặc nhọn 359 00:15:55,670 --> 00:15:57,860 bạn đặt tên cho các kiểu dữ liệu mới. 360 00:15:57,860 --> 00:15:59,220 Vì vậy, ví dụ, học sinh. 361 00:15:59,220 --> 00:16:03,247 >> Và những gì là tốt đẹp về điều này bây giờ là nếu chúng ta nhìn vào các mã tương ứng, 362 00:16:03,247 --> 00:16:05,080 quy ước, đầu tiên của tất cả, là đặt này 363 00:16:05,080 --> 00:16:08,230 trong một tập tin gọi là một cái gì đó dot h, một tập tin tiêu đề, mà chúng tôi có không 364 00:16:08,230 --> 00:16:09,780 bắt đầu sử dụng bản thân quá nhiều. 365 00:16:09,780 --> 00:16:12,120 Nhưng chúng ta sẽ bắt đầu sử dụng khá một chút bây giờ. 366 00:16:12,120 --> 00:16:18,650 Và những gì chúng ta có thể làm với điều này, cuối cùng, trong vài dòng mã 367 00:16:18,650 --> 00:16:22,130 được khai báo chính xác đó kiểu dữ liệu, một học sinh. 368 00:16:22,130 --> 00:16:23,230 Và bây giờ chúng ta hãy sử dụng nó. 369 00:16:23,230 --> 00:16:27,274 >> Tôi sẽ để bây giờ đi vào một tập tin gọi là structs1.c. 370 00:16:27,274 --> 00:16:29,440 Và chúng ta hãy nhìn vào một vài đặc điểm ở đây. 371 00:16:29,440 --> 00:16:32,250 Vì vậy, các công cụ lên ở đây là chủ yếu là quen thuộc, và chúng tôi sẽ 372 00:16:32,250 --> 00:16:35,040 trở về với những gì không phải là quen thuộc chỉ trong một khoảnh khắc. 373 00:16:35,040 --> 00:16:39,880 Điều này tất nhiên là bao gồm cả của riêng tôi tập tin tiêu đề, mà là mới là tốt, 374 00:16:39,880 --> 00:16:42,580 trừ PSet 3 nơi, thu hồi, chúng tôi có helpers.h. 375 00:16:42,580 --> 00:16:45,150 Vì vậy, bạn có thể nhớ lại helpers.h #include. 376 00:16:45,150 --> 00:16:49,381 >> Tại sao mặc dù tôi sử dụng dấu ngoặc kép thay vì dấu ngoặc góc cạnh? 377 00:16:49,381 --> 00:16:50,630 Khi nào tôi lựa chọn giữa chúng? 378 00:16:50,630 --> 00:16:52,310 Hầu như lúc nào tôi dường sử dụng dấu ngoặc góc cạnh. 379 00:16:52,310 --> 00:16:55,040 Và sau đó, tất cả của một đột ngột trên dòng sáu Tôi đang sử dụng dấu ngoặc kép. 380 00:16:55,040 --> 00:16:55,860 Tại sao điều đó có thể được? 381 00:16:55,860 --> 00:16:56,700 Yeah? 382 00:16:56,700 --> 00:16:57,725 >> Đung [Không nghe thấy] 383 00:16:57,725 --> 00:16:59,350 DAVID J. Malan: Đó là một thực tế, những gì? 384 00:16:59,350 --> 00:17:00,559 Đung Đó là trong IDE của bạn. 385 00:17:00,559 --> 00:17:02,475 DAVID J. Malan: Yeah, đó là trong IDE thực tế của tôi. 386 00:17:02,475 --> 00:17:05,690 Và chúng ta không dừng lại ở hình IDE, vì đó chỉ là một công cụ mà tôi đang sử dụng. 387 00:17:05,690 --> 00:17:08,119 Đó là trong hiện tại của tôi thư mục, cụ thể. 388 00:17:08,119 --> 00:17:11,647 Vì vậy structs.h là tập tin riêng của tôi không được cài đặt trong các IDE, 389 00:17:11,647 --> 00:17:14,480 trong hệ điều hành riêng của mình, thay vì đó là trong thư mục hiện tại của tôi. 390 00:17:14,480 --> 00:17:16,910 Vì vậy, các quy ước là nếu bạn muốn để bao gồm các tập tin tiêu đề của riêng bạn, 391 00:17:16,910 --> 00:17:18,200 bạn chỉ cần sử dụng dấu ngoặc kép. 392 00:17:18,200 --> 00:17:23,290 >> Những gì chúng ta gọi điều này trong dòng 8, nói chung? 393 00:17:23,290 --> 00:17:25,200 Đây là những gì? 394 00:17:25,200 --> 00:17:28,220 một cái gì đó #define. 395 00:17:28,220 --> 00:17:31,040 Điều này thể hiện các hằng số, phải không? 396 00:17:31,040 --> 00:17:33,140 Nếu bạn muốn có một giá trị trong chương trình của bạn 397 00:17:33,140 --> 00:17:35,110 mà bạn sử dụng toàn bộ bó lần, đó là 398 00:17:35,110 --> 00:17:39,330 tốt ước tính đến yếu tố đó ra, khai báo nó, với các biểu tượng băm 399 00:17:39,330 --> 00:17:43,340 xác định, sau đó, theo quy ước, trong tất cả các chữ hoa word-- mặc dù nó không phải 400 00:17:43,340 --> 00:17:45,320 thực sự cần thiết, nhưng đó là ước nhân 401 00:17:45,320 --> 00:17:47,210 để tận dụng các hằng số để họ nhảy ra 402 00:17:47,210 --> 00:17:50,380 tại bạn visually-- không gian và sau đó các giá trị mà bạn muốn được 403 00:17:50,380 --> 00:17:52,250 tương đương với tên của hằng số. 404 00:17:52,250 --> 00:17:56,110 Không có dấu chấm phẩy, nhưng bạn chỉ theo mô hình mà có. 405 00:17:56,110 --> 00:17:57,770 >> Vì vậy, những gì tôi làm trong mã thực tế này. 406 00:17:57,770 --> 00:18:00,660 Vì vậy, chúng ta hãy nhìn vào chương trình chính ở đây. 407 00:18:00,660 --> 00:18:04,080 Trong dòng 12 vì tôi đã bao gồm structs.h, 408 00:18:04,080 --> 00:18:06,492 Bây giờ tôi có kỳ diệu tại của tôi xử lý một kiểu dữ liệu mới. 409 00:18:06,492 --> 00:18:09,200 Tôi không chỉ có quyền truy cập vào int, và char, và float, và chuỗi, 410 00:18:09,200 --> 00:18:10,060 và màu xanh và những người khác. 411 00:18:10,060 --> 00:18:12,470 Bây giờ tôi có quyền truy cập vào một kiểu dữ liệu học sinh. 412 00:18:12,470 --> 00:18:17,740 Vì vậy, trong dòng 12, tôi đang kết hợp hai ideas-- một kiểu dữ liệu tùy chỉnh và hai, 413 00:18:17,740 --> 00:18:18,940 sử dụng một mảng. 414 00:18:18,940 --> 00:18:21,700 Và như vậy trong chương trình này nếu Tôi muốn thực sự hỗ trợ 415 00:18:21,700 --> 00:18:24,320 Ba học sinh khác nhau trong chương trình của tôi, tôi 416 00:18:24,320 --> 00:18:30,480 chỉ có thể nói cho tôi một biến gọi là sinh viên, mỗi trong số đó 417 00:18:30,480 --> 00:18:32,970 là học sinh loại, trong đó là kiểu dữ liệu tùy chỉnh của tôi. 418 00:18:32,970 --> 00:18:35,890 Và, đặc biệt, cho tôi ba của những người trong mảng của tôi. 419 00:18:35,890 --> 00:18:37,750 >> Vì vậy, bây giờ chúng ta làm gì trong chương trình này? 420 00:18:37,750 --> 00:18:40,670 Dưới đây chỉ là một vòng lặp cho iterating 0-3, bởi vì đó là 421 00:18:40,670 --> 00:18:42,110 những gì giá trị của sinh viên là. 422 00:18:42,110 --> 00:18:44,420 Tôi chỉ nhắc người dùng cho tôi tên của học sinh. 423 00:18:44,420 --> 00:18:48,090 Và sau đó trong dòng 17, chúng tôi có một đường dây chủ yếu là quen thuộc. 424 00:18:48,090 --> 00:18:50,370 Chúng tôi có người bạn cũ của chúng tôi GetString bên phải. 425 00:18:50,370 --> 00:18:52,345 Và mảnh gì về cú pháp là dường như mới, 426 00:18:52,345 --> 00:18:55,130 nếu bạn đã không bao giờ được lập trình trong C trước, và chưa bao giờ sử dụng các cấu trúc? 427 00:18:55,130 --> 00:18:55,510 Yeah? 428 00:18:55,510 --> 00:18:56,417 >> Đung Các .name. 429 00:18:56,417 --> 00:18:57,500 DAVID J. Malan: Các .name. 430 00:18:57,500 --> 00:19:01,220 Nhưng điều này không phải là quá nhiều của một bước nhảy vọt, bởi vì bây giờ sinh viên khung I 431 00:19:01,220 --> 00:19:02,590 cung cấp cho bạn các sinh viên thứ i. 432 00:19:02,590 --> 00:19:04,730 Và nếu bạn muốn bổ nhào bên trong của cấu trúc đó, 433 00:19:04,730 --> 00:19:09,490 bạn chỉ cần sử dụng một thời gian duy nhất và sau đó tên của các biến bên trong, 434 00:19:09,490 --> 00:19:11,900 hoặc các tài sản bên trong đó bạn muốn để có được quyền truy cập vào. 435 00:19:11,900 --> 00:19:14,816 Tương tự như vậy rồi, nếu tôi sau đó nhắc nhở người người sử dụng, cho tôi ký túc xá của học sinh, 436 00:19:14,816 --> 00:19:18,390 bạn có thể lưu trữ tương tự như vậy mà chuỗi trong các ký túc xá bên trong biến 437 00:19:18,390 --> 00:19:19,940 các cấu trúc sinh viên. 438 00:19:19,940 --> 00:19:21,410 >> Và bây giờ mọi thứ có được một chút ưa thích. 439 00:19:21,410 --> 00:19:24,420 Và điều này là sẽ xem xét tại có lẽ rất nhiều khá sớm. 440 00:19:24,420 --> 00:19:27,970 Nhưng bạn sẽ thấy điều này rất nhiều trong PSet 4, vì vậy chúng ta hãy chỉ nhìn lướt qua nó bây giờ. 441 00:19:27,970 --> 00:19:33,364 Nó chỉ ra rằng trong dòng 23 thông qua 38, điều gì làm bạn nghĩ rằng tôi có lẽ đang làm gì? 442 00:19:33,364 --> 00:19:35,530 Tôi đã được loại bỏ cho ngày hôm nay, nhưng các phiên bản 443 00:19:35,530 --> 00:19:38,660 của mã trực tuyến cho tài liệu tham khảo có tất cả ý kiến. 444 00:19:38,660 --> 00:19:40,171 Tôi dường như những gì phải làm? 445 00:19:40,171 --> 00:19:42,530 >> Đung Lưu tập tin với tất cả các thông tin mà người dùng nhập. 446 00:19:42,530 --> 00:19:44,530 >> DAVID J. Malan: Yeah, chính xác, đây là một cách mới 447 00:19:44,530 --> 00:19:46,370 rằng chúng ta đang nhìn thấy hai, một tính năng của C, 448 00:19:46,370 --> 00:19:48,700 nhờ đó mà tôi có thể tạo ra các tập tin riêng của tôi. 449 00:19:48,700 --> 00:19:51,580 Như vậy đến nay, hầu hết các chương trình bạn đã viết là quốc tịch. 450 00:19:51,580 --> 00:19:53,334 Ngay sau khi hoàn thành công việc chạy, đó là nó. 451 00:19:53,334 --> 00:19:55,000 Không có bộ nhớ hay hồi tưởng về nó. 452 00:19:55,000 --> 00:19:56,110 Không có tập tin đã lưu. 453 00:19:56,110 --> 00:19:58,120 Nhưng nếu bạn muốn tiết kiệm đầu vào mà có 454 00:19:58,120 --> 00:20:02,100 xảy ra, giống như trong một trò chơi hoặc một chương trình như thế này, hóa ra chúng ta có thể làm như vậy. 455 00:20:02,100 --> 00:20:04,360 Và bạn sẽ thấy chi tiết này trong PSet 4 và Mục. 456 00:20:04,360 --> 00:20:08,661 Nhưng dòng này 23 cơ bản tạo ra một tập tin gọi là students.csv. 457 00:20:08,661 --> 00:20:10,160 Và bạn có thể đã nhìn thấy điều này trước khi. 458 00:20:10,160 --> 00:20:14,250 Thậm chí nếu bạn đã không bao giờ học CS trước, CSV là biến bằng dấu phẩy. 459 00:20:14,250 --> 00:20:19,000 Nó giống như một con người rất nghèo phiên bản của một tập tin Excel, 460 00:20:19,000 --> 00:20:22,270 có nghĩa là nó có thể được mở ra trong Excel và trong số Apple, 461 00:20:22,270 --> 00:20:23,830 và nó có các hàng và cột. 462 00:20:23,830 --> 00:20:26,485 Nhưng đó không phải là độc quyền định dạng như Microsoft hay Apple. 463 00:20:26,485 --> 00:20:29,840 Nó chỉ là dấu phẩy tách giá trị mà chúng ta sẽ thấy trong một thời điểm. 464 00:20:29,840 --> 00:20:31,010 >> Và chỉ mất một đoán. 465 00:20:31,010 --> 00:20:33,480 Trong dòng 23, ở rất kết thúc, số thứ hai của tôi 466 00:20:33,480 --> 00:20:37,700 với chức năng mới này được gọi là f mở cho tập tin mở là w. 467 00:20:37,700 --> 00:20:39,430 Điều gì có thể biểu thị w? 468 00:20:39,430 --> 00:20:40,022 Yeah? 469 00:20:40,022 --> 00:20:41,260 >> Đung Nó cho phép bạn ghi vào tập tin? 470 00:20:41,260 --> 00:20:42,630 >> DAVID J. Malan: Nó cho phép bạn viết vào tập tin. 471 00:20:42,630 --> 00:20:44,810 Vì vậy, có một vài biến thể rằng chúng ta có thể cắm ở đây. 472 00:20:44,810 --> 00:20:47,184 Nhưng nếu bạn chỉ muốn đọc các tập tin, đó là nhìn vào nó 473 00:20:47,184 --> 00:20:50,010 và đọc nó vào bộ nhớ, bạn chỉ cần sử dụng quote unquote "r". 474 00:20:50,010 --> 00:20:53,110 Nếu bạn muốn ghi vào file, bạn sử dụng quote unquote "w". 475 00:20:53,110 --> 00:20:55,190 Hiện cũng đang nối thêm và một vài thứ khác 476 00:20:55,190 --> 00:20:57,356 nếu bạn muốn thay đổi các tập tin hiện có. 477 00:20:57,356 --> 00:21:00,480 Bây giờ chúng ta sẽ tiếp tục nhìn thấy này điều, sau đó chúng tôi sẽ trở lại với dòng 24. 478 00:21:00,480 --> 00:21:02,640 NULL, nó quay ra, là một giá trị đặc biệt 479 00:21:02,640 --> 00:21:06,070 có thể được trả về bởi các chức năng nhất định nếu một cái gì đó đã đi wrong-- 480 00:21:06,070 --> 00:21:08,490 nếu các tập tin không tồn tại, nếu bạn đã chạy ra khỏi bộ nhớ, 481 00:21:08,490 --> 00:21:09,620 hoặc một loạt các lỗi khác. 482 00:21:09,620 --> 00:21:13,470 Nhưng hiện nay, chúng ta hãy chỉ cho rằng điều này là kiểm tra lỗi chỉ thông thường. 483 00:21:13,470 --> 00:21:17,090 Ở đây trong dòng 26, tôi lặp 0-3 trên tất cả các học sinh của tôi. 484 00:21:17,090 --> 00:21:20,470 Và đây là loại loại của một chức năng mới, fprintf, 485 00:21:20,470 --> 00:21:21,460 nhưng chỉ mất một đoán. 486 00:21:21,460 --> 00:21:24,370 Nếu printf là chỉ in một chuỗi định dạng, 487 00:21:24,370 --> 00:21:26,507 những gì fprintf lẽ nghĩa là gì? 488 00:21:26,507 --> 00:21:27,590 Đung In vào một tập tin. 489 00:21:27,590 --> 00:21:29,290 DAVID J. Malan: In một định dạng chuỗi vào một tập tin. 490 00:21:29,290 --> 00:21:31,180 Đó là những gì thêm f phương tiện là tập tin. 491 00:21:31,180 --> 00:21:36,420 Và các số mới đầu tiên đã được các biến đại diện cho tập tin của bạn. 492 00:21:36,420 --> 00:21:38,866 Sau đó, chúng tôi chỉ có một định dạng string giống như printf. 493 00:21:38,866 --> 00:21:40,740 Và mặc dù đây Cú pháp là mới, điều này chỉ 494 00:21:40,740 --> 00:21:44,610 có nghĩa là cắm vào tên của học sinh, plug-in các ký túc xá sinh viên, và sau đó 495 00:21:44,610 --> 00:21:47,160 với fclose, đóng file. 496 00:21:47,160 --> 00:21:49,730 Và sau đó lastly-- này là mới và chúng tôi sẽ trở lại vấn đề này 497 00:21:49,730 --> 00:21:53,240 trước long-- tôi đang giải phóng học sinh vì lý do 498 00:21:53,240 --> 00:21:54,860 đã xảy ra lên trên đó. 499 00:21:54,860 --> 00:21:56,820 Nhưng chúng tôi sẽ trở lại với trước khi long-- 500 00:21:56,820 --> 00:21:59,820 đó là vì cách GetString là thực sự làm việc dưới mui xe. 501 00:21:59,820 --> 00:22:01,280 >> Vì vậy, chúng ta hãy có một cái nhìn nhanh chóng ở đây. 502 00:22:01,280 --> 00:22:04,380 Nếu tôi gõ ls trong thư mục của tôi, nhận thấy rằng tôi không 503 00:22:04,380 --> 00:22:09,360 có một tập tin gọi là students.csv, chỉ cần không có, không tồn tại. 504 00:22:09,360 --> 00:22:14,965 Vì vậy, nếu bây giờ tôi biên dịch chương trình này, làm cho cấu trúc-1,. / struct-1, 505 00:22:14,965 --> 00:22:20,570 và tôi sẽ đi trước và gõ vào Andi, người sống ở Berkeley tại Yale. 506 00:22:20,570 --> 00:22:26,350 Chúng ta sẽ phải Rob người sống ở Thayer những ngày này. 507 00:22:26,350 --> 00:22:33,760 Và chúng ta hãy đến với nơi là, tôi nghĩ rằng, Maria là trong Mather, 508 00:22:33,760 --> 00:22:35,100 nếu tôi nhớ lại một cách chính xác. 509 00:22:35,100 --> 00:22:36,460 >> Vì vậy, không có gì có thể xảy ra. 510 00:22:36,460 --> 00:22:40,680 Nhưng nếu tôi gõ ls bây giờ, có students.csv. 511 00:22:40,680 --> 00:22:43,080 Chúng ta hãy đi trước và mở students.csv. 512 00:22:43,080 --> 00:22:46,050 Đây lại là một rất định dạng tập tin nhẹ. 513 00:22:46,050 --> 00:22:49,570 Nhưng tôi đã đơn giản chỉ thông qua một quy ước mà tôi có hai hàng và cột ở đây. 514 00:22:49,570 --> 00:22:52,020 Cột đầu tiên là tên đầu tiên của người dân. 515 00:22:52,020 --> 00:22:55,740 Cột thứ hai là học sinh của ký túc xá, hoặc cao đẳng, hoặc nhà, hoặc có điều gì. 516 00:22:55,740 --> 00:22:57,900 Và bây giờ tôi đã lưu này vĩnh viễn trong một tập tin. 517 00:22:57,900 --> 00:22:59,280 >> Vì vậy, nó không phải là tất cả những gì thú vị. 518 00:22:59,280 --> 00:23:02,980 Nhưng đây chỉ là một bước đá bây giờ để có thể tồn tại thông tin 519 00:23:02,980 --> 00:23:04,040 vĩnh viễn. 520 00:23:04,040 --> 00:23:08,340 Vì vậy, chúng ta hãy xem bây giờ những gì chúng ta càng có thể làm gì với những điều này và các tính năng khác. 521 00:23:08,340 --> 00:23:10,729 Nhưng trước tiên, bất kỳ câu hỏi? 522 00:23:10,729 --> 00:23:12,145 Đó là rất nhiều, và đó là nhanh. 523 00:23:12,145 --> 00:23:16,131 Nhưng bạn sẽ thấy rất nhiều hơn trong PSet 4, là tốt. 524 00:23:16,131 --> 00:23:16,630 Yeah? 525 00:23:16,630 --> 00:23:19,360 >> Đung Có cách nào để tiếp tục bổ sung thêm tên cho tập tin đó? 526 00:23:19,360 --> 00:23:19,880 >> DAVID J. Malan: Câu hỏi rất hay. 527 00:23:19,880 --> 00:23:21,800 Có cách nào để tiếp tục thêm tên cho tập tin đó? 528 00:23:21,800 --> 00:23:22,340 Vâng. 529 00:23:22,340 --> 00:23:24,630 Và, trên thực tế, nếu bạn kết thúc up mở lại tập tin, 530 00:23:24,630 --> 00:23:26,780 bạn sẽ sử dụng trích dẫn unquote "a" cho phụ thêm, 531 00:23:26,780 --> 00:23:31,090 mà sẽ chỉ cần thêm một dòng mới, một dòng mới một lần nữa và một lần nữa, chính xác. 532 00:23:31,090 --> 00:23:32,010 Câu hỏi hay. 533 00:23:32,010 --> 00:23:32,950 Các câu hỏi khác? 534 00:23:32,950 --> 00:23:33,450 Yeah? 535 00:23:33,450 --> 00:23:35,580 Đung Nếu bạn chạy chương trình một lần nữa ngay bây giờ, 536 00:23:35,580 --> 00:23:38,000 nó sẽ tiếp tục bổ sung tên vào nộp hoặc nó sẽ mở ra một tập tin mới? 537 00:23:38,000 --> 00:23:38,740 >> DAVID J. Malan: Ah, tốt câu hỏi. 538 00:23:38,740 --> 00:23:41,448 Nếu bạn chạy lại chương trình ngay Hiện tại, có thể gõ vào tên mới, 539 00:23:41,448 --> 00:23:44,820 nó sẽ thêm vào tập tin hoặc ghi đè lên các tập tin? 540 00:23:44,820 --> 00:23:47,420 Sau này, bởi vì tôi là không sử dụng chế độ phụ thêm. 541 00:23:47,420 --> 00:23:49,930 Và bởi vì tôi chỉ là một cách mù quáng mở tập tin để viết, 542 00:23:49,930 --> 00:23:51,310 nó chỉ cần đi để ghi đè lên các tập tin. 543 00:23:51,310 --> 00:23:54,570 Vì vậy, tôi thực sự cần phải làm là nối thêm, nếu tôi muốn thực sự có kỳ hạn dài 544 00:23:54,570 --> 00:23:55,350 cơ sở dữ liệu. 545 00:23:55,350 --> 00:23:58,220 >> Bây giờ CSV là hữu ích, thẳng thắn, thậm chí cho như nếu bạn writing-- 546 00:23:58,220 --> 00:24:00,100 và cuối cùng chúng ta sẽ thấy điều này sau đó trong học kỳ khi 547 00:24:00,100 --> 00:24:01,455 chúng ta sử dụng tệp CSV cho các mục đích khác. 548 00:24:01,455 --> 00:24:04,920 Nếu bạn muốn lưu trữ tất cả mọi người đã đăng ký cho một số sự kiện, 549 00:24:04,920 --> 00:24:07,420 hoặc đăng ký cho học sinh của bạn nhóm, hoặc một cái gì đó như thế, 550 00:24:07,420 --> 00:24:10,330 lưu trữ dữ liệu trong các loại các định dạng là siêu thuận tiện. 551 00:24:10,330 --> 00:24:12,580 Bởi vì theo nghĩa đen, nếu tôi đã tải tập tin này. 552 00:24:12,580 --> 00:24:14,540 Tôi có thể double-- và chúng ta hãy thực sự cố gắng này 553 00:24:14,540 --> 00:24:16,720 nếu tôi có Excel hoặc số trên đây. 554 00:24:16,720 --> 00:24:19,130 >> Tôi sẽ phải nhấp chuột hoặc kiểm soát vào file của tôi. 555 00:24:19,130 --> 00:24:20,020 Lỗi chính. 556 00:24:20,020 --> 00:24:21,830 Right-click hoặc control-click vào tập tin của tôi. 557 00:24:21,830 --> 00:24:24,960 Thôi nào, con chuột của tôi là không hợp tác. 558 00:24:24,960 --> 00:24:32,694 Download-- tôi sẽ tải về tất cả các tập tin ở đây để 559 00:24:32,694 --> 00:24:33,860 chỉ để tôi có thể lấy một này. 560 00:24:33,860 --> 00:24:37,850 Và chúng ta hãy xem nếu công trình này students.csv-- lần đầu tiên 561 00:24:37,850 --> 00:24:39,310 Tôi đã kích hoạt. 562 00:24:39,310 --> 00:24:41,360 Bây giờ họ muốn xem địa chỉ liên lạc của tôi. 563 00:24:41,360 --> 00:24:44,310 Bây giờ, tôi cần phải đăng ký. 564 00:24:44,310 --> 00:24:47,620 Xem cách dễ dàng là để sử dụng tệp CSV? 565 00:24:47,620 --> 00:24:50,840 Có, giữ cho nó được cập nhật. 566 00:24:50,840 --> 00:24:52,375 OK, bây giờ chúng tôi đã sẵn sàng cho các lớp học. 567 00:24:52,375 --> 00:24:58,750 568 00:24:58,750 --> 00:25:00,370 OK, oh, có gì mới? 569 00:25:00,370 --> 00:25:02,920 OK, gần gũi. 570 00:25:02,920 --> 00:25:04,750 Đó là huyền diệu. 571 00:25:04,750 --> 00:25:07,280 OK, bây giờ chúng ta phải cập nhật. 572 00:25:07,280 --> 00:25:10,890 Và bây giờ, nó đã quên những gì nộp ban đầu tôi đã mở, 573 00:25:10,890 --> 00:25:13,090 nhưng những gì a-- có chúng tôi đi. 574 00:25:13,090 --> 00:25:16,341 OK, vì vậy bây giờ chúng ta có một tập tin Excel. 575 00:25:16,341 --> 00:25:18,290 Cam on. 576 00:25:18,290 --> 00:25:20,764 >> OK, vì vậy những gì tôi đã làm là phần dễ dàng. 577 00:25:20,764 --> 00:25:23,930 Tất nhiên tôi có thể đã được cài đặt sẵn Excel, hoặc số, hoặc bất cứ chương trình. 578 00:25:23,930 --> 00:25:25,846 Nhưng điều này là tốt đẹp, bởi vì bây giờ tôi có thể thao tác 579 00:25:25,846 --> 00:25:28,090 các dữ liệu trong một định dạng chuẩn. 580 00:25:28,090 --> 00:25:30,294 >> Bối cảnh như vậy bây giờ chúng ta hãy chuyển đến nơi chúng tôi rời khỏi 581 00:25:30,294 --> 00:25:32,710 thời gian qua, mà là để bắt đầu cất cánh bánh xe đào tạo. 582 00:25:32,710 --> 00:25:34,543 Nhưng trước tiên, bạn đã làm không thấy ăn trưa trước đây 583 00:25:34,543 --> 00:25:38,150 một lần nữa xảy ra ở đây tại Fire và Ice ở Cambridge, Sitar ở New Haven. 584 00:25:38,150 --> 00:25:43,150 Đăng ký trên trang web CS50s càng sớm càng tốt để tham gia các sinh viên và nhân viên CS50. 585 00:25:43,150 --> 00:25:46,090 >> Vì vậy, chúng tôi đã luyện tập off vào thứ hai như follows-- 586 00:25:46,090 --> 00:25:49,120 chuỗi đã được khai báo trong Thư viện CS50s một thời gian. 587 00:25:49,120 --> 00:25:52,650 Và nó là tốt đẹp, bởi vì nó cho phép chúng ta nói về các biến như là 588 00:25:52,650 --> 00:25:54,660 Nói cách đầy đủ và câu và nhiều hơn nữa. 589 00:25:54,660 --> 00:25:56,710 Nhưng hóa ra chuỗi không tồn tại. 590 00:25:56,710 --> 00:26:00,200 Đó chỉ là một từ đồng nghĩa, hoặc một bí danh, mà chúng ta đã tạo ra cái gì đó 591 00:26:00,200 --> 00:26:03,780 thực sự là nhiều hơn một chút kỹ thuật được gọi là một char *. 592 00:26:03,780 --> 00:26:07,900 >> Và quả thực, chúng ta đã thấy một ví dụ của một chương trình vào thứ Hai 593 00:26:07,900 --> 00:26:11,200 điều đó đã không cư xử khá như chúng ta mong đợi. 594 00:26:11,200 --> 00:26:13,630 Đây là tập tin, so sánh-0. 595 00:26:13,630 --> 00:26:17,910 Và nhớ lại rằng so sánh-0, nếu Tôi biên dịch lại chương trình thứ hai của 596 00:26:17,910 --> 00:26:22,670 và chạy so sánh-0 và gõ vào mẹ trong chữ thường, chữ thường và mẹ trong một lần nữa. 597 00:26:22,670 --> 00:26:25,320 Chương trình khẳng định tôi gõ những điều khác nhau, 598 00:26:25,320 --> 00:26:29,210 mặc dù mẹ, tất cả trong chữ thường, giống hệt cách trực quan. 599 00:26:29,210 --> 00:26:31,990 Vì vậy, những gì đã là câu trả lời ngắn cho lý do tại sao máy tính nghĩ 600 00:26:31,990 --> 00:26:34,500 hai dây là khác nhau? 601 00:26:34,500 --> 00:26:35,250 Yeah? 602 00:26:35,250 --> 00:26:36,534 >> Đung [Không nghe thấy] 603 00:26:36,534 --> 00:26:37,450 DAVID J. Malan: Đúng vậy. 604 00:26:37,450 --> 00:26:39,600 Vì vậy, mẹ, lần đầu tiên Tôi gõ vào, đang được 605 00:26:39,600 --> 00:26:42,710 lưu trữ ở đâu trong máy tính của tôi bộ nhớ, nhưng ở một vị trí khác nhau 606 00:26:42,710 --> 00:26:44,690 hơn lần thứ hai tôi gõ vào mẹ. 607 00:26:44,690 --> 00:26:46,580 Bây giờ nó chắc chắn có thể được tối ưu hóa. 608 00:26:46,580 --> 00:26:49,205 Các máy tính có thể được thông minh và nhận ra hai chuỗi này, hey, 609 00:26:49,205 --> 00:26:49,954 chúng giống hệt nhau. 610 00:26:49,954 --> 00:26:51,520 Hãy để tôi không dư thừa lưu trữ nó. 611 00:26:51,520 --> 00:26:54,229 Nhưng máy tính không làm điều đó tối ưu hóa, trừ khi bạn nói với họ để. 612 00:26:54,229 --> 00:26:56,061 Vì vậy, theo mặc định, họ đang chỉ cần đi để kết thúc 613 00:26:56,061 --> 00:26:57,670 ở hai nơi khác nhau trong bộ nhớ. 614 00:26:57,670 --> 00:27:01,570 Và do đó, để được rõ ràng hơn, khi chúng tôi so sánh hai chuỗi, 615 00:27:01,570 --> 00:27:03,950 lần đầu tiên được gọi là s, thứ hai được gọi là 616 00:27:03,950 --> 00:27:08,530 t, cụ thể những gì đã được tôi so sánh ở đây trên dòng 13? 617 00:27:08,530 --> 00:27:09,494 Yeah. 618 00:27:09,494 --> 00:27:12,390 >> Đung Đó là nơi trong bộ nhớ rằng biến sẽ trỏ đến. 619 00:27:12,390 --> 00:27:14,900 >> DAVID J. Malan: Chính xác, tôi đã so sánh các vị trí trong bộ nhớ 620 00:27:14,900 --> 00:27:16,300 rằng những biến trỏ đến. 621 00:27:16,300 --> 00:27:20,560 Vì vậy, đặc biệt, nếu mẹ đã ở byte số 1 và 2, và 3, 622 00:27:20,560 --> 00:27:24,020 và 4-- vì nhớ các dấu gạch chéo ngược 0 cần phải được tất cả các con đường ở cuối. 623 00:27:24,020 --> 00:27:29,420 Và ví dụ khác của mẹ, m-o-m, là tại địa chỉ 10, 11, 12, và 13. 624 00:27:29,420 --> 00:27:33,100 Tôi đã so sánh 1, địa chỉ đó, vị trí đó trong bộ nhớ, 625 00:27:33,100 --> 00:27:35,160 so với 10, đó là rõ ràng là không giống nhau. 626 00:27:35,160 --> 00:27:36,260 1 không phải là 10. 627 00:27:36,260 --> 00:27:39,620 >> Vì vậy, đây là tốt đẹp trong đó nó khá đơn giản. 628 00:27:39,620 --> 00:27:42,870 Nhưng đó là vấn đề trong chừng mực chúng tôi dường như không thể so sánh chuỗi. 629 00:27:42,870 --> 00:27:44,930 Vì vậy fundamentally-- và ở mức thấp này, 630 00:27:44,930 --> 00:27:47,300 nếu bạn muốn thực hiện một chương trình để so sánh 631 00:27:47,300 --> 00:27:50,270 hai từ riêng biệt mà các người dùng đã gõ trong cho chất lượng, 632 00:27:50,270 --> 00:27:53,944 làm họ xếp hàng cho char char, chỉ trong điều kiện chung, 633 00:27:53,944 --> 00:27:55,360 những gì chúng ta cần làm, rõ ràng? 634 00:27:55,360 --> 00:27:57,940 Nó không đủ chỉ để nhìn vào hai địa chỉ. 635 00:27:57,940 --> 00:27:58,860 Những gì chúng ta cần phải làm gì? 636 00:27:58,860 --> 00:27:59,360 Yeah? 637 00:27:59,360 --> 00:28:01,120 >> Đung Lặp qua chuỗi [không nghe được]. 638 00:28:01,120 --> 00:28:02,600 >> DAVID J. Malan: Vâng, chúng ta hãy lặp thông qua các chuỗi. 639 00:28:02,600 --> 00:28:05,808 Hãy sử dụng một vòng lặp, vòng lặp while, hoặc bất cứ điều gì bạn thấy thoải mái nhất. 640 00:28:05,808 --> 00:28:08,840 Và nếu chúng ta đã có hai dây một nơi nào đó trong bộ nhớ, chúng ta hãy nhìn vào mỗi 641 00:28:08,840 --> 00:28:11,770 ký tự đầu tiên, sau đó mỗi thứ hai là nhân vật, sau đó thứ ba, và thứ tư, 642 00:28:11,770 --> 00:28:15,206 và thứ năm, cho đến khi chúng ta nhấn những gì giá trị trọng điểm đặc biệt? 643 00:28:15,206 --> 00:28:16,080 Đung [Không nghe thấy] 644 00:28:16,080 --> 00:28:18,800 DAVID J. Malan: Yeah, dấu chéo ngược bằng không, lúc này ở một trong hai chuỗi 645 00:28:18,800 --> 00:28:20,100 chúng ta có thể quyết định đó là nó. 646 00:28:20,100 --> 00:28:21,970 Chúng tôi đã kết hợp tất cả các nhân vật duy nhất? 647 00:28:21,970 --> 00:28:22,990 Nếu không, trả về false. 648 00:28:22,990 --> 00:28:24,770 Nếu vậy, trở lại đúng. 649 00:28:24,770 --> 00:28:28,800 Và đó là chính xác những gì phiên bản này của chương trình so sánh-1.c nào. 650 00:28:28,800 --> 00:28:31,677 Nó giống hệt với những gì chúng tôi nhìn thứ hai ngoại trừ việc tôi đã 651 00:28:31,677 --> 00:28:34,760 gạt bỏ những string-- từ dù mà không có tất cả các chức năng impact-- 652 00:28:34,760 --> 00:28:37,450 Tôi đang làm bây giờ là loại bỏ một số bánh xe đào tạo trực quan, 653 00:28:37,450 --> 00:28:40,880 nhưng nhìn thấy rõ ràng rằng s và t là các địa chỉ. 654 00:28:40,880 --> 00:28:43,020 Và đó là những gì các ngôi sao, các dấu hoa thị, đại diện 655 00:28:43,020 --> 00:28:46,690 là một địa chỉ, nếu không được biết về mặt kỹ thuật như một con trỏ. 656 00:28:46,690 --> 00:28:49,880 >> Vì vậy, khi tôi tuyên bố s trên dòng 9 và nói char * s, 657 00:28:49,880 --> 00:28:52,160 điều đó không có nghĩa là cung cấp cho tôi một chuỗi. 658 00:28:52,160 --> 00:28:56,360 Điều đó có nghĩa là cung cấp cho tôi một biến mà mục đích trong cuộc sống là để lưu trữ một địa chỉ. 659 00:28:56,360 --> 00:29:00,400 Bởi vì tôi sắp đặt địa chỉ của một chuỗi thành nó. 660 00:29:00,400 --> 00:29:03,500 Và quả thực, GetString, để được rõ ràng, không trả về một chuỗi. 661 00:29:03,500 --> 00:29:06,110 Nó không trả lại mẹ dấu gạch chéo ngược bằng không, mỗi se. 662 00:29:06,110 --> 00:29:10,005 Những gì hiện GetString đặc biệt và chính xác trở lại? 663 00:29:10,005 --> 00:29:10,880 Đung [Không nghe thấy] 664 00:29:10,880 --> 00:29:14,080 DAVID J. Malan: Một địa chỉ, các địa chỉ của các nhân vật đầu tiên 665 00:29:14,080 --> 00:29:16,070 trong một số chuỗi nó đã nhận được. 666 00:29:16,070 --> 00:29:19,250 Và bây giờ chúng ta đang nhìn thấy một từ đặc biệt nữa. 667 00:29:19,250 --> 00:29:20,640 Và, tôi đã đề cập đến điều này trước đó. 668 00:29:20,640 --> 00:29:23,620 Điều này là có được ước tốt rằng chúng ta sẽ thấy một lần nữa và một lần nữa bây giờ. 669 00:29:23,620 --> 00:29:27,540 Tôi đang kiểm tra để đảm bảo rằng s không phải là null và t không phải là null. 670 00:29:27,540 --> 00:29:30,100 Bởi vì dựa trên tôi thực sự đề cập đến trước đó nhanh chóng, 671 00:29:30,100 --> 00:29:35,510 những gì có thể có nghĩa là nếu GetString trả về không một địa chỉ nhưng N-U-L-L, mà là một lần nữa, 672 00:29:35,510 --> 00:29:36,990 một số giá trị đặc biệt không? 673 00:29:36,990 --> 00:29:37,890 >> Đung Lỗi. 674 00:29:37,890 --> 00:29:38,600 >> DAVID J. Malan: Đó là một lỗi. 675 00:29:38,600 --> 00:29:39,550 Có gì đó không đúng. 676 00:29:39,550 --> 00:29:41,341 Và những gì thường có thể xảy ra, đặc biệt là 677 00:29:41,341 --> 00:29:45,162 với strings-- mà có thể là chiều dài chưa biết trong advance-- 678 00:29:45,162 --> 00:29:46,870 có thể các máy tính ' ra khỏi bộ nhớ, có thể 679 00:29:46,870 --> 00:29:49,280 bạn gõ vào một ví dụ từ dài hoặc câu 680 00:29:49,280 --> 00:29:51,880 hoặc dán một bài luận như vậy rất lớn có chỉ là không đủ bộ nhớ. 681 00:29:51,880 --> 00:29:55,340 Và như vậy GetString không thể trở về địa chỉ của toàn bộ điều, 682 00:29:55,340 --> 00:29:56,620 vì vậy nó chỉ trả về không có gì. 683 00:29:56,620 --> 00:30:00,580 Và nó nói một lỗi đã xảy ra bằng cách trả về giá trị NULL đặc biệt. 684 00:30:00,580 --> 00:30:02,890 Đó là địa chỉ không, vì vậy để nói chuyện. 685 00:30:02,890 --> 00:30:06,157 >> Bây giờ nó quay ra C đi kèm với một chức năng mà không lặp lại điều đó. 686 00:30:06,157 --> 00:30:09,240 Chúng tôi không cần phải thực hiện điều này với một vòng lặp hoặc một vòng lặp trong khi chính chúng ta. 687 00:30:09,240 --> 00:30:11,150 Chúng tôi có thể sử dụng một chức năng, gọi một cách ngắn gọn, 688 00:30:11,150 --> 00:30:15,400 khuấy động comp, hay chuỗi so sánh, mà mục đích trong cuộc sống là để làm chính xác điều đó. 689 00:30:15,400 --> 00:30:19,990 Bạn cung cấp cho nó hai con trỏ, hai địa chỉ, và nó sẽ đi đến những địa chỉ 690 00:30:19,990 --> 00:30:23,130 và sau đó so sánh thư cho thư cho thư cho chất lượng, 691 00:30:23,130 --> 00:30:26,610 chỉ dừng lại khi những gì là sự thật? 692 00:30:26,610 --> 00:30:31,540 Khi trực giác nên khuấy động comp ngừng iterating, chỉ để được rõ ràng? 693 00:30:31,540 --> 00:30:35,400 Khi nó chạm một dấu gạch chéo ngược 0 trong hoặc chuỗi, tại thời điểm đó nó có thể quyết định 694 00:30:35,400 --> 00:30:38,910 có mọi thứ phù hợp, hoặc đã có được một sự khác biệt? 695 00:30:38,910 --> 00:30:42,740 >> Vì vậy, nếu chúng ta chạy này và thử Game về vốn hóa của chúng tôi, 696 00:30:42,740 --> 00:30:49,260 do đó hãy so sánh-1, ./compare-1, và gõ mẹ trong chữ thường cả hai lần. 697 00:30:49,260 --> 00:30:50,560 Bây giờ nó là điều tương tự. 698 00:30:50,560 --> 00:30:54,080 Và nếu tôi làm điều đó một lần nữa với chữ thường và chữ hoa thì có lẽ. 699 00:30:54,080 --> 00:30:56,720 Bây giờ nó thực sự phân biệt giữa trên và chữ thường. 700 00:30:56,720 --> 00:31:00,440 Vì vậy, không phải tất cả những khó khăn hay huyền diệu, nhưng nó bây giờ giải thích 701 00:31:00,440 --> 00:31:03,140 những gì đang xảy ra bên dưới mui xe. 702 00:31:03,140 --> 00:31:07,640 >> Vì vậy, những gì chúng ta càng có thể trích xuất từ loại này của bài học? 703 00:31:07,640 --> 00:31:08,980 Vì vậy, chúng ta hãy nhìn vào điều này. 704 00:31:08,980 --> 00:31:15,380 Tôi sẽ đi trước và viết chương trình nhanh chóng ở đây gọi là bản sao-0. 705 00:31:15,380 --> 00:31:21,594 Và bây giờ chúng ta hãy đi trước và thực sự chúng ta hãy làm this-- với bản sao-0, 706 00:31:21,594 --> 00:31:23,010 hãy nhìn vào những gì tôi đã có ở đây. 707 00:31:23,010 --> 00:31:24,712 Lần đầu tiên tôi nói cho người dùng, nói điều gì đó. 708 00:31:24,712 --> 00:31:26,420 Sau đó, tôi nhận được một chuỗi và tôi cất nó trong s. 709 00:31:26,420 --> 00:31:29,810 Sau đó, tôi kiểm tra xem s bằng bằng NULL, chỉ trả lại 1. 710 00:31:29,810 --> 00:31:31,590 Vì vậy, đây là chỉ kiểm tra lỗi tiêu chuẩn. 711 00:31:31,590 --> 00:31:33,112 Không có gì thú vị đã xảy ra. 712 00:31:33,112 --> 00:31:36,320 Và trên thực tế, nếu chúng ta thoát khỏi những lỗi kiểm tra, điều này có vẻ như tuần 1 mã 713 00:31:36,320 --> 00:31:36,985 tại thời điểm này. 714 00:31:36,985 --> 00:31:39,110 Nhưng tôi đã bắt đầu để có được một chút tốt hơn về điều đó. 715 00:31:39,110 --> 00:31:43,340 >> Bây giờ ở dòng 16, một tuần trước đây, có lẽ ngày thậm chí một vài hoặc vài phút trước, 716 00:31:43,340 --> 00:31:46,720 bạn có thể nói dòng 16 là tạo ra một biến gọi là t 717 00:31:46,720 --> 00:31:48,219 và sao chép là vào nó. 718 00:31:48,219 --> 00:31:50,010 Và đó là một cách hoàn hảo takeaway hợp lý. 719 00:31:50,010 --> 00:31:51,560 Nhưng chính xác hơn bây giờ. 720 00:31:51,560 --> 00:31:54,190 Điều gì đang xảy ra ở dòng 16? 721 00:31:54,190 --> 00:31:56,170 Những gì là nhận được sao chép từ phải sang trái? 722 00:31:56,170 --> 00:31:56,669 Yeah? 723 00:31:56,669 --> 00:31:58,490 Đung là t nhận được một địa chỉ của s? 724 00:31:58,490 --> 00:32:01,220 >> DAVID J. Malan: Chính xác, t là nhận được địa chỉ của s. 725 00:32:01,220 --> 00:32:05,170 Vì vậy, để được rõ ràng bây giờ, nếu tôi đi lại cho rằng ví dụ trước đó 726 00:32:05,170 --> 00:32:08,520 và tôi vẽ ra những điều tôi đã nhập vào. 727 00:32:08,520 --> 00:32:11,640 Và những gì tôi đã gõ in-- đây, và ở đây 728 00:32:11,640 --> 00:32:15,830 là những gì tôi đã nhập vào một nơi nào đó trong bộ nhớ, mẹ và sau đó là một dấu gạch chéo ngược 729 00:32:15,830 --> 00:32:17,840 0 mà được thêm vào cho tôi. 730 00:32:17,840 --> 00:32:23,060 Những gì tôi được lưu trữ ở đây, nhớ lại, này là ở vị trí 1, 2, 3, 4, 731 00:32:23,060 --> 00:32:24,655 đây là những gì hiện đang trong s. 732 00:32:24,655 --> 00:32:29,220 Vì vậy, nếu trên dòng 16, tôi nói cho tôi một biến gọi là t và lưu trữ 733 00:32:29,220 --> 00:32:33,590 trong lúc giá trị của s, những gì được lưu trữ ở đây sẽ không phải mẹ 734 00:32:33,590 --> 00:32:35,480 nhưng thay vì chỉ là số 1. 735 00:32:35,480 --> 00:32:38,520 >> Vì vậy, nếu chúng ta nhìn về phía trước trong chương trình này bây giờ, điều gì sẽ xảy ra? 736 00:32:38,520 --> 00:32:40,690 Vì vậy, nhận thấy rằng có chức năng này có lẽ bạn 737 00:32:40,690 --> 00:32:44,410 đã sử dụng điều này một số thời gian trước đây cho Caesar, hoặc Vigenere, hoặc có thể không ở tất cả. 738 00:32:44,410 --> 00:32:48,170 Tôi khẳng định với printf của tôi, tôi đi đến tận các bản sao t. 739 00:32:48,170 --> 00:32:51,616 Đầu tiên trong dòng 19, sự tỉnh táo nhanh kiểm tra, kiểm tra strlen chiều dài của t. 740 00:32:51,616 --> 00:32:53,740 Bởi vì tôi không muốn cố gắng tận dụng một cái gì đó 741 00:32:53,740 --> 00:32:55,104 nếu không có chuỗi đó. 742 00:32:55,104 --> 00:32:57,520 Nếu người dùng chỉ cần nhấn Enter, không có gì để tận dụng là. 743 00:32:57,520 --> 00:33:01,100 Vì vậy, tôi không muốn làm dòng 21. 744 00:33:01,100 --> 00:33:05,758 Vì vậy, dòng 21 được tận mà thư, rõ ràng, trong t? 745 00:33:05,758 --> 00:33:06,514 >> Đung m? 746 00:33:06,514 --> 00:33:08,722 DAVID J. Malan: Dường như đó là sao chép mà một trong những? 747 00:33:08,722 --> 00:33:09,486 Đung m. 748 00:33:09,486 --> 00:33:10,450 DAVID J. Malan: Uh, m. 749 00:33:10,450 --> 00:33:12,685 OK, vì vậy m đầu tiên, vì thông báo rằng tôi 750 00:33:12,685 --> 00:33:14,935 đi qua để toupper, mà nếu bạn đã bao giờ nhìn thấy nó nó 751 00:33:14,935 --> 00:33:16,980 chỉ là một chức năng để tận dụng như là đầu vào của nó. 752 00:33:16,980 --> 00:33:20,240 t khung bằng không có nghĩa là cung cấp cho cho tôi những nhân vật không của t. 753 00:33:20,240 --> 00:33:22,550 Và do đó, làm thế nào thực hiện điều này thay đổi hình ảnh, để được rõ ràng? 754 00:33:22,550 --> 00:33:25,490 755 00:33:25,490 --> 00:33:29,160 Những gì cần phải được viết lại hoặc thay đổi Đối với s và t và mẹ với 756 00:33:29,160 --> 00:33:30,097 không gạch chéo ngược. 757 00:33:30,097 --> 00:33:31,470 >> Đung [Không nghe thấy] 758 00:33:31,470 --> 00:33:34,030 >> DAVID J. Malan: Yeah, vì vậy điều này một cách đơn giản ở đây 759 00:33:34,030 --> 00:33:40,860 nhu cầu để có được thay đổi nhằm: khắc phục this-- cần phải được thay đổi thành một m vốn. 760 00:33:40,860 --> 00:33:44,330 Nhưng bây giờ, nhìn sau này trong chương trình, nếu tôi in ra 761 00:33:44,330 --> 00:33:49,800 s và t là tôi làm sạch ở đây, xem những gì sẽ xảy ra in ra s và t. 762 00:33:49,800 --> 00:33:54,310 Vì vậy, hãy copy-0, ./copy-0. 763 00:33:54,310 --> 00:33:57,140 Hãy để tôi đi trước và gõ trong mẹ trong tất cả các chữ thường. 764 00:33:57,140 --> 00:34:00,140 Lưu ý cả hai bản gốc và bản sao này được vốn hóa. 765 00:34:00,140 --> 00:34:00,850 Tại sao? 766 00:34:00,850 --> 00:34:04,431 Vâng, s và t đều trỏ đến, nếu bạn sẽ, các đoạn cùng của bộ nhớ. 767 00:34:04,431 --> 00:34:06,930 Và thẳng thắn mà nói, đây là nhận được thực sự uninteresting-- thực tế 768 00:34:06,930 --> 00:34:09,150 mà chúng ta đang sử dụng địa chỉ không ở đây. 769 00:34:09,150 --> 00:34:11,719 Ý tôi là, tôi không thực sự quan tâm nơi những thứ có trong bộ nhớ. 770 00:34:11,719 --> 00:34:13,550 Xin lỗi tôi xóa một chút quá nhiều. 771 00:34:13,550 --> 00:34:15,674 Nhưng tôi không thực sự quan tâm nơi mà mọi thứ trong bộ nhớ. 772 00:34:15,674 --> 00:34:18,510 Và như vậy, thực sự những gì lập trình viên có xu hướng nghĩ về 773 00:34:18,510 --> 00:34:21,080 là khi bạn nói về địa chỉ, hoặc một con trỏ, 774 00:34:21,080 --> 00:34:22,679 những người quan tâm nó ở đâu trong bộ nhớ. 775 00:34:22,679 --> 00:34:24,989 Tôi không quan tâm nếu nó ở byte một hoặc một tỷ. 776 00:34:24,989 --> 00:34:27,920 Tôi chỉ quan tâm đến việc này biến là có hiệu quả 777 00:34:27,920 --> 00:34:29,620 chỉ vào đó đoạn bộ nhớ. 778 00:34:29,620 --> 00:34:33,350 Và như vậy, từ nay về sau, chứ không phải phân minh qua địa chỉ bộ nhớ tùy ý, chúng ta hãy 779 00:34:33,350 --> 00:34:36,710 chỉ cần bắt đầu để vẽ con trỏ như con trỏ, như mũi tên. 780 00:34:36,710 --> 00:34:39,340 Vì vậy, những gì s và t thực sự là, Theo chương trình này, 781 00:34:39,340 --> 00:34:42,130 vì thế tôi tạo ra t, nó chỉ là hai biến số riêng biệt 782 00:34:42,130 --> 00:34:43,840 chỉ vào đoạn cùng của bộ nhớ. 783 00:34:43,840 --> 00:34:45,215 Và chúng tôi không quan tâm họ đang ở đâu. 784 00:34:45,215 --> 00:34:47,130 Vì vậy, chúng ta có thể tóm tắt đi chi tiết đó. 785 00:34:47,130 --> 00:34:48,780 >> Vì vậy, làm thế nào để sửa lỗi này? 786 00:34:48,780 --> 00:34:54,120 Nếu tôi muốn viết một phiên bản của các bản sao chương trình thực bản sao chuỗi 787 00:34:54,120 --> 00:34:56,840 và chỉ có tận bản sao, chỉ bằng trực giác, 788 00:34:56,840 --> 00:34:59,766 những gì đã nhận được một Thành phần cho giải pháp của chúng tôi? 789 00:34:59,766 --> 00:35:00,640 Đung [Không nghe thấy] 790 00:35:00,640 --> 00:35:01,420 DAVID J. Malan: Chúng tôi cần một điều gì? 791 00:35:01,420 --> 00:35:01,820 Đung Chunk của bộ nhớ. 792 00:35:01,820 --> 00:35:03,280 DAVID J. Malan: Chúng ta cần một đoạn bộ nhớ, phải không? 793 00:35:03,280 --> 00:35:05,360 Chúng tôi không biết làm thế nào để làm được chưa, nhất thiết. 794 00:35:05,360 --> 00:35:11,330 Nhưng tôi loại cần này xảy ra như vậy rằng mẹ gốc trong trường hợp thấp hơn 795 00:35:11,330 --> 00:35:14,170 kết thúc trong đó đoạn thêm bộ nhớ. 796 00:35:14,170 --> 00:35:19,770 Và sau đó khi tôi thay đổi các bản sao, tôi không muốn thay đổi bản này tại đây. 797 00:35:19,770 --> 00:35:26,020 Tôi thay vào đó muốn thay đổi chỉ này bản sao để các ban đầu là không thay đổi. 798 00:35:26,020 --> 00:35:27,980 >> Vì vậy, chúng ta hãy xem làm thế nào chúng ta có thể làm điều này. 799 00:35:27,980 --> 00:35:31,800 Trong copy-1, đã và bị tước bình luận, 800 00:35:31,800 --> 00:35:33,250 nhưng là nhận xét trực tuyến. 801 00:35:33,250 --> 00:35:36,710 Chúng tôi thay vì làm những following-- dòng giống hệt nhau, làm cho tôi một chuỗi 802 00:35:36,710 --> 00:35:38,340 và gọi nó là. 803 00:35:38,340 --> 00:35:43,500 Nhưng bây giờ chúng ta hãy nhìn vào một trong nhất của chúng tôi phức tạp nhưng cuối cùng của sự phức tạp 804 00:35:43,500 --> 00:35:47,340 cho một lúc, dòng 16 không chính xác này. 805 00:35:47,340 --> 00:35:49,400 Vì vậy, nếu bạn thoải mái với hình ảnh chúng tôi chỉ drew-- 806 00:35:49,400 --> 00:35:51,790 cho tôi một đoạn mới của bộ nhớ, sao chép tất cả mọi thứ vào nó, 807 00:35:51,790 --> 00:35:53,730 chúng ta hãy xem làm thế nào chúng tôi dịch đó để mã. 808 00:35:53,730 --> 00:35:59,400 >> Vì vậy, dòng 16, ở phía bên tay trái, char * t mang lại cho tôi hộp này trên đây. 809 00:35:59,400 --> 00:36:00,230 Đó là tất cả nó. 810 00:36:00,230 --> 00:36:03,240 Ở phía bên tay phải, m alloc, hoặc malloc, 811 00:36:03,240 --> 00:36:06,480 là cấp phát bộ nhớ, siêu ưa thích, một cách khó hiểu của chỉ nói 812 00:36:06,480 --> 00:36:07,640 cho tôi một đoạn bộ nhớ. 813 00:36:07,640 --> 00:36:09,290 Chúng ta cần bao nhiêu bộ nhớ? 814 00:36:09,290 --> 00:36:10,910 Vâng, là loại một biểu hiện lớn. 815 00:36:10,910 --> 00:36:12,570 Nhưng chúng ta hãy xem những gì nó nói ở đây. 816 00:36:12,570 --> 00:36:15,940 Vì vậy, tất nhiên, là cung cấp cho tôi chiều dài chuỗi s. 817 00:36:15,940 --> 00:36:19,094 Vì vậy, mẹ nó nên được những gì? 818 00:36:19,094 --> 00:36:21,010 Vì vậy, chỉ cần ba, phải không? mẹ là ba ký tự. 819 00:36:21,010 --> 00:36:22,830 Bạn không đếm dấu gạch chéo ngược bằng không khi bạn 820 00:36:22,830 --> 00:36:25,960 nói về độ dài của một chuỗi nó thực sự có thể nhìn thấy các chữ cái của con người. 821 00:36:25,960 --> 00:36:28,020 Vì vậy, mẹ, vì vậy điều này mang lại cho tôi 3. 822 00:36:28,020 --> 00:36:31,170 Nhưng chờ một phút, tôi bây giờ thêm 1. 823 00:36:31,170 --> 00:36:34,861 Tại sao tôi thực sự muốn phân bổ 4 byte và không phải chỉ 3? 824 00:36:34,861 --> 00:36:35,360 Yeah? 825 00:36:35,360 --> 00:36:36,910 >> Đung Đối với các giá trị trọng điểm? 826 00:36:36,910 --> 00:36:38,951 >> DAVID J. Malan: Chính xác, cho rằng giá trị trọng điểm. 827 00:36:38,951 --> 00:36:40,840 Đối với các dấu gạch chéo ngược bằng không, Tôi cần tổng số 4 byte. 828 00:36:40,840 --> 00:36:42,870 Vì vậy, tôi cần chiều dài của chuỗi cộng thêm 1. 829 00:36:42,870 --> 00:36:45,400 Và sau đó chỉ cần cho measure-- tốt mặc dù trên hệ thống này, 830 00:36:45,400 --> 00:36:49,390 nó luôn luôn có được 1-- tôi nói nhân này bằng kích thước của một char. 831 00:36:49,390 --> 00:36:51,552 Hóa ra là sizeof toán tử trong C 832 00:36:51,552 --> 00:36:53,260 chỉ cho bạn biết số byte đó là 833 00:36:53,260 --> 00:36:54,700 cần thiết cho một kiểu dữ liệu nhất định. 834 00:36:54,700 --> 00:36:57,740 Nó không làm việc cho các mảng, thường, đôi khi nó làm. 835 00:36:57,740 --> 00:36:59,210 Nhưng trong trường hợp chung, không có. 836 00:36:59,210 --> 00:37:02,330 Nhưng nó sẽ cho tôi biết bao nhiêu byte một char là, mà hóa ra luôn luôn là 1. 837 00:37:02,330 --> 00:37:04,080 Vì vậy, điều này giống như cách nhân bằng 1. 838 00:37:04,080 --> 00:37:05,900 >> Vì vậy, siêu khó hiểu nhìn dòng mã. 839 00:37:05,900 --> 00:37:09,320 Nhưng tất cả những gì nó làm là cung cấp cho tôi một đoạn bộ nhớ. 840 00:37:09,320 --> 00:37:13,590 Nhưng nó có vẻ được sao chép bất cứ điều gì vào bộ nhớ? 841 00:37:13,590 --> 00:37:14,560 Chưa được. 842 00:37:14,560 --> 00:37:22,040 Và vì vậy những gì tôi làm trên dòng 22, và 23, 24, 25, tốt, tôi chỉ đơn giản là làm điều này. 843 00:37:22,040 --> 00:37:23,760 Và đây là loại công cụ học cũ bây giờ. 844 00:37:23,760 --> 00:37:26,010 Điều này giống như PSet 2, nơi bạn chỉ cần di chuyển những thứ 845 00:37:26,010 --> 00:37:28,620 xung quanh trong bộ nhớ, hay đúng hơn trong chuỗi. 846 00:37:28,620 --> 00:37:31,920 >> Vì vậy, tôi lặp từ 0 đến chiều dài của chuỗi s. 847 00:37:31,920 --> 00:37:37,820 Và tôi đang sao chép các ký tự thứ i trong s thành nhân vật thứ i trong t. 848 00:37:37,820 --> 00:37:41,820 Và bởi vì tôi, các lập trình viên, thực hiện chắc chắn để phân bổ chính xác như nhiều byte 849 00:37:41,820 --> 00:37:44,600 khi tôi cần, nó hoàn hảo one-to-one mối quan hệ. 850 00:37:44,600 --> 00:37:47,060 Và tôi sao chép mẹ trong chữ thường sang mới. 851 00:37:47,060 --> 00:37:50,170 Và rồi cuối cùng, tôi làm dòng này. 852 00:37:50,170 --> 00:37:54,637 Và vì vậy hiệu quả duy nhất là để tận t này đây. 853 00:37:54,637 --> 00:37:56,470 Vì thế rất nhiều để hấp thụ, nhưng nếu bạn chỉ cần xem xét 854 00:37:56,470 --> 00:37:58,220 đâu là sự thật trên dưới mui xe 855 00:37:58,220 --> 00:38:00,880 chỉ là di chuyển những byte xung quanh, tất cả những gì 856 00:38:00,880 --> 00:38:06,617 là cần thiết để giải quyết vấn đề này là chỉ để cung cấp cho chúng tôi đoạn này của bộ nhớ. 857 00:38:06,617 --> 00:38:08,450 Bây giờ có nguy cơ áp đảo, hãy để tôi chỉ 858 00:38:08,450 --> 00:38:13,200 một ví dụ khác đó là gần như giống hệt nhau, trừ trường hợp này 859 00:38:13,200 --> 00:38:14,350 dòng mã. 860 00:38:14,350 --> 00:38:18,870 Vì vậy, đây là phiên bản của hacker của chương trình này, nếu bạn muốn. 861 00:38:18,870 --> 00:38:21,050 Nhưng chúng ta hãy chỉ chắt lọc nó vào những gì đang xảy ra. 862 00:38:21,050 --> 00:38:28,920 Dòng 24 từng là t này khung i được s khung i. 863 00:38:28,920 --> 00:38:33,370 Bây giờ, tôi sẽ thay đổi này để ngôi sao t nhiều bí ẩn hơn 864 00:38:33,370 --> 00:38:36,280 cộng 1 bằng s sao cộng thêm 1. 865 00:38:36,280 --> 00:38:38,702 >> Vì vậy, những gì đang xảy ra và tại sao Chúng ta có một nhân vật sao? 866 00:38:38,702 --> 00:38:41,410 Chúng tôi đã nhìn thấy các ngôi sao trước, và nó đang được sử dụng khác nhau ở đây. 867 00:38:41,410 --> 00:38:45,490 Trước đây chúng ta đã thấy char *, bây giờ tôi đang nhìn thấy một ngôi sao ngay từ đầu, và đó là OK. 868 00:38:45,490 --> 00:38:48,190 Bởi vì thực ra chúng loại có thể suy ra các chỉ 869 00:38:48,190 --> 00:38:50,280 từ những người đầu tiên nguyên tắc những gì đang xảy ra. 870 00:38:50,280 --> 00:38:53,860 Vì vậy, chỉ để được rõ ràng, là những gì s? 871 00:38:53,860 --> 00:38:55,052 Tuần trước, đó là một chuỗi. 872 00:38:55,052 --> 00:38:56,260 Điều đó không đủ nữa. 873 00:38:56,260 --> 00:38:57,690 Là những gì s, cụ thể? 874 00:38:57,690 --> 00:38:58,590 >> Đung [Không nghe thấy] 875 00:38:58,590 --> 00:38:59,881 >> DAVID J. Malan: Đó là một con trỏ. 876 00:38:59,881 --> 00:39:02,610 Đó là địa chỉ của nhân vật đầu tiên chúng ta gõ vào. 877 00:39:02,610 --> 00:39:04,780 OK, t là gì? 878 00:39:04,780 --> 00:39:05,660 >> Đung [Không nghe thấy] 879 00:39:05,660 --> 00:39:07,950 >> DAVID J. Malan: Các địa chỉ của byte đầu tiên 880 00:39:07,950 --> 00:39:10,490 trong t, mà đoạn bộ nhớ phân bổ lại. 881 00:39:10,490 --> 00:39:14,720 Vì vậy, nó chỉ ra rằng khi chúng ta lặp từ 0 trên lên đến chuỗi 882 00:39:14,720 --> 00:39:17,424 length-- đầu tiên của tất cả, i bắt đầu giảm ở mức 0, bởi vì 883 00:39:17,424 --> 00:39:18,840 các trường học cũ này cho điều loop. 884 00:39:18,840 --> 00:39:22,400 Vì vậy, chỉ vì đơn giản, chúng ta hãy giả định rằng các dòng mã đầu tiên 885 00:39:22,400 --> 00:39:23,760 thực sự chỉ này, phải. 886 00:39:23,760 --> 00:39:26,080 Nếu tôi là số không, thêm zero một cái gì đó có lẽ 887 00:39:26,080 --> 00:39:27,540 sẽ không có hiệu lực. 888 00:39:27,540 --> 00:39:28,560 >> Vì vậy, câu nói này là gì? 889 00:39:28,560 --> 00:39:31,600 Nó chỉ ra rằng ngôi sao điều hành trong bối cảnh này 890 00:39:31,600 --> 00:39:33,700 là tới đích điều hành, mà chỉ là 891 00:39:33,700 --> 00:39:37,530 một cách nói đi đến địa chỉ sau đây. 892 00:39:37,530 --> 00:39:42,080 Vì vậy, nếu s là địa chỉ đầu tiên nhân vật trong đoạn này của bộ nhớ, 893 00:39:42,080 --> 00:39:43,630 * s phương tiện đi đến đó. 894 00:39:43,630 --> 00:39:45,630 Và bởi vì chúng tôi đã rút ra hình ảnh theo cách này, 895 00:39:45,630 --> 00:39:47,430 bạn có thể áp dụng theo mô hình về tinh thần. 896 00:39:47,430 --> 00:39:51,030 Nếu đây là s, và bạn nói * s, * s loại giống như máng và thang, 897 00:39:51,030 --> 00:39:54,540 nếu bạn nhớ những trò chơi từ thời thơ ấu, cũng giống như làm theo mũi tên đó và đi 898 00:39:54,540 --> 00:39:55,570 đến địa chỉ. 899 00:39:55,570 --> 00:39:57,080 >> * t là điều tương tự. 900 00:39:57,080 --> 00:39:59,855 Vì vậy, bắt đầu ở đây, đi đến đoạn của nó. 901 00:39:59,855 --> 00:40:03,350 Tôi không thể chỉ vẽ trên màn hình này theo cách đó. 902 00:40:03,350 --> 00:40:05,560 * t có nghĩa là để đi đây. 903 00:40:05,560 --> 00:40:08,830 Và sau đó, vòng lặp cho chỉ là nói di chuyển nhân vật này ở đây, 904 00:40:08,830 --> 00:40:11,330 di chuyển nhân vật này ở đây, di chuyển nhân vật này ở đây. 905 00:40:11,330 --> 00:40:12,890 Nhưng làm thế nào để tôi làm incrementation đó? 906 00:40:12,890 --> 00:40:15,430 Tôi cần phải lùi lại những gì tôi chỉ cần xóa. 907 00:40:15,430 --> 00:40:18,140 Đây là nói chung là những gì được gọi là con trỏ số học, mà 908 00:40:18,140 --> 00:40:20,040 nghĩa toán học có địa chỉ. 909 00:40:20,040 --> 00:40:22,460 >> Nếu, trong này cho vòng lặp, Tôi cứ incrementing i, 910 00:40:22,460 --> 00:40:26,880 và s là một địa chỉ và t là một địa chỉ, nếu tôi chỉ giữ thêm 1, 911 00:40:26,880 --> 00:40:31,406 mà chỉ có nghĩa là tiếp tục di chuyển về phía trước, và chuyển tiếp, và chuyển tiếp trong bộ nhớ. 912 00:40:31,406 --> 00:40:34,030 Nó giống như Oxford Street, đường phố mà tòa nhà CS là trên. 913 00:40:34,030 --> 00:40:36,490 Các tòa nhà CS là tại 33 đường Oxford. 914 00:40:36,490 --> 00:40:39,870 Vì vậy, nếu bạn đã làm 33 Oxford Street cộng với 1, 915 00:40:39,870 --> 00:40:42,870 mang lại cho bạn đến 34 Oxford Đường phố, sau đó 35 Oxford Street, 916 00:40:42,870 --> 00:40:46,380 sau đó 36 Oxford Street, bất cứ điều gì những người tòa nhà thực sự là - nếu chúng tồn tại. 917 00:40:46,380 --> 00:40:50,540 Và như vậy, đó là tất cả chúng ta đang làm ở đây với con trỏ số học. 918 00:40:50,540 --> 00:40:53,820 >> Vì vậy, nó là một cách thật phức tạp thể hiện chính mình. 919 00:40:53,820 --> 00:40:56,160 Nhưng tất cả những gì đang xảy ra bên dưới mui xe 920 00:40:56,160 --> 00:40:59,330 chỉ là những địa chỉ sau đây, như sau một bản đồ, nếu bạn muốn, 921 00:40:59,330 --> 00:41:02,692 hoặc mũi tên như sau chúng tôi đã rút ra trên màn hình. 922 00:41:02,692 --> 00:41:04,910 OK, rất nhiều để tiêu hóa. 923 00:41:04,910 --> 00:41:10,410 Bất kỳ câu hỏi về cú pháp, khái niệm, con trỏ, malloc, hoặc tương tự. 924 00:41:10,410 --> 00:41:11,480 Vâng, ở đây đầu tiên. 925 00:41:11,480 --> 00:41:13,755 >> Đung Vì vậy, nơi mà nói * t bằng toupper * t, 926 00:41:13,755 --> 00:41:15,575 là sẽ tận tất cả các chữ cái hoặc just-- 927 00:41:15,575 --> 00:41:17,283 >> DAVID J. Malan: Ah, Câu hỏi thực sự tốt. 928 00:41:17,283 --> 00:41:19,805 Vì vậy, trong dòng này ở đây, 31, Điều này sẽ tận 929 00:41:19,805 --> 00:41:21,430 các chữ cái đầu tiên hoặc tất cả các chữ cái. 930 00:41:21,430 --> 00:41:23,460 Vì vậy, hãy trả lời rằng bằng cách đi trở lại nguyên tắc đầu tiên. 931 00:41:23,460 --> 00:41:26,168 Và nguyên tắc đầu tiên ở đây tôi muốn nói chỉ cần đi đến các định nghĩa cơ bản 932 00:41:26,168 --> 00:41:27,000 về những gì liên quan. 933 00:41:27,000 --> 00:41:29,770 Vì vậy toupper là một chức năng mà tận một char. 934 00:41:29,770 --> 00:41:30,530 Đó là tất cả. 935 00:41:30,530 --> 00:41:36,740 * t có nghĩa là đi đến first-- đi đến các địa chỉ trong t. 936 00:41:36,740 --> 00:41:40,350 Vì vậy, trong hình, nếu đây là đoạn bộ nhớ chúng ta giao malloc, 937 00:41:40,350 --> 00:41:43,310 và đây là t, t * có nghĩa là đi đây. 938 00:41:43,310 --> 00:41:46,710 >> Trong khi đó, bạn đang đi qua giá trị đó, chữ thường m 939 00:41:46,710 --> 00:41:50,040 để toupper, bạn đang nhận lại vốn M, có thì bạn đưa nó? 940 00:41:50,040 --> 00:41:52,410 Bạn đang đặt nó trong cùng một vị trí. 941 00:41:52,410 --> 00:41:55,540 Và như vậy bởi đó logic của những định nghĩa cơ bản nó chỉ 942 00:41:55,540 --> 00:41:58,792 tận dụng các chữ cái đầu tiên trừ khi bạn lặp với i hay 943 00:41:58,792 --> 00:42:02,000 cho vòng lặp hoặc một vòng lặp trong khi, nó không phải đi để làm bất cứ điều gì nhiều hơn bạn yêu cầu nó. 944 00:42:02,000 --> 00:42:02,583 Câu hỏi hay. 945 00:42:02,583 --> 00:42:03,237 Yeah? 946 00:42:03,237 --> 00:42:05,369 >> Đung Tại sao bạn sử dụng tới đích của phương pháp hơn 947 00:42:05,369 --> 00:42:05,979 các mảng? 948 00:42:05,979 --> 00:42:07,395 >> DAVID J. Malan: Ah, tốt câu hỏi. 949 00:42:07,395 --> 00:42:10,672 Tại sao bạn sẽ sử dụng tới đích Phương pháp thay vì phương pháp mảng? 950 00:42:10,672 --> 00:42:12,130 Không có lý do đặc biệt, phải trung thực. 951 00:42:12,130 --> 00:42:15,290 Và, trên thực tế, cho đây loại ví dụ, phải, 952 00:42:15,290 --> 00:42:17,556 Tôi chỉ cãi nhau làm cho chương trình phức tạp hơn, 953 00:42:17,556 --> 00:42:19,680 nhiều mắt được lắp kính trên, người được kiểm tra ra 954 00:42:19,680 --> 00:42:22,830 bởi vì điều này có vẻ siêu phức tạp, nhưng mặc dù nó đang làm điều tương tự. 955 00:42:22,830 --> 00:42:26,695 Và như vậy, thẳng thắn mà nói, đây là một giải pháp không cần thiết trực quan phức tạp 956 00:42:26,695 --> 00:42:27,320 cho vấn đề. 957 00:42:27,320 --> 00:42:29,580 >> Nó vẫn là thiết kế tốt, năm trong số năm cho thiết kế, 958 00:42:29,580 --> 00:42:33,140 cho dù đó là trong khung kí hiệu hoặc các ký hiệu con trỏ. 959 00:42:33,140 --> 00:42:36,299 But-- đặc biệt là khi chúng tôi nhận được sau này trong khóa học vào PSet 5 960 00:42:36,299 --> 00:42:39,340 khi chúng ta thực hiện từ điển mà đó Tôi đã đề cập đến một vài times-- 961 00:42:39,340 --> 00:42:42,300 chúng ta sẽ thực sự quan tâm đến địa chỉ bộ nhớ cấp thấp 962 00:42:42,300 --> 00:42:44,140 rằng chúng ta thực sự hiểu những gì đang xảy ra. 963 00:42:44,140 --> 00:42:48,300 >> Nhưng, bây giờ, nó chỉ ra rằng điều này dòng mã ngoặc vuông ở đây 964 00:42:48,300 --> 00:42:49,900 không thực sự tồn tại. 965 00:42:49,900 --> 00:42:52,230 Họ là những gì được gọi là cú pháp đường, mà 966 00:42:52,230 --> 00:42:58,390 chỉ là một cách kì lạ mát nói ra trình biên dịch chuyển đổi dấu ngoặc vuông để được 967 00:42:58,390 --> 00:43:00,420 mà biểu thức toán học. 968 00:43:00,420 --> 00:43:02,660 Vì vậy, nó là một quy ước của con người để có thể chỉ cần viết 969 00:43:02,660 --> 00:43:04,220 các dấu ngoặc rất dễ sử dụng. 970 00:43:04,220 --> 00:43:06,850 Nhưng những gì các trình biên dịch, kêu vang, đang thực sự làm bất cứ lúc nào 971 00:43:06,850 --> 00:43:10,970 bạn viết những gì nổi bật trong dòng 24, dưới mui xe nó thực sự 972 00:43:10,970 --> 00:43:12,330 chuyển đổi nó vào đây. 973 00:43:12,330 --> 00:43:16,200 Nó chỉ thêm vui như một con người đọc và viết mã như dòng 24. 974 00:43:16,200 --> 00:43:18,530 Nhưng cuối cùng những bánh xe đào tạo quá đi tắt 975 00:43:18,530 --> 00:43:21,780 khi thoải mái của chính mình trở nên mạnh hơn. 976 00:43:21,780 --> 00:43:27,240 >> Tất cả các quyền, vì vậy sau đó nhớ lại rằng đây là loại vấn đề lớn nhất 977 00:43:27,240 --> 00:43:27,807 chúng tôi chạy vào. 978 00:43:27,807 --> 00:43:30,640 Và đó là những gì đã gây ra toàn bộ này chuyện chết tiệt về con trỏ, 979 00:43:30,640 --> 00:43:32,340 và địa chỉ, và những thứ sao chép. 980 00:43:32,340 --> 00:43:35,410 Đó là bởi vì chúng ta vấp ngu ngốc, ngu ngốc vấn đề này, theo đó 981 00:43:35,410 --> 00:43:38,830 Tôi thực hiện logically-- với Lauren lên đây trên các bản demo và nước cam 982 00:43:38,830 --> 00:43:43,770 trong milk-- một cách hoàn hảo Chức năng thuật toán chính xác 983 00:43:43,770 --> 00:43:47,010 để trao đổi hai biến ' giá trị, nhưng điều damn 984 00:43:47,010 --> 00:43:50,550 không có bất cứ dai dẳng, hoặc lâu dài, ảnh hưởng đến mã của tôi. 985 00:43:50,550 --> 00:43:51,820 >> Tại sao lại thế? 986 00:43:51,820 --> 00:43:54,650 Tóm lại, tại sao điều này thực hiện hoán đổi 987 00:43:54,650 --> 00:43:58,740 logic đúng, nhưng không có tác động trên các biến được truyền cho nó, 988 00:43:58,740 --> 00:44:01,119 như x và y cho chính? 989 00:44:01,119 --> 00:44:02,410 Các ý chính của vấn đề này là gì? 990 00:44:02,410 --> 00:44:02,909 Yeah? 991 00:44:02,909 --> 00:44:05,532 Đung Bởi vì biến làm bản sao của biến trong các đường chuyền 992 00:44:05,532 --> 00:44:06,240 thông qua chức năng. 993 00:44:06,240 --> 00:44:09,060 >> DAVID J. Malan: Chính xác, khi bạn vượt qua biến thành một chức năng, hay tranh luận 994 00:44:09,060 --> 00:44:11,030 vào một chức năng, họ thông qua bản sao, mà 995 00:44:11,030 --> 00:44:14,770 có nghĩa là bạn có được một giống hệt nhau tìm kiếm mô hình của các bit cho cả x và y, 996 00:44:14,770 --> 00:44:15,955 ở đây gọi là a và b. 997 00:44:15,955 --> 00:44:18,080 Và bạn có thể làm bất cứ điều gì bạn muốn với những bản sao, 998 00:44:18,080 --> 00:44:20,657 nhưng họ sẽ không có ảnh hưởng đến chức năng gọi điện thoại. 999 00:44:20,657 --> 00:44:22,990 Và, trên thực tế, chúng ta đã vẽ rằng hình ảnh trên màn hình, thu hồi 1000 00:44:22,990 --> 00:44:25,520 thời gian qua, theo đó nếu bạn thực sự suy nghĩ về những gì 1001 00:44:25,520 --> 00:44:28,570 xảy ra bên dưới nếu hood-- đây là bộ nhớ của máy tính, 1002 00:44:28,570 --> 00:44:31,650 và xuống ở đây là các đoạn bộ nhớ đang được sử dụng cho chính, 1003 00:44:31,650 --> 00:44:34,020 đây là đoạn bộ nhớ đang được sử dụng để trao đổi, 1004 00:44:34,020 --> 00:44:37,090 và có nên ngay cả khi chính hai biến x, y, 1005 00:44:37,090 --> 00:44:41,840 trao đổi có thể có giống hệt nhau tìm giá trị, cả hai đều là 1 và 2, 1006 00:44:41,840 --> 00:44:44,520 nhưng chúng hoàn toàn khối khác nhau của bộ nhớ. 1007 00:44:44,520 --> 00:44:46,130 >> Vì vậy, chúng ta cần một giải pháp này. 1008 00:44:46,130 --> 00:44:51,580 Và thẳng thắn mà nói, có vẻ như chúng ta bây giờ có một giải pháp cho vấn đề này, phải. 1009 00:44:51,580 --> 00:44:55,760 Nếu bây giờ chúng ta có khả năng thao tác bằng những cách các địa chỉ 1010 00:44:55,760 --> 00:44:59,310 và, loại máng và thang phong cách, làm theo các mũi tên 1011 00:44:59,310 --> 00:45:02,820 và đi bất cứ đâu chúng ta muốn trong bộ nhớ, chúng ta không thể 1012 00:45:02,820 --> 00:45:06,220 giải quyết vấn đề này bằng cách đi từ chính để trao đổi 1013 00:45:06,220 --> 00:45:09,650 không phải là giá trị mà ta muốn trao đổi, nhưng chỉ bằng trực giác 1014 00:45:09,650 --> 00:45:11,630 những gì chúng ta có thể vượt qua để đổi thay? 1015 00:45:11,630 --> 00:45:12,620 >> [Interposing GIỌNG NÓI] 1016 00:45:12,620 --> 00:45:15,244 >> DAVID J. Malan: Tại sao chúng ta không chỉ vượt qua nó địa chỉ, đúng không? 1017 00:45:15,244 --> 00:45:17,470 Tại sao chúng ta không đưa ra trao đổi một bản đồ kho báu, nếu bạn muốn, 1018 00:45:17,470 --> 00:45:20,950 dẫn nó vào giá trị thực tế x và y. 1019 00:45:20,950 --> 00:45:24,340 Hãy trao đổi, thực sự thay đổi các bit nguyên gốc hơn 1020 00:45:24,340 --> 00:45:26,797 chỉ cần đi qua các bản sao của các bit. 1021 00:45:26,797 --> 00:45:29,130 Và như vậy, trên thực tế, đó là những gì sẽ là giải pháp. 1022 00:45:29,130 --> 00:45:31,899 Phiên bản này ở đây là rõ ràng xấu và thiếu sót. 1023 00:45:31,899 --> 00:45:35,190 Và bây giờ, ở cái nhìn đầu tiên, nó chỉ trông như chúng tôi đã thêm một loạt các ngôi sao ngẫu nhiên 1024 00:45:35,190 --> 00:45:37,106 và vượt qua ngón tay của chúng rằng nó sẽ biên dịch. 1025 00:45:37,106 --> 00:45:38,460 Nhưng, bây giờ nó sẽ biên dịch. 1026 00:45:38,460 --> 00:45:40,090 >> Nhưng chúng ta hãy xem những gì những điều có ý nghĩa. 1027 00:45:40,090 --> 00:45:43,990 Và, thật không may, các tác giả của C đã có thể chọn biểu tượng khác 1028 00:45:43,990 --> 00:45:46,380 để thực hiện điều này một chút rõ ràng hơn, nhưng các nhà điều hành sao 1029 00:45:46,380 --> 00:45:48,610 có ý nghĩa khác nhau trong hai bối cảnh khác nhau. 1030 00:45:48,610 --> 00:45:50,890 Và chúng tôi đã nhìn thấy cả hai, nhưng chúng ta hãy phân biệt. 1031 00:45:50,890 --> 00:45:55,310 >> Vì vậy, ở đầu có, khi tôi đã thay đổi và b 1032 00:45:55,310 --> 00:46:00,470 từ là int trong xấu Phiên bản để int sao, a, b, 1033 00:46:00,470 --> 00:46:01,740 trước đó, là số nguyên. 1034 00:46:01,740 --> 00:46:05,752 A và b là gì bây giờ trong tốt, phiên bản màu xanh lá cây? 1035 00:46:05,752 --> 00:46:06,900 Họ là các địa chỉ. 1036 00:46:06,900 --> 00:46:09,610 Địa chỉ của những gì, để được rõ ràng? 1037 00:46:09,610 --> 00:46:10,770 Địa chỉ của các số nguyên. 1038 00:46:10,770 --> 00:46:12,520 Vì vậy, thực tế là tôi nói phương tiện int sao 1039 00:46:12,520 --> 00:46:15,440 đây là địa chỉ của một số nguyên, cụ thể. 1040 00:46:15,440 --> 00:46:19,120 >> Vì vậy, hiện nay thông báo trong các dòng mã, một cái gì đó khác đã thay đổi quá. 1041 00:46:19,120 --> 00:46:22,770 tmp vẫn như nhau, vì nó chỉ là các số nguyên tạm thời, 1042 00:46:22,770 --> 00:46:24,110 không có phép thuật bộ nhớ đó. 1043 00:46:24,110 --> 00:46:26,370 Tuy nhiên, một doanh nghiệp cần một ngôi sao. 1044 00:46:26,370 --> 00:46:28,560 Và, trên thực tế, mỗi đề cập khác của a và b, 1045 00:46:28,560 --> 00:46:31,780 nhận thấy rằng tất cả những gì thay đổi từ màu đỏ sang màu xanh lá cây 1046 00:46:31,780 --> 00:46:34,209 là tôi đang đặt trước từ những biến với các ngôi sao. 1047 00:46:34,209 --> 00:46:35,750 Bởi vì tôi không muốn sao chép một và b. 1048 00:46:35,750 --> 00:46:40,350 Bởi vì nếu tôi chỉ cần sao chép a, b và swap a và b, những gì tôi thực sự hoán đổi? 1049 00:46:40,350 --> 00:46:43,760 Chỉ cần địa chỉ, tôi muốn trao đổi những gì ở những địa chỉ. 1050 00:46:43,760 --> 00:46:44,860 Tôi muốn đi đến đó. 1051 00:46:44,860 --> 00:46:48,000 Và do đó, các nhà điều hành sao bên trong các chức năng của tôi, 1052 00:46:48,000 --> 00:46:51,700 không bên trong danh sách tham số, có nghĩa là bạn đi đến những địa chỉ 1053 00:46:51,700 --> 00:46:54,490 và thực sự thay đổi những giá trị. 1054 00:46:54,490 --> 00:46:56,500 >> Vì vậy, những gì hiện các hình ảnh bây giờ nhìn như thay thế. 1055 00:46:56,500 --> 00:47:03,250 Vâng, nếu thay vào đó tôi đi qua trong cho a và b không 1 và 2-- 1056 00:47:03,250 --> 00:47:05,790 Tôi thực sự cần phải thêm một định nghĩa khác ở đây. 1057 00:47:05,790 --> 00:47:09,030 Vì vậy, giả sử rằng đoạn này bộ nhớ là ở vị trí 10. 1058 00:47:09,030 --> 00:47:12,960 >> Đây là vị trí 11, nhưng điều này là một chút của một đơn giản hóa, 1059 00:47:12,960 --> 00:47:18,900 Bây giờ tôi có hai lựa chọn để tôi vượt qua x và y hoặc để tôi vượt qua địa chỉ của họ? 1060 00:47:18,900 --> 00:47:22,500 Nếu tôi vượt qua địa chỉ của họ như thế này, tôi chỉ 1061 00:47:22,500 --> 00:47:25,390 bây giờ cần phải thực hiện trao đổi mỗi mã xanh 1062 00:47:25,390 --> 00:47:29,080 để khi nó thấy một và khi nó xem sự b, nó không chỉ sao chép một và b 1063 00:47:29,080 --> 00:47:30,540 và di chuyển sữa và nước cam. 1064 00:47:30,540 --> 00:47:32,664 Sữa và nước cam ẩn dụ bây giờ bị phá vỡ, 1065 00:47:32,664 --> 00:47:35,060 bởi vì đó là chén các bản đồ lỏng và không. 1066 00:47:35,060 --> 00:47:37,750 Chúng tôi thay vì cần phải đi để giải quyết 10 và chúng tôi 1067 00:47:37,750 --> 00:47:42,420 cần phải đi đến quyết 11, và sau đó thực hiện rằng logic trao đổi. 1068 00:47:42,420 --> 00:47:45,580 >> Vì vậy, logic là như nhau, nhưng chúng ta cần một cách hơi khác nhau 1069 00:47:45,580 --> 00:47:47,160 truy xuất các biến. 1070 00:47:47,160 --> 00:47:52,400 Và như vậy cuối cùng, những gì Chương trình có để trông giống như là này. 1071 00:47:52,400 --> 00:47:56,610 Trong swap.c nghĩa đen sao chép và dán các phiên bản màu xanh lá cây. 1072 00:47:56,610 --> 00:47:58,450 Nhưng tôi cần phải thực hiện một sự thay đổi. 1073 00:47:58,450 --> 00:48:00,180 Nó không đủ chỉ để thay đổi swap. 1074 00:48:00,180 --> 00:48:03,830 Những dòng khác của mã tôi cần phải thay đổi? 1075 00:48:03,830 --> 00:48:04,330 Yeah? 1076 00:48:04,330 --> 00:48:05,770 >> Đung đâu phải mất các đối số. 1077 00:48:05,770 --> 00:48:07,603 >> DAVID J. Malan: ở đâu nó cần đối số của nó. 1078 00:48:07,603 --> 00:48:09,985 Vì vậy, nếu tôi di chuyển đến chính, tôi không thể chỉ qua trong x và y, 1079 00:48:09,985 --> 00:48:12,820 và, tôi hứa, người cuối cùng mảnh của cú pháp mới ngày hôm nay. 1080 00:48:12,820 --> 00:48:17,200 Tôi cần phải vượt qua trong không x và y nhưng địa chỉ của x và y. 1081 00:48:17,200 --> 00:48:20,400 Và hóa ra, biểu tượng mà các tác giả của C đã chọn 1082 00:48:20,400 --> 00:48:23,860 là nếu bạn sử dụng một dấu ở đây, không phải để bị nhầm lẫn với các ký hiệu phép toán, 1083 00:48:23,860 --> 00:48:27,130 nếu bạn sử dụng một dấu ở đây và một dấu ở đây, 1084 00:48:27,130 --> 00:48:29,570 con số này ra cho bạn, địa chỉ của x là gì, 1085 00:48:29,570 --> 00:48:31,740 có lẽ đó là 10, những gì là địa chỉ của y, có lẽ nó 1086 00:48:31,740 --> 00:48:35,400 11, và vượt qua những người thay thế. 1087 00:48:35,400 --> 00:48:37,210 >> Vì vậy, rất nhiều để hấp thụ tất cả cùng một lúc. 1088 00:48:37,210 --> 00:48:40,190 Nhưng chúng ta hãy nhìn thấy bây giờ nhanh chóng trong bốn phút còn lại của chúng tôi 1089 00:48:40,190 --> 00:48:42,150 nơi mà mọi thứ có thể đi xiên. 1090 00:48:42,150 --> 00:48:45,120 Và như một sang một bên, thực sự Tôi chụp bức ảnh này, 1091 00:48:45,120 --> 00:48:46,920 TF chụp bức ảnh này một hoặc hai năm trước. 1092 00:48:46,920 --> 00:48:49,190 Vì vậy, đây là góc sau của Eliot ăn Hall. 1093 00:48:49,190 --> 00:48:52,310 Con trỏ có lẽ là khó khăn nhất đề tài mà chúng ta trải trong CS50. 1094 00:48:52,310 --> 00:48:54,810 Vì vậy, nếu bạn lo lắng các loại dốc là như thể nó là 1095 00:48:54,810 --> 00:48:56,770 nhiều hơn một cây gậy hockey như thế này, nhận ra 1096 00:48:56,770 --> 00:49:00,160 chúng ta đang loại gần một đỉnh cao trong về sự phức tạp niệm. 1097 00:49:00,160 --> 00:49:02,300 >> Và tôi đưa lên này hình ảnh, bởi vì tôi thề 1098 00:49:02,300 --> 00:49:05,920 Trời, vào mùa thu năm 1996, khi tôi mất CS50 với giáo viên giảng dạy của tôi, 1099 00:49:05,920 --> 00:49:09,620 Nishat Mehta, ông bảo tôi ngồi xuống trong góc của Eliot D. Hội trường trong bữa ăn trưa, 1100 00:49:09,620 --> 00:49:12,330 hoặc ăn tối, hoặc một cái gì đó để thử để giúp tôi hiểu con trỏ. 1101 00:49:12,330 --> 00:49:16,520 Và đây là nơi mà tôi đã tuần sau nó đã được giới thiệu trong bài giảng khi 1102 00:49:16,520 --> 00:49:18,170 Cuối cùng tôi đã hiểu con trỏ. 1103 00:49:18,170 --> 00:49:20,590 Và tôi hy vọng rằng điều này sẽ nhấp nay sớm hơn cho bạn. 1104 00:49:20,590 --> 00:49:23,540 Nhưng nhận ra điều này hoàn toàn trong những chủ đề phức tạp hơn 1105 00:49:23,540 --> 00:49:24,420 chúng tôi đã giới. 1106 00:49:24,420 --> 00:49:25,819 Nhưng đó là một trong những mạnh nhất. 1107 00:49:25,819 --> 00:49:28,860 Và khi bạn nhận được nó, nó thực sự tất cả chỉ cần đi để cuối cùng đi với nhau. 1108 00:49:28,860 --> 00:49:31,460 Vì vậy, yên tâm nó không cần cho tất cả chìm trong ngày hôm nay. 1109 00:49:31,460 --> 00:49:32,980 >> Vì vậy, đây là chương trình cuối cùng chúng ta sẽ xem xét. 1110 00:49:32,980 --> 00:49:35,605 Và chúng ta sẽ kết thúc với một nhanh chóng ba phút của claymation 1111 00:49:35,605 --> 00:49:37,030 được thực hiện bởi người bạn của chúng tôi, Nick Parlante. 1112 00:49:37,030 --> 00:49:41,440 Dưới đây là một chương trình, mà trên đỉnh hai dòng khai báo một biến x và y. 1113 00:49:41,440 --> 00:49:44,780 Cả hai đều là các địa chỉ các số nguyên, AKA con trỏ. 1114 00:49:44,780 --> 00:49:48,125 Sau đó chúng tôi phân bổ đủ bộ nhớ để lưu trữ một int 1115 00:49:48,125 --> 00:49:51,344 và lưu trữ địa chỉ trong đó bộ nhớ trong x. 1116 00:49:51,344 --> 00:49:53,260 Vì vậy, nó thậm chí còn đơn giản hơn so với ví dụ trước. 1117 00:49:53,260 --> 00:49:56,100 Hãy cho tôi bốn byte của bộ nhớ, đó là kích thước của một int, 1118 00:49:56,100 --> 00:49:58,000 và đưa địa chỉ đó trong x. 1119 00:49:58,000 --> 00:50:01,070 Dòng này ở đây có nghĩa đi đến các địa chỉ trong x 1120 00:50:01,070 --> 00:50:05,270 và đưa ý nghĩa của cuộc sống, số 42 đó. 1121 00:50:05,270 --> 00:50:07,710 Nhưng dòng này làm tôi lo lắng. 1122 00:50:07,710 --> 00:50:12,620 Sao y có nghĩa là đi đến các địa chỉ trong y, và đưa số không may mắn 13 đó. 1123 00:50:12,620 --> 00:50:15,780 Tại sao là nó nguy hiểm, vào thời điểm này trong story-- mặc dù nói nhanh 1124 00:50:15,780 --> 00:50:17,980 trong vài phút suy yếu của chúng tôi here-- lý do tại sao nó là xấu 1125 00:50:17,980 --> 00:50:19,660 cho tôi để nói, đi đến các địa chỉ trong y? 1126 00:50:19,660 --> 00:50:21,077 >> Đung Bạn có không [không nghe được]. 1127 00:50:21,077 --> 00:50:22,910 DAVID J. Malan: Tôi có không đặt bất cứ điều gì trong y. 1128 00:50:22,910 --> 00:50:25,520 Vì vậy, giá trị của y là gì, vào thời điểm này trong câu chuyện? 1129 00:50:25,520 --> 00:50:26,570 Chúng tôi không có ý tưởng. 1130 00:50:26,570 --> 00:50:29,190 Đó là một số giá trị rác và cũng không Binky biết. 1131 00:50:29,190 --> 00:50:32,532 Nếu chúng ta có thể kết thúc vào ghi chú này. 1132 00:50:32,532 --> 00:50:34,832 >> [VIDEO PLAYBACK] 1133 00:50:34,832 --> 00:50:36,500 >> -Hey, Binky, thức dậy. 1134 00:50:36,500 --> 00:50:39,140 Đó là thời gian cho con trỏ của niềm vui. 1135 00:50:39,140 --> 00:50:40,210 >> -Cái gì thế? 1136 00:50:40,210 --> 00:50:41,690 Tìm hiểu về con trỏ? 1137 00:50:41,690 --> 00:50:43,570 Oh, hay qúa. 1138 00:50:43,570 --> 00:50:46,600 >> -Well, Để bắt đầu, tôi đoán chúng tôi sẽ cần một vài con trỏ. 1139 00:50:46,600 --> 00:50:47,380 >> -ĐƯỢC. 1140 00:50:47,380 --> 00:50:51,120 Mã này phân bổ hai con trỏ mà có thể trỏ đến số nguyên. 1141 00:50:51,120 --> 00:50:53,557 >> -Ok, Tôi cũng xem hai con trỏ, nhưng họ 1142 00:50:53,557 --> 00:50:55,140 dường như không được trỏ đến bất cứ điều gì. 1143 00:50:55,140 --> 00:50:55,970 >> -Đúng thế. 1144 00:50:55,970 --> 00:50:58,100 Ban đầu con trỏ không trỏ đến bất cứ điều gì. 1145 00:50:58,100 --> 00:51:00,950 Những điều chúng trỏ tới là gọi pointees và cài đặt chúng lên 1146 00:51:00,950 --> 00:51:02,330 là một bước riêng biệt. 1147 00:51:02,330 --> 00:51:03,210 >> -Oh, Phải, phải. 1148 00:51:03,210 --> 00:51:03,940 Tôi biết rằng. 1149 00:51:03,940 --> 00:51:05,730 Các pointees là riêng biệt. 1150 00:51:05,730 --> 00:51:08,310 Vì vậy, làm thế nào để bạn phân bổ một pointee? 1151 00:51:08,310 --> 00:51:11,960 >> -Ok, Tốt mã này giao đất một pointee nguyên mới, 1152 00:51:11,960 --> 00:51:15,050 và điều này bộ phần x để trỏ đến nó. 1153 00:51:15,050 --> 00:51:16,240 >> -Hey, Mà có vẻ tốt hơn. 1154 00:51:16,240 --> 00:51:17,743 Vì vậy, làm cho nó làm một cái gì đó. 1155 00:51:17,743 --> 00:51:23,580 >> -Ok, Tôi sẽ tới đích của con trỏ x để lưu trữ số 42 thành pointee của nó. 1156 00:51:23,580 --> 00:51:27,130 Đối với thủ thuật này, tôi sẽ cần tôi cây đũa thần của dereferencing. 1157 00:51:27,130 --> 00:51:30,200 >> -Website Của cây đũa thần của dereferencing? 1158 00:51:30,200 --> 00:51:32,310 Uh, rằng, đó là tuyệt vời. 1159 00:51:32,310 --> 00:51:34,270 >> -Đây Là những gì mã trông như thế nào. 1160 00:51:34,270 --> 00:51:35,970 Tôi sẽ chỉ cần thiết lập số và- 1161 00:51:35,970 --> 00:51:37,070 >> [POP SOUND] 1162 00:51:37,070 --> 00:51:39,140 >> -Hey, Tìm ở đó nó đi. 1163 00:51:39,140 --> 00:51:43,980 Vì vậy, làm một tới đích trên x sau mũi tên để truy cập pointee của nó. 1164 00:51:43,980 --> 00:51:46,150 Trong trường hợp này, để lưu trữ 42 trong đó. 1165 00:51:46,150 --> 00:51:50,700 Hey, hãy thử sử dụng nó để lưu trữ số 13 thông qua con trỏ khác, y. 1166 00:51:50,700 --> 00:51:51,840 >> -ĐƯỢC. 1167 00:51:51,840 --> 00:51:56,270 Tôi sẽ chỉ đi qua đây để y, và có được số 13 thiết lập. 1168 00:51:56,270 --> 00:52:00,380 Và sau đó lấy cây đũa phép của dereferencing và just-- 1169 00:52:00,380 --> 00:52:01,646 >> [BUZZER SOUND] 1170 00:52:01,646 --> 00:52:04,080 >> -Oh, Hey mà không làm việc. 1171 00:52:04,080 --> 00:52:06,470 Nói, uh, Binky, tôi không nghĩ dereferencing 1172 00:52:06,470 --> 00:52:10,850 y là một ý tưởng tốt, bởi vì thiết lập lên pointee là một bước riêng biệt. 1173 00:52:10,850 --> 00:52:12,480 Và tôi không nghĩ rằng chúng tôi đã làm nó. 1174 00:52:12,480 --> 00:52:14,620 >> -Hmm, Điểm tốt. 1175 00:52:14,620 --> 00:52:19,810 >> -Vâng, Chúng tôi phân bổ các con trỏ, y, nhưng chúng tôi không bao giờ cho nó trỏ đến một pointee. 1176 00:52:19,810 --> 00:52:21,590 >> -Hmm, Rất tinh ý. 1177 00:52:21,590 --> 00:52:23,215 -Hey, Bạn đang tìm kiếm tốt có, Binky. 1178 00:52:23,215 --> 00:52:26,390 Bạn có thể sửa chữa nó sao cho các điểm y đến pointee giống như x. 1179 00:52:26,390 --> 00:52:29,290 >> -Sure, Tôi sử dụng cây đũa thần của tôi của giao con trỏ. 1180 00:52:29,290 --> 00:52:31,970 >> -là Rằng sẽ là một vấn đề, như trước đây? 1181 00:52:31,970 --> 00:52:33,790 >> -Không, Điều này không chạm vào pointees. 1182 00:52:33,790 --> 00:52:35,840 Nó chỉ thay đổi một con trỏ để trỏ đến cùng thing-- 1183 00:52:35,840 --> 00:52:36,465 >> [Popping SOUND] 1184 00:52:36,465 --> 00:52:37,450 --as khác. 1185 00:52:37,450 --> 00:52:38,440 >> -À tôi hiểu rồi. 1186 00:52:38,440 --> 00:52:41,200 Bây giờ y điểm đến cùng một nơi như x. 1187 00:52:41,200 --> 00:52:42,950 Vì vậy, chờ đợi, bây giờ y là cố định. 1188 00:52:42,950 --> 00:52:44,110 Nó có một pointee. 1189 00:52:44,110 --> 00:52:47,779 Vì vậy, bạn có thể thử các cây đũa phép của dereferencing một lần nữa để gửi 13 hơn. 1190 00:52:47,779 --> 00:52:51,110 >> -Oh, OK, ở đây đi. 1191 00:52:51,110 --> 00:52:52,330 >> -Hey, Nhìn vào đó. 1192 00:52:52,330 --> 00:52:53,570 Bây giờ dereferencing công trình trên y. 1193 00:52:53,570 --> 00:52:57,900 Và bởi vì các con trỏ được chia sẻ rằng một pointee, cả hai đều 13 xem. 1194 00:52:57,900 --> 00:52:59,952 >> -Vâng, Chia sẻ, uh, bất cứ điều gì. 1195 00:52:59,952 --> 00:53:01,535 Vì vậy, chúng ta sẽ chuyển đổi địa điểm bây giờ? 1196 00:53:01,535 --> 00:53:03,730 >> -Oh, Nhìn chúng tôi ra khỏi thời gian. 1197 00:53:03,730 --> 00:53:04,660 >> -Nhưng-- 1198 00:53:04,660 --> 00:53:06,520 >> -Cũng Nhớ các quy tắc ba con trỏ. 1199 00:53:06,520 --> 00:53:09,550 Số 1, cấu trúc cơ bản là bạn có một con trỏ, 1200 00:53:09,550 --> 00:53:11,630 và nó chỉ qua một pointee. 1201 00:53:11,630 --> 00:53:13,740 Nhưng các con trỏ và pointee là riêng biệt. 1202 00:53:13,740 --> 00:53:15,620 Và những lỗi thường gặp là để thiết lập một con trỏ 1203 00:53:15,620 --> 00:53:18,000 nhưng để quên để cho nó một pointee. 1204 00:53:18,000 --> 00:53:21,170 >> Số 2, con trỏ dereferencing bắt đầu từ con trỏ 1205 00:53:21,170 --> 00:53:24,020 và sau mũi tên của nó trên để truy cập pointee của nó. 1206 00:53:24,020 --> 00:53:27,815 Như chúng ta đều biết, điều này chỉ hoạt động nếu có là một pointee, trong đó loại được trở lại 1207 00:53:27,815 --> 00:53:29,260 để loại trừ số 1. 1208 00:53:29,260 --> 00:53:31,990 >> Số 3, con trỏ chuyển nhượng mất một con trỏ 1209 00:53:31,990 --> 00:53:35,330 và thay đổi nó để trỏ đến cùng pointee như một con trỏ. 1210 00:53:35,330 --> 00:53:37,150 Vì vậy, sau khi chuyển nhượng, hai con trỏ 1211 00:53:37,150 --> 00:53:40,927 sẽ trỏ đến pointee cùng, đôi khi đó được gọi là chia sẻ. 1212 00:53:40,927 --> 00:53:42,510 Và đó là tất cả để có nó, thực sự. 1213 00:53:42,510 --> 00:53:43,130 Bye-bye bây giờ. 1214 00:53:43,130 --> 00:53:43,475 >> [END PLAYBACK] 1215 00:53:43,475 --> 00:53:44,830 >> DAVID J. Malan: Đó là nó cho CS50. 1216 00:53:44,830 --> 00:53:46,246 Nhờ giáo sư Nick Parlante. 1217 00:53:46,246 --> 00:53:47,730 Chúng tôi sẽ gặp bạn vào tuần tới. 1218 00:53:47,730 --> 00:53:51,706 1219 00:53:51,706 --> 00:53:56,435 >> [ELECTRONIC MUSIC CHƠI] 1220 00:53:56,435 --> 00:57:22,775