1 00:00:00,000 --> 00:00:02,310 [Powered by Google Translate] [Tuần 4, Tiếp tục] 2 00:00:02,310 --> 00:00:04,240 [David J. Malan - Đại học Harvard 3 00:00:04,240 --> 00:00:07,290 [Đây là CS50. - CS50.TV] 4 00:00:07,290 --> 00:00:11,290 >> Đây là CS50, và đây là kết thúc của tuần thứ 4. 5 00:00:11,290 --> 00:00:14,030 Vì vậy, một số tin tốt và một số tin tức xấu. 6 00:00:14,030 --> 00:00:26,240 Không có bài giảng Thứ hai, không có vấn đề thiết lập tuần tới. [Sinh viên cổ vũ] 7 00:00:26,240 --> 00:00:28,680 Bạn sẽ không thích nơi này là đi. 8 00:00:28,680 --> 00:00:31,590 Nhưng chúng ta không có điều này thay vì thứ tư tới, 9 00:00:31,590 --> 00:00:37,740 và đó cũng là mỗi bài giảng giáo trình 1 thứ Sáu vào thứ sáu tới để chúng tôi có thể ở lại theo dõi. 10 00:00:37,740 --> 00:00:40,580 Nhưng tất cả mọi thứ sẽ được quay như thường lệ, do đó, không phải lo lắng. 11 00:00:40,580 --> 00:00:44,100 >> Và đối với bài kiểm tra 0 những gì chúng tôi sẽ làm đến cuối tuần 12 00:00:44,100 --> 00:00:47,140 được đăng bài trên cs50.net trang chủ của khóa học một lời giải thích 13 00:00:47,140 --> 00:00:50,160 bạn cần phải có những gì sắp xếp của những kỳ vọng khi nói đến các bài kiểm tra đầu tiên. 14 00:00:50,160 --> 00:00:55,100 Nói chung, nó sẽ có nhiều lựa chọn, đúng-sai, câu trả lời ngắn gọn, các vấn đề mã hóa ngắn. 15 00:00:55,100 --> 00:00:57,360 Bạn sẽ không được dự kiến ​​sẽ thực hiện tương đương 16 00:00:57,360 --> 00:01:00,030 một vấn đề mà bạn sẽ thấy trên pset một, mà bạn có một máy tính 17 00:01:00,030 --> 00:01:03,240 một trình gỡ lỗi và như thế, nhưng sẽ có một vấn đề nhỏ mã hóa. 18 00:01:03,240 --> 00:01:06,900 >> Và quả thực, hướng dẫn tốt nhất để có được một cảm giác về những gì CS50 câu đố giống như 19 00:01:06,900 --> 00:01:09,180 là đi đến cs50.net, đi đến liên kết Quizzes, 20 00:01:09,180 --> 00:01:11,920 và bạn có thể nhìn thấy trong nhiều năm qua giá trị của các câu đố. 21 00:01:11,920 --> 00:01:16,600 Chỉ cần nhận ra rằng chương trình giảng dạy đã không luôn luôn như vậy trong những năm qua. 22 00:01:16,600 --> 00:01:18,510 Đôi khi chúng ta thêm, đôi khi trừ đi, 23 00:01:18,510 --> 00:01:20,670 vì vậy nếu bạn nhìn thấy một số chủ đề trên một tuổi những câu đố 24 00:01:20,670 --> 00:01:25,380 rằng bạn không có ý tưởng những gì nó nói về, nó hoặc là chúng tôi đã bao gồm nó 25 00:01:25,380 --> 00:01:27,210 hoặc là chúng tôi không bao gồm nó. 26 00:01:27,210 --> 00:01:31,110 Tuy nhiên, trong các hình thức đánh giá, chủ nhật tuần này, Thứ hai, và thứ ba 27 00:01:31,110 --> 00:01:34,770 cũng như một khóa học toàn phiên xem xét vào đêm chủ nhật - 28 00:01:34,770 --> 00:01:37,500 thời gian và địa điểm sẽ được công bố trên trang chủ của khóa học - 29 00:01:37,500 --> 00:01:40,120 tất cả các bạn có một cơ hội để xem xét với các nghiên cứu sinh giảng dạy của khóa học 30 00:01:40,120 --> 00:01:44,830 tài liệu cho năm nay, trong phần và như là một lớp học đầy đủ, 31 00:01:44,830 --> 00:01:48,400 và những người sẽ được quay như bình thường là tốt. 32 00:01:48,400 --> 00:01:53,380 >> Được rồi. Vì vậy, không có thêm ado, một bình luận về thông qua / không và thêm / thả. 33 00:01:53,380 --> 00:01:57,980 Bạn có thể đã nhìn thấy ghi chú của tôi đêm qua, và điều này là thực sự chỉ là một số bảo đảm bổ sung 34 00:01:57,980 --> 00:02:01,250 rằng nếu bạn là một trong những người đặc biệt ít thoải mái hoặc một nơi nào đó ở giữa 35 00:02:01,250 --> 00:02:04,870 và bạn đang cảm thấy chỉ cần một chút trên đầu của bạn, 36 00:02:04,870 --> 00:02:08,430 nhận ra đó thực sự là hoàn toàn bình thường, và có một cấu trúc hỗ trợ phong phú tại chỗ, 37 00:02:08,430 --> 00:02:13,530 một trong số đó giờ hành chính là có ý định cải thiện hơn một đêm cuối cùng của tôi email, 38 00:02:13,530 --> 00:02:16,520 và nhận ra quá mà một tùy chọn như vượt qua / không cho một lớp học như thế này 39 00:02:16,520 --> 00:02:21,540 thực sự có ý nghĩa như một cơ chế để giúp bạn bắt tắt của một khóa học như thế này, 40 00:02:21,540 --> 00:02:24,200 để một lần nữa nếu bạn đang chi tiêu những người 10, 15, 20 giờ 41 00:02:24,200 --> 00:02:28,160 chỉ cần cố gắng để có được một số pset để làm việc và bạn biết bạn 90-95% số đường có 42 00:02:28,160 --> 00:02:32,100 nhưng bạn không thể tìm thấy một số lỗi damn, vượt qua một / không mô hình đó là sắp xếp của không sao. 43 00:02:32,100 --> 00:02:36,230 >> Ý tưởng là với cơ chế đó, sau đó bạn có thể đi tập trung trên psets khác của bạn 44 00:02:36,230 --> 00:02:39,530 hoặc ngủ hoặc bất cứ điều gì nó là bạn muốn tập trung vào. 45 00:02:39,530 --> 00:02:43,390 Vì vậy, nhận ra rằng bạn có cho đến thứ ba này tới kỹ thuật thứ hai 5, 46 00:02:43,390 --> 00:02:50,840 nhưng đó là một kỳ nghỉ, vì vậy thứ ba này tới - để chuyển đổi từ đường chuyền / không được phân loại hoặc ngược lại. 47 00:02:50,840 --> 00:02:54,450 Và nếu bạn thực sự trên các vách và đang nghĩ đến việc bỏ hoàn toàn, 48 00:02:54,450 --> 00:02:56,440 xin vui lòng bắt tôi sau khi bài giảng hoặc thả cho tôi một lưu ý. 49 00:02:56,440 --> 00:02:59,990 Chúng tôi rất muốn ít nhất là trò chuyện trước khi bạn đặt giá thầu lời nói sáo rỗng. 50 00:02:59,990 --> 00:03:03,470 Được rồi. Vì vậy, chúng tôi bắt đầu tham gia các bánh xe đào tạo ra thời gian qua. 51 00:03:03,470 --> 00:03:06,030 Đặc biệt, chúng tôi tập trung vào chuỗi. 52 00:03:06,030 --> 00:03:09,740 String là một cái gì đó là tuyên bố trong thư viện CS50, 53 00:03:09,740 --> 00:03:14,340 đặc biệt trong tập tin đó được gọi là cs50.h mà chúng ta sẽ bắt đầu nhìn vào tuần này và tiếp theo. 54 00:03:14,340 --> 00:03:17,250 Nhưng chuỗi thực sự chỉ là một đơn giản hóa một cái gì đó 55 00:03:17,250 --> 00:03:20,980 đó là một chút hơn arcanely mô tả như là char *. 56 00:03:20,980 --> 00:03:24,090 Char chúng ta đã quen thuộc với. Nó chỉ là một nhân vật duy nhất. 57 00:03:24,090 --> 00:03:28,010 Nhưng * thứ hai biểu thị những gì? >> [Sinh viên] Một con trỏ. 58 00:03:28,010 --> 00:03:31,290 Một con trỏ. Và một con trỏ là những gì? >> [Sinh viên] Một địa chỉ. 59 00:03:31,290 --> 00:03:33,420 >> Nó giống như một địa chỉ, một vị trí trong bộ nhớ. 60 00:03:33,420 --> 00:03:35,910 Một địa chỉ hoặc vị trí bộ nhớ hoặc là gì? 61 00:03:35,910 --> 00:03:40,290 Một lần nữa, tất cả chúng ta có máy tính xách tay với một buổi biểu diễn hoặc 2 GB RAM nhiều khả năng những ngày này, 62 00:03:40,290 --> 00:03:44,160 và điều đó có nghĩa là bạn có một tỷ hoặc 2 tỷ byte giá trị của bộ nhớ. 63 00:03:44,160 --> 00:03:46,240 Và nó không thực sự có vấn đề gì về thể chất có vẻ như, 64 00:03:46,240 --> 00:03:51,220 nhưng trên đức tin mà bạn có thể đếm tất cả các byte cá nhân máy tính xách tay của bạn có - 65 00:03:51,220 --> 00:03:54,580 điều này là byte 0, đây là 1 byte, đây là byte 2 tỷ - 66 00:03:54,580 --> 00:03:56,100 và đó là chính xác những gì một máy tính nào. 67 00:03:56,100 --> 00:04:00,030 Khi bạn phân bổ không gian cho một nhân vật duy nhất, ví dụ, 68 00:04:00,030 --> 00:04:02,480 rõ ràng là nó phải sống ở một nơi nào đó trong bộ nhớ của máy tính của bạn, 69 00:04:02,480 --> 00:04:05,860 và có lẽ đó là số byte 12.345, 70 00:04:05,860 --> 00:04:08,470 và đó là một nơi nào đó ở đây trong bộ nhớ máy tính của bạn. 71 00:04:08,470 --> 00:04:12,630 Và địa chỉ của nhân vật đó là 12345. 72 00:04:12,630 --> 00:04:16,140 >> Bây giờ, trong tuần 0 thông qua vậy, đến nay, chúng tôi đã không thực sự quan tâm 73 00:04:16,140 --> 00:04:19,170 nơi mà trong những điều bộ nhớ được lưu trữ bởi vì chúng ta thường sử dụng các biểu tượng, 74 00:04:19,170 --> 00:04:22,540 biến, và mảng để thực sự có được dữ liệu của chúng tôi. 75 00:04:22,540 --> 00:04:24,950 Nhưng vào thứ hai và hơn cả ngày hôm nay, bạn sẽ có 76 00:04:24,950 --> 00:04:27,710 tất cả các khả năng biểu cảm hơn với các chương trình bằng văn bản 77 00:04:27,710 --> 00:04:31,330 để thực sự thao tác bộ nhớ của máy vi tính tuy nhiên bạn thấy phù hợp, 78 00:04:31,330 --> 00:04:33,720 cho cả hai mục đích tốt và xấu, 79 00:04:33,720 --> 00:04:39,620 lỗi là một kết quả rất phổ biến vào thời điểm này trong việc học những thứ này. 80 00:04:39,620 --> 00:04:42,460 Tuy nhiên, những gì thực sự có ý nghĩa là một char *? 81 00:04:42,460 --> 00:04:46,140 Hãy cho đi trước trở lại và chúng tôi sẽ trở lại Binky như đã hứa hôm nay. 82 00:04:46,140 --> 00:04:48,670 Chúng ta hãy đi vào một ví dụ đơn giản ở đây. 83 00:04:48,670 --> 00:04:53,060 Hãy để tôi lưu tập tin này là compare.c, và hãy để tôi chỉ nhận được một số mẫu mã ở đây 84 00:04:53,060 --> 00:05:00,490 trên bao gồm stdio.h, hãy để tôi cũng có thể cung cấp cho bản thân mình bao gồm cs50.h. Tôi sẽ phóng to lên đó. 85 00:05:00,490 --> 00:05:05,850 Hãy để tôi bắt đầu viết int main, main (void), và bây giờ tôi muốn làm một cái gì đó như thế này: 86 00:05:05,850 --> 00:05:13,520 printf ("Hãy cho tôi một chuỗi:") và sau đó tôi sẽ sử dụng chuỗi s được getString 87 00:05:13,520 --> 00:05:16,750 để có được một chuỗi từ người dùng, sau đó tôi sẽ yêu cầu người dùng cho một số khác. 88 00:05:16,750 --> 00:05:21,870 ("Hãy cho tôi một chuỗi:") và tôi sẽ yêu cầu họ thông qua getString để có được điều đó. 89 00:05:21,870 --> 00:05:27,020 Tôi sẽ gọi nó t vì t đi kèm sau và là một tên tốt đẹp cho một chuỗi nếu nó là khá chung chung. 90 00:05:27,020 --> 00:05:30,030 Vì vậy, GetString, và bây giờ tôi chỉ muốn làm một kiểm tra sự tỉnh táo và tôi sẽ nói 91 00:05:30,030 --> 00:05:39,770 if (s == t) sau đó tôi là chỉ cần nói cho người dùng printf ("Bạn gõ những điều tương tự \ n"); 92 00:05:39,770 --> 00:05:45,520 khác tôi sẽ in ra một cái gì đó như thế ("Bạn gõ một cái gì đó khác nhau \ n!") 93 00:05:45,520 --> 00:05:48,460 hoặc bất cứ câu sẽ được. Vì vậy, một cái gì đó như thế. 94 00:05:48,460 --> 00:05:52,200 Sau đó, như thường lệ, tôi sẽ trở về 0 mà chỉ có nghĩa rằng không có gì xấu xảy ra, 95 00:05:52,200 --> 00:05:54,400 và tôi sẽ đi trước và biên dịch và chạy chương trình này. 96 00:05:54,400 --> 00:05:56,540 >> Tuy nhiên, hôm chúng tôi chạy chương trình này, 97 00:05:56,540 --> 00:06:00,420 và thực sự đã nói rằng Hello là không Hello và GOODBYE là không GOODBYE. 98 00:06:00,420 --> 00:06:03,140 Các hành vi chúng ta nhìn thấy nhiều hơn một chút như thế này. 99 00:06:03,140 --> 00:06:11,450 Hãy để tôi đi vào thư mục nguồn của tôi, zoom ở đây, và chúng ta hãy làm làm so sánh. 100 00:06:11,450 --> 00:06:14,570 Tổng hợp okay. Cho phép tôi chạy so sánh. Hãy cho tôi một chuỗi: HELLO. 101 00:06:14,570 --> 00:06:16,300 Hãy cho tôi một chuỗi: HELLO. 102 00:06:16,300 --> 00:06:18,000 Bạn đã gõ một cái gì đó khác nhau! 103 00:06:18,000 --> 00:06:22,650 Vâng, hãy để tôi thử một cái gì đó đơn giản như 50, 50. Bạn đã gõ một cái gì đó khác nhau! 104 00:06:22,650 --> 00:06:25,740 hi, hi. Vì vậy, rõ ràng, một cái gì đó đang xảy ra ở đây. 105 00:06:25,740 --> 00:06:28,440 Tuy nhiên, lời giải thích cho lý do tại sao là gì? 106 00:06:28,440 --> 00:06:33,850 Rõ ràng, dòng 12 là hoàn toàn rối loạn chức năng. 107 00:06:34,300 --> 00:06:39,430 Vấn đề cơ bản ở đây là gì? Yeah. >> [Sinh viên] so sánh các địa chỉ. 108 00:06:39,430 --> 00:06:41,850 Yeah, chính xác. Nó thực sự so sánh các địa chỉ 109 00:06:41,850 --> 00:06:44,580 trong đó Hello Hello được lưu trữ. 110 00:06:44,580 --> 00:06:48,290 Nó không phải so sánh các chữ cái Hello một lần nữa và một lần nữa, 111 00:06:48,290 --> 00:06:52,370 bởi vì những gì đang thực sự xảy ra, tất cả thời gian này, chúng tôi đã được sử dụng GetString - 112 00:06:52,370 --> 00:06:56,130 Bảng đen Đây lại là bộ nhớ máy tính của chúng tôi, 113 00:06:56,130 --> 00:07:00,100 và chúng ta hãy nói rằng tôi gọi GetString sau khi khai báo một biến s. 114 00:07:00,100 --> 00:07:01,930 Bộ nhớ của tôi trông như thế nào? 115 00:07:01,930 --> 00:07:07,070 Hãy tự ý nói đó là trông như thế này. Đó là một hình vuông. 116 00:07:07,070 --> 00:07:09,040 Và khá nhiều bất kỳ thời gian tôi đã rút ra một mảnh bộ nhớ trên màn hình 117 00:07:09,040 --> 00:07:12,860 nếu nó là 32 bit đã vẽ hình vuông như thế này bởi vì thực sự trong thiết bị, 118 00:07:12,860 --> 00:07:17,380 một con trỏ, một địa chỉ, là 32 bit. Nó giống như một int. 119 00:07:17,380 --> 00:07:19,420 Điều đó có thể khác nhau dựa trên hệ thống máy tính. 120 00:07:19,420 --> 00:07:24,630 Những người bạn của những người quen quen với thực tế rằng Mac hoặc máy PC của bạn là 64 bit, 121 00:07:24,630 --> 00:07:28,120 mà thực sự biểu thị rằng máy tính của bạn bằng cách sử dụng 64-bit con trỏ, 122 00:07:28,120 --> 00:07:33,730 Địa chỉ 64-bit, và trong số những mặt tích cực đó là máy tính của bạn 123 00:07:33,730 --> 00:07:35,560 có thể có bộ nhớ RAM nhiều hơn xưa đã. 124 00:07:35,560 --> 00:07:39,240 Long câu chuyện ngắn, trở lại trong ngày khi máy tính chỉ được sử dụng 32 bit 125 00:07:39,240 --> 00:07:42,740 để đại diện cho địa chỉ, số lượng lớn nhất của byte, bạn có thể đại diện cho 126 00:07:42,740 --> 00:07:46,280 trong trường hợp đó là những gì nếu bạn có 32 bit? 127 00:07:46,280 --> 00:07:49,590 Vì vậy, 4 tỷ đồng, đúng, bởi vì 2 đến số 32 là 4 tỷ đồng. 128 00:07:49,590 --> 00:07:51,370 Con số này đã được tái diễn trong khóa học. 129 00:07:51,370 --> 00:07:55,240 >> Vì vậy, nếu bạn chỉ có 32 bit, số lượng cao nhất bạn có thể đếm đến khoảng 4 tỷ đồng. 130 00:07:55,240 --> 00:07:58,750 Nhưng đó là một hạn chế cơ bản của máy tính cho đến khi một vài năm trước đây 131 00:07:58,750 --> 00:08:01,180 bởi vì nếu bạn chỉ có thể tính là cao là 4 tỷ đồng, 132 00:08:01,180 --> 00:08:05,270 nó không quan trọng nếu bạn mua 8 GB RAM hoặc thậm chí 5 GB RAM; 133 00:08:05,270 --> 00:08:07,780 bạn không thể đếm là cao, do đó, nó là vô ích. 134 00:08:07,780 --> 00:08:11,430 Bạn chỉ có thể truy cập vào 3 hoặc 4 GB đầu tiên của bộ nhớ máy tính của bạn. 135 00:08:11,430 --> 00:08:14,410 Đó là ít hơn của một vấn đề bây giờ, và bạn có thể mua MacBook Pros và Dells 136 00:08:14,410 --> 00:08:17,680 với 8 GB RAM hoặc nhiều hơn những ngày này. 137 00:08:17,680 --> 00:08:24,100 Nhưng nếu tôi phân bổ khá đơn giản trong chương trình này một con trỏ, một con trỏ được gọi là s, 138 00:08:24,100 --> 00:08:28,370 nó có thể trông như thế này trên màn hình vì thực sự chúng ta cần phải vỏ trở lại lớp này. 139 00:08:28,370 --> 00:08:33,520 Tôi tiếp tục chuỗi nói, nhưng thứ Hai, chuỗi thực sự là char *, 140 00:08:33,520 --> 00:08:35,590 địa chỉ của một số nhân vật. 141 00:08:35,590 --> 00:08:39,280 Vì vậy, hãy đi mà bánh xe đào tạo ra mặc dù chúng ta sẽ tiếp tục sử dụng GetString cho bây giờ. 142 00:08:39,280 --> 00:08:42,600 Vì vậy, tôi đã khai báo, và đây là một đoạn bộ nhớ, 32 bit. 143 00:08:42,600 --> 00:08:47,370 Gì ở đây trong bộ nhớ mặc định? >> [Không nghe được sinh viên phản ứng] 144 00:08:47,370 --> 00:08:50,040 Đó là những gì? >> [Sinh viên] Garbage. >> Xe rác. Chính xác. 145 00:08:50,040 --> 00:08:54,610 Nếu bạn lập trình viên không đặt một giá trị trong một biến, ai biết nó là gì? 146 00:08:54,610 --> 00:08:57,990 Đôi khi bạn nhận được may mắn và nó là 0, là loại một giá trị mặc định tốt đẹp, sạch sẽ, 147 00:08:57,990 --> 00:09:00,310 nhưng như chúng ta đã thấy Thứ hai, đôi khi nó là hoàn toàn vô nghia, 148 00:09:00,310 --> 00:09:04,130 một số tích cực hay tiêu cực thực sự lớn số đó đến từ đâu? 149 00:09:05,350 --> 00:09:07,010 Yeah. >> [Sinh viên] chức năng trước khi. >> Yeah. 150 00:09:07,010 --> 00:09:10,170 >> Thường thì các chức năng đã được gọi trước đó vì nhớ, 151 00:09:10,170 --> 00:09:13,920 như bạn gọi chức năng trong bộ nhớ, họ mất nhiều không gian hơn và nhiều hơn nữa từ dưới lên, 152 00:09:13,920 --> 00:09:17,040 và ngay sau khi trở về chức năng, bộ nhớ mà được tái sử dụng 153 00:09:17,040 --> 00:09:20,890 bởi các chàng tiếp theo đó được gọi là, những người đang sử dụng lát cùng một bộ nhớ của bạn. 154 00:09:20,890 --> 00:09:23,450 Và nếu bạn đã rác bên trái có giá trị trước đó, 155 00:09:23,450 --> 00:09:28,190 chúng ta có thể nhầm lẫn s là có một số giá trị khi thực sự chúng tôi đã không đặt bất cứ điều gì có. 156 00:09:28,190 --> 00:09:30,960 Vì vậy, bộ nhớ RAM của chúng tôi tại thời điểm này trông như thế này. 157 00:09:30,960 --> 00:09:36,030 Bây giờ ở phía bên tay phải của dòng 7, chúng tôi đang gọi điện thoại GetString, 158 00:09:36,030 --> 00:09:40,150 mà chúng tôi đã làm bây giờ trong nhiều tuần, nhưng những gì được getString thực sự làm? 159 00:09:40,150 --> 00:09:43,350 GetString được viết bởi các nhân viên CS50 là một chút thông minh 160 00:09:43,350 --> 00:09:46,500 rằng ngay sau khi người dùng bắt đầu các phím gõ và số truy cập Nhập 161 00:09:46,500 --> 00:09:50,010 GetString con số bao nhiêu tổ hợp phím đã bị người dùng, 162 00:09:50,010 --> 00:09:53,360 bao nhiêu nhân vật cần phải phân bổ cho bộ nhớ RAM. 163 00:09:53,360 --> 00:09:55,660 Và nơi RAM mà đến từ những người hiểu biết? 164 00:09:55,660 --> 00:09:58,930 Đó là một nơi nào đó trong máy tính của bạn 2 GB hoặc whatnot bộ nhớ. 165 00:09:58,930 --> 00:10:05,200 Nhưng chúng ta hãy giả sử rằng máy tính tìm thấy không gian cho từ Hello ngay tại đây. 166 00:10:05,200 --> 00:10:08,710 Từ tôi đã nhập là H-E-L-L-O. 167 00:10:08,710 --> 00:10:13,510 Và nếu chúng ta rút ra điều này như là một chuỗi ký tự, chúng ta có thể rút ra nó như thế này. 168 00:10:13,510 --> 00:10:17,860 Nhưng tôi cần phải làm thêm 1 điều. Những gì thuộc về vào cuối của bất kỳ chuỗi trong C? 169 00:10:17,860 --> 00:10:20,710 Các ký tự null, mà chúng tôi viết là \ 0. 170 00:10:20,710 --> 00:10:23,980 Đó là kỹ thuật số 0, nhưng các dấu gạch chéo ngược làm cho tất cả các rõ ràng hơn 171 00:10:23,980 --> 00:10:28,150 rằng điều này có nghĩa là số 0, số nguyên 0; 172 00:10:28,150 --> 00:10:32,440 nó không phải, cho 0 dụ quote-unquote, mà bạn có thể gõ vào bàn phím. 173 00:10:32,440 --> 00:10:33,940 Vì vậy, đây là HELLO. 174 00:10:33,940 --> 00:10:36,350 >> Và chúng tôi đã nói vào hôm thứ Hai rằng một chức năng như GetString 175 00:10:36,350 --> 00:10:39,580 thực sự là trả lại tất cả những tuần lễ? 176 00:10:39,580 --> 00:10:43,960 Nó không phải trả lại một chuỗi cho mỗi gia nhập, vì điều đó không thực sự có ý nghĩa 177 00:10:43,960 --> 00:10:47,710 vì chuỗi không tồn tại. Họ sắp xếp của một sự bịa đặt trong thư viện CS50. 178 00:10:47,710 --> 00:10:51,300 Điều gì thực sự là một chuỗi, kỹ thuật hơn? >> [Sinh viên] Đó là ký tự đầu tiên. 179 00:10:51,300 --> 00:10:55,950 Chính xác. Nó khá đơn giản chỉ là địa chỉ của ký tự đầu tiên mà người dùng gõ vào. 180 00:10:55,950 --> 00:11:02,810 Vì vậy, nếu từ ngữ của tôi Hello kết thúc nó tại 123 số byte và sau đó tại số byte 124, 181 00:11:02,810 --> 00:11:08,320 125, 126, và vân vân, nếu tôi chỉ số byte của tôi từ 0 trở lên, 182 00:11:08,320 --> 00:11:12,650 những gì thực sự GetString đang quay trở lại có nghĩa là số 123 số. 183 00:11:12,650 --> 00:11:19,270 Vì vậy, những gì được đặt vào s là số 123 số, không phải H với doanh nghiệp, không phải là từ HELLO, 184 00:11:19,270 --> 00:11:23,130 khá đơn giản địa chỉ mà tôi có thể tìm thấy những chữ cái đầu tiên của Hello. 185 00:11:23,130 --> 00:11:26,500 Nhưng điều đó không có vẻ như đủ. Tôi hỏi bạn cho một chuỗi, không phải là một nhân vật. 186 00:11:26,500 --> 00:11:32,970 Vì vậy, làm thế nào để chúng ta hoặc máy tính biết rằng ello loại đi cùng với H? 187 00:11:35,760 --> 00:11:37,460 Các loại thỏa thuận mà chúng ta có là gì? Yeah. 188 00:11:37,460 --> 00:11:40,100 [Sinh viên] Nó giữ nói cho chính nó để tìm các ký tự một số chi tiết. >> Chính xác. 189 00:11:40,100 --> 00:11:44,570 >> Có quy ước của con người-máy tính, theo đó khi bạn đang đối phó với chuỗi, 190 00:11:44,570 --> 00:11:49,410 nếu không được biết đến tại sao char, bạn chỉ cần có để tìm ra 191 00:11:49,410 --> 00:11:54,350 nơi kết thúc của tất cả các chuỗi trong cuộc sống là thực sự chỉ iterating trên nó với một vòng lặp for, 192 00:11:54,350 --> 00:11:57,820 một vòng lặp trong khi, bất cứ điều gì, để khi bạn tìm thấy những kết thúc của chuỗi 193 00:11:57,820 --> 00:12:02,160 bây giờ bạn có thể suy ra từ đó, oh, toàn bộ từ HELLO. 194 00:12:02,160 --> 00:12:04,820 Những người bạn có kinh nghiệm lập trình trước có thể biết trong Java 195 00:12:04,820 --> 00:12:09,880 bạn chỉ có thể gọi chiều dài và các ngôn ngữ khác, bạn có thể gọi chiều dài hoặc tương tự. 196 00:12:09,880 --> 00:12:14,060 Đó là bởi vì trong rất nhiều ngôn ngữ, đặc biệt là điều được gọi là ngôn ngữ hướng đối tượng, 197 00:12:14,060 --> 00:12:18,580 chiều dài của một cái gì đó là loại bên trong đóng gói các mảnh dữ liệu chính nó, 198 00:12:18,580 --> 00:12:24,000 nhiều như chúng tôi ID đóng gói và tên, nhà bên trong của một sinh viên vào hôm thứ Hai. 199 00:12:24,000 --> 00:12:28,700 Tuy nhiên, C là mức độ thấp hơn nhiều. Không có đối tượng hoặc các lớp học, nếu bạn đã nghe những điều khoản trước khi. 200 00:12:28,700 --> 00:12:31,490 Tất cả bạn phải thực sự là địa chỉ bộ nhớ. 201 00:12:31,490 --> 00:12:35,540 Vì vậy, đây là loại theo cách cũ thời đại diện cho cấu trúc dữ liệu thú vị. 202 00:12:35,540 --> 00:12:38,760 Bạn có một giá trị bắt đầu giống như địa chỉ của ký tự đầu tiên 203 00:12:38,760 --> 00:12:42,340 và sau đó chỉ cần một số quy ước tùy ý mà tất cả mọi người đồng ý làm theo. 204 00:12:42,340 --> 00:12:46,420 Vì vậy, làm thế nào là chuỗi dài thực hiện, chúng tôi đề xuất? 205 00:12:46,420 --> 00:12:51,360 Strlen, strlen, mà một số bạn đã sử dụng một vài lần. Nó khá đơn giản, phải không? 206 00:12:51,360 --> 00:12:53,060 Nó giống như 2 dòng mã. 207 00:12:53,060 --> 00:12:56,140 Đó là khá nhiều một vòng lặp của một số loại, có thể với một biến địa phương bổ sung. 208 00:12:56,140 --> 00:13:00,540 Nhưng strlen chỉ để có một con trỏ và sau đó bắt đầu tìm kiếm cho \ 0. 209 00:13:00,540 --> 00:13:05,190 >> Và ngay sau khi nó tìm thấy nó, nó có thể trả lại tổng số bước thực hiện trong chuỗi đó. 210 00:13:05,190 --> 00:13:07,150 Vì vậy, chúng ta có thể suy ra từ những gì diễn ra tiếp theo. 211 00:13:07,150 --> 00:13:11,850 Giả sử sau đó tôi tuyên bố t như tôi đã làm trong dòng 10. 212 00:13:11,850 --> 00:13:14,280 Đây là một số giá trị rác. Ai biết tại đầu tiên? 213 00:13:14,280 --> 00:13:18,490 Tuy nhiên, ở phía bên tay phải của dòng 10 tôi gọi getString một lần nữa. 214 00:13:18,490 --> 00:13:20,050 Ai biết nơi này kết thúc? 215 00:13:20,050 --> 00:13:23,830 Hãy tùy tiện nói rằng hệ điều hành tìm thấy chỗ cho nó theo cách trên đây. 216 00:13:23,830 --> 00:13:28,610 Tôi xảy ra tình cờ gõ H-E-L-L-O một lần nữa, 217 00:13:28,610 --> 00:13:31,260 và như vậy chúng ta có thể rút ra cùng một loại hình ảnh. 218 00:13:31,260 --> 00:13:34,290 Tuy nhiên, thực tế là tôi đã vẽ lại hình ảnh này là có chủ ý 219 00:13:34,290 --> 00:13:37,720 bởi vì đó là khác nhau hơn so với một trong những điều này. 220 00:13:37,720 --> 00:13:43,920 Vì vậy, đây có thể là vị trí 456, 457, và vv. 221 00:13:43,920 --> 00:13:47,170 Vì vậy, những gì được đặt dấu hỏi một lần? 222 00:13:47,170 --> 00:13:50,190 Trong trường hợp này là 456. 223 00:13:50,190 --> 00:13:53,540 Chúng tôi đang chọn những con số tùy tiện bởi vì thực sự sau ngày hôm nay 224 00:13:53,540 --> 00:13:57,110 chúng tôi sẽ không quan tâm quá nhiều về những gì các địa chỉ của bất cứ điều gì. 225 00:13:57,110 --> 00:14:02,690 Tất cả những gì chúng tôi quan tâm là chúng ta có thể tìm ra địa chỉ của một số phần dữ liệu như Hello. 226 00:14:02,690 --> 00:14:07,100 >> Vì vậy, thực sự những gì hầu hết mọi người làm trong lĩnh vực khoa học máy tính khi nói về các địa chỉ bộ nhớ 227 00:14:07,100 --> 00:14:10,210 và nói chuyện về con trỏ đặc biệt, 228 00:14:10,210 --> 00:14:14,220 chứ không phải bận tâm để tìm ra 123 - những người quan tâm công cụ này thực sự là, 229 00:14:14,220 --> 00:14:17,440 chúng tôi chỉ biết rằng đó là tại một số địa chỉ số 230 00:14:17,440 --> 00:14:22,180 chúng ta đơn giản hóa trên thế giới và chỉ nói rằng s chỉ nhân vật đó 231 00:14:22,180 --> 00:14:25,080 và t chỉ nhân vật đó. 232 00:14:25,080 --> 00:14:27,430 Và thực tế là nó là một mũi tên khá cố ý 233 00:14:27,430 --> 00:14:31,610 vì nghĩa đen tại s chỉ vào H và t chỉ tại H khác 234 00:14:31,610 --> 00:14:34,720 bởi vì lúc cuối ngày, không có vấn đề gì địa chỉ là, 235 00:14:34,720 --> 00:14:40,240 nhưng nó không thành vấn đề mà chúng ta có khả năng để thể hiện rằng địa chỉ với một số đoạn mã. 236 00:14:40,240 --> 00:14:42,730 Chúng tôi đã không thực sự thao tác các địa chỉ này chỉ được nêu ra 237 00:14:42,730 --> 00:14:47,770 do đó, chúng ta sẽ thấy chúng ta có thể xen vào và sắp xếp làm việc với con trỏ, 238 00:14:47,770 --> 00:14:52,030 nhưng bây giờ trong dòng 12 nghĩa là những giá trị chúng ta so sánh 239 00:14:52,030 --> 00:14:55,500 theo câu chuyện này trong dòng 12? 240 00:14:56,570 --> 00:15:01,290 Chúng tôi đang nói là 123 bằng bằng 456? Và đó chắc chắn không phải là trường hợp. 241 00:15:01,290 --> 00:15:05,320 Và ngay cả khái niệm, con trỏ này chắc chắn là không giống như thế này 242 00:15:05,320 --> 00:15:09,500 bởi vì bạn được gọi là getString hai lần, và GetString không cố gắng để được siêu thông minh, 243 00:15:09,500 --> 00:15:12,470 nó không cố gắng để nhận ra, oh, bạn đã gõ Hello 5 phút trước; 244 00:15:12,470 --> 00:15:15,090 hãy để tôi cung cấp cho bạn con trỏ giống như tôi đã cho bạn, 245 00:15:15,090 --> 00:15:18,450 nó chỉ cấp phát một đoạn mới của bộ nhớ mỗi khi bạn gọi nó. 246 00:15:18,450 --> 00:15:20,350 >> Vì vậy, làm thế nào để chúng ta khắc phục vấn đề này? 247 00:15:20,350 --> 00:15:24,270 Nếu cấp độ cao hơn, tôi muốn so sánh chuỗi Hello Hello - 248 00:15:24,270 --> 00:15:28,680 Tôi không quan tâm về con trỏ làm thế nào để tôi đi về trả lời câu hỏi, 249 00:15:28,680 --> 00:15:31,980 người dùng đã gõ điều tương tự? Những gì cần thiết ở đây? Yeah. 250 00:15:31,980 --> 00:15:35,200 [Sinh viên] Sử dụng một chức năng. >> Tôi có thể sử dụng một chức năng ra khỏi hộp. 251 00:15:35,200 --> 00:15:38,170 Tôi có thể sử dụng một chức năng được gọi là strcmp, s-t-r-c-m-p, 252 00:15:38,170 --> 00:15:41,190 chỉ là phiên bản rút gọn của chuỗi so sánh. 253 00:15:41,190 --> 00:15:45,070 Và nếu chúng ta đi vào, ví dụ, so sánh 2, là một trong số các tài liệu phát hiện nay, 254 00:15:45,070 --> 00:15:46,690 Tôi làm chính xác điều đó. 255 00:15:46,690 --> 00:15:51,750 Tôi giữ tất cả mọi thứ khác tương tự từ dòng 1 xuống 26 hoặc, 256 00:15:51,750 --> 00:15:54,360 và bây giờ nhận thấy điều này một phần đã thay đổi chỉ là một chút. 257 00:15:54,360 --> 00:15:57,690 Hãy bỏ qua dòng 28 cho một thời điểm và chỉ tập trung vào một trong những điều này. 258 00:15:57,690 --> 00:16:00,410 Chúng tôi thứ hai cần nói rằng so sánh str? 259 00:16:00,410 --> 00:16:05,200 Nó xử lý các quá trình của 2 con trỏ, s và t trong trường hợp này, 260 00:16:05,200 --> 00:16:08,480 loại gần như đặt ngón tay của mình vào 2 chữ cái, 261 00:16:08,480 --> 00:16:11,530 và những gì nó phải làm một cái gì đó giống như một vòng lặp trong khi một vòng lặp for, 262 00:16:11,530 --> 00:16:16,050 và nó nói là những giống nhau? Nếu vậy, nó di chuyển các ngón tay hoặc con trỏ về phía trước. 263 00:16:16,050 --> 00:16:17,970 Là những giống nhau, giống nhau, này, cùng 264 00:16:17,970 --> 00:16:22,710 những giống nhau, những giống nhau? Và ooh, tôi đang ở phần cuối của chuỗi ở cả hai s và t. 265 00:16:22,710 --> 00:16:26,780 Tôi đã không tìm thấy bất kỳ mâu thuẫn nào. Có, những chuỗi này đều giống nhau. 266 00:16:26,780 --> 00:16:31,940 Và những gì str so sánh trở lại nếu 2 chuỗi đều giống nhau, rõ ràng? Zero. 267 00:16:31,940 --> 00:16:35,900 Vì vậy, 0 là tốt trong trường hợp này bởi vì nếu nó trả về -1 hoặc +1, 268 00:16:35,900 --> 00:16:40,560 điều đó có nghĩa là đó là chỉ xảy ra cho đến trước khi t theo thứ tự abc hoặc sau khi t. 269 00:16:40,560 --> 00:16:43,760 Và tại sao mà có thể hữu ích để có một chức năng mà sẽ cho bạn biết chuỗi đến trước khi 270 00:16:43,760 --> 00:16:46,720 hoặc sau khi trong một từ điển? 271 00:16:46,720 --> 00:16:48,740 [Sinh viên] Tìm kiếm. >> Tìm kiếm và phân loại. 272 00:16:48,740 --> 00:16:51,730 >> Vì vậy, bạn có thể làm những việc như tìm kiếm nhị phân hoặc phân loại bong bóng hoặc hợp nhất các loại 273 00:16:51,730 --> 00:16:53,230 , nơi bạn có để so sánh mọi thứ. 274 00:16:53,230 --> 00:16:56,420 Như vậy đến nay, chúng tôi đã loại cắt giảm một số góc và chỉ nói chuyện về phân loại 275 00:16:56,420 --> 00:16:59,430 trong bối cảnh các con số bởi vì nó đẹp và dễ dàng để nói về, 276 00:16:59,430 --> 00:17:02,430 nhưng bạn chắc chắn có thể so sánh chuỗi, táo và chuối, 277 00:17:02,430 --> 00:17:05,349 bởi vì nếu táo được biết đến trước khi chuối, tương tự như vậy, 278 00:17:05,349 --> 00:17:09,319 bạn có thể di chuyển các chuỗi xung quanh trong bộ nhớ giống như Rob đã làm với loại hợp nhất trong đoạn video 279 00:17:09,319 --> 00:17:15,880 và chúng tôi đã làm ở đây trên sân khấu với sắp xếp lựa chọn, sắp xếp chèn và sắp xếp bong bóng. 280 00:17:15,880 --> 00:17:18,710 Vì vậy, nơi khác chúng ta có thể thực hiện việc này? Hãy thử điều này. 281 00:17:18,710 --> 00:17:23,980 Hãy loại quên bài học đó cho một thời điểm và thử ngay bây giờ và sao chép 1.c làm như sau. 282 00:17:23,980 --> 00:17:26,800 Ở dòng 21 tôi đang nói một cái gì đó in, 283 00:17:26,800 --> 00:17:28,520 sau đó tôi nhận được một chuỗi từ người dùng, 284 00:17:28,520 --> 00:17:30,690 sau đó tôi đang kiểm tra này. 285 00:17:30,690 --> 00:17:33,620 Chúng tôi đã không thực sự nhận được vào thói quen này, nhưng Bây giờ chúng ta hãy làm điều này. 286 00:17:33,620 --> 00:17:40,990 Hãy thực sự bóc lớp này. Đây thực sự là char *. Anh chàng này thực sự là char *. 287 00:17:40,990 --> 00:17:45,690 Vì vậy, nó có ý nghĩa gì để được kiểm tra nếu == NULL? 288 00:17:45,690 --> 00:17:48,380 Nó chỉ ra rằng khi bạn gọi một chức năng giống như GetString 289 00:17:48,380 --> 00:17:51,540 hoặc nói chung chỉ cần hỏi một máy tính để cung cấp cho bạn một số bộ nhớ, 290 00:17:51,540 --> 00:17:53,030 một cái gì đó có thể đi sai. 291 00:17:53,030 --> 00:17:56,630 Bạn có thể là điên và yêu cầu máy tính cho một terabyte bộ nhớ 292 00:17:56,630 --> 00:18:01,780 bằng cách yêu cầu hàng nghìn tỷ byte của bộ nhớ mà chỉ cần không tồn tại trong máy tính, 293 00:18:01,780 --> 00:18:05,130 nhưng chức năng GetString và cần một số cách la hét vào bạn 294 00:18:05,130 --> 00:18:06,820 nếu bạn đã yêu cầu quá nhiều. 295 00:18:06,820 --> 00:18:10,450 Và cách GetString thực hiện điều này là nếu bạn đã yêu cầu nhiều bộ nhớ hơn 296 00:18:10,450 --> 00:18:14,250 hơn có sẵn trong máy tính, ngay cả khi đó là siêu, siêu xác suất thấp 297 00:18:14,250 --> 00:18:17,730 bởi vì không ai trong chúng ta sẽ gõ một nghìn tỷ nhân vật và sau đó nhấn Enter, 298 00:18:17,730 --> 00:18:21,980 nhưng xác suất thấp mặc dù nó có thể được, tôi vẫn muốn kiểm tra cho nó chỉ trong trường hợp, 299 00:18:21,980 --> 00:18:26,120 và giá trị đặc biệt mà trở về GetString, câu trả lời, và các chức năng khác 300 00:18:26,120 --> 00:18:30,630 nếu một cái gì đó đã đi sai là NULL trong tất cả các mũ. 301 00:18:30,630 --> 00:18:36,520 >> Và những gì là NULL? NULL chỉ để xảy ra để đại diện cho một con trỏ. Đó là bộ nhớ địa chỉ 0. 302 00:18:36,520 --> 00:18:40,800 Thế giới đã quyết định tùy tiện, nếu điều này là bộ nhớ máy tính của tôi - bạn biết những gì? 303 00:18:40,800 --> 00:18:46,260 chúng ta sẽ ăn cắp chỉ 1 byte bộ nhớ của mỗi máy tính, và điều này là vị trí 0. 304 00:18:46,260 --> 00:18:49,560 Chúng tôi sẽ để cho nó một biệt hiệu của NULL, và chúng tôi sẽ hứa hẹn 305 00:18:49,560 --> 00:18:52,660 rằng chúng ta sẽ không bao giờ thực sự đưa dữ liệu thực sự có 306 00:18:52,660 --> 00:18:56,770 bởi vì chúng ta chỉ cần tùy tiện cần một giá trị đặc biệt, 0, NULL aka, 307 00:18:56,770 --> 00:19:00,230 để chúng tôi có thể hét lên với người sử dụng nếu có điều gì sai. 308 00:19:00,230 --> 00:19:03,590 Nếu không, bạn có thể không biết không 0 có nghĩa là đặt một cái gì đó ở đây 309 00:19:03,590 --> 00:19:05,490 hoặc có nghĩa là một cái gì đó đã đi sai? 310 00:19:05,490 --> 00:19:09,190 Chúng tôi có cho tất cả đồng ý rằng không có gì có nghĩa là NULL được trả lại, 311 00:19:09,190 --> 00:19:11,700 không có địa chỉ thực tế được trả lại. 312 00:19:11,700 --> 00:19:15,210 Bây giờ, ở đây tôi chỉ áp dụng quy ước của con người của tôi của tôi trở về 1 từ chính 313 00:19:15,210 --> 00:19:17,040 nếu có điều gì sai. 314 00:19:17,040 --> 00:19:20,650 Đó là bởi vì ước trở lại chính là để trở về 0 nếu tốt, 315 00:19:20,650 --> 00:19:22,990 1 hoặc một số giá trị khác nếu xấu. 316 00:19:22,990 --> 00:19:28,200 Nhưng GetString và chức năng bất kỳ mà đề lại nhớ NULL nếu một cái gì đó xấu đi. 317 00:19:28,200 --> 00:19:33,480 >> Okay. Vì vậy, thật không may, 27 dòng, siêu đơn giản, mặc dù nó là, hoàn toàn không để sao chép các chuỗi. 318 00:19:33,480 --> 00:19:35,740 Tại sao? Chúng ta có thể thấy điều này như sau. 319 00:19:35,740 --> 00:19:40,120 Tôi có khiếu nại trong dòng 27 được thực hiện một bản sao của s và gọi đó là t. 320 00:19:40,120 --> 00:19:45,790 Vì vậy, tôi không yêu cầu người sử dụng cho 2 dây thời gian này, Tôi chỉ nói giá trị trong s 321 00:19:45,790 --> 00:19:47,870 cần được đặt trong t là tốt. 322 00:19:47,870 --> 00:19:52,890 Vì vậy, bây giờ chỉ để chứng minh bị hỏng này, trong dòng 29 trở đi những gì tôi làm? 323 00:19:52,890 --> 00:19:56,980 Trước tiên, tôi kiểm tra nếu chiều dài của t là lớn hơn 0. 324 00:19:56,980 --> 00:19:59,330 Có một số chuỗi có. Người dùng gõ một cái gì đó. 325 00:19:59,330 --> 00:20:03,410 Dòng 32 làm, rõ ràng là gì? 326 00:20:03,410 --> 00:20:08,910 [Không nghe được sinh viên phản ứng] >> phải. Loại có thể suy ra từ những gì tôi nói nó đang làm. 327 00:20:08,910 --> 00:20:13,200 Nhưng về mặt kỹ thuật, điều này đang làm gì? t [0] đại diện cho những gì? 328 00:20:13,200 --> 00:20:15,140 [Sinh viên] Các ký tự 0. >> [Malan] Các ký tự 0. 329 00:20:15,140 --> 00:20:19,620 Hoặc, giống như con người, ký tự đầu tiên trong t, bất kể đó là, H có thể trong trường hợp này. 330 00:20:19,620 --> 00:20:24,990 Và toupper những gì nó nói. Nó tận dụng các ký tự 0 t và nó thay đổi nó. 331 00:20:24,990 --> 00:20:28,430 Vì vậy, điều này có nghĩa là các ký tự 0 của t, làm cho nó thành chữ hoa, 332 00:20:28,430 --> 00:20:30,320 và đặt nó trở lại trong cùng một vị trí. 333 00:20:30,320 --> 00:20:35,540 Vì vậy, nếu tôi gõ hello bằng chữ thường, điều này sẽ thay đổi h chữ thường để một H. vốn 334 00:20:35,540 --> 00:20:41,400 Nhưng vấn đề là trong các dòng 35 và 36 những gì tôi sắp làm là in ra cho chúng ta s và t. 335 00:20:41,400 --> 00:20:43,120 Và linh cảm của bạn là gì? 336 00:20:43,120 --> 00:20:47,250 Những gì tôi thực sự sẽ để xem nếu tôi gõ trong hello tất cả bằng chữ thường? 337 00:20:47,250 --> 00:20:52,280 Những gì đang xảy ra để có được in? >> [Không nghe được sinh viên phản ứng] >> đó là gì? 338 00:20:52,280 --> 00:20:58,360 [Sinh viên] Big H và phần còn lại nhỏ. >> H lớn và phần còn lại nhỏ mà, t? 339 00:20:58,360 --> 00:21:03,170 [Sinh viên] Cả hai. >> Cả hai. Chính xác. Vì vậy, chúng ta hãy xem những gì đang xảy ra ở đây. 340 00:21:03,170 --> 00:21:08,380 >> Hãy để tôi đi trước và biên dịch này. Đây là copy1, do đó hãy copy1. Được rồi. 341 00:21:08,380 --> 00:21:14,840 Zoom in Hãy để tôi đi trước và chạy copy1, Enter, Nói gì: hello bằng chữ thường. 342 00:21:14,840 --> 00:21:19,570 Hoa sao chép, nhưng nó dường như hoa cũng, 343 00:21:19,570 --> 00:21:22,070 bởi vì những gì xảy ra trong câu chuyện này? 344 00:21:22,070 --> 00:21:27,030 Trong dòng 27, tôi không thực sự có vẻ được sao chép chuỗi, 345 00:21:27,030 --> 00:21:30,450 nhưng ngay cả khi bạn có thể trực giác hy vọng rằng phải là trường hợp, 346 00:21:30,450 --> 00:21:33,680 nếu bạn nghĩ về hình ảnh này, những gì thực sự tôi đã thực hiện? 347 00:21:33,680 --> 00:21:35,410 Một nửa của hình ảnh là như nhau. 348 00:21:35,410 --> 00:21:39,390 Vì vậy, chúng ta hãy quay trở lại trong thời gian để t không tồn tại được nêu ra trong câu chuyện. 349 00:21:39,390 --> 00:21:43,160 S có thể tồn tại trong câu chuyện, nhưng chúng ta hãy thành chữ thường thời gian này. 350 00:21:43,160 --> 00:21:46,710 Vì vậy, hãy để tôi sửa chữa những gì tôi thực sự đánh máy. 351 00:21:46,710 --> 00:21:51,280 Trong trường hợp này ở đây, chúng ta có h-e-l-l-o. 352 00:21:51,280 --> 00:21:58,050 Chúng tôi sẽ vẽ nó như là một chuỗi các ký tự, đặt đường phân cách của tôi ở đây và \ của tôi 0. 353 00:21:58,050 --> 00:22:05,980 Vì vậy, đây là nơi chúng tôi là ngay khi dòng 1 thông qua 24-ish, cho hay phải mất, đã thực hiện. 354 00:22:05,980 --> 00:22:07,800 Đây là hình ảnh bộ nhớ của tôi. 355 00:22:07,800 --> 00:22:10,800 Khi tôi nhận được dòng 27, những gì sẽ xảy ra? 356 00:22:10,800 --> 00:22:14,730 Giống như trước đây, tôi nhận được một con trỏ, mà tôi sẽ vẽ như hình vuông này. 357 00:22:14,730 --> 00:22:19,740 Nó được gọi là t. Và giá trị của nó theo mặc định là gì? Ai biết được? Một số giá trị rác. 358 00:22:19,740 --> 00:22:22,060 >> Vì vậy, tôi sẽ trừu tượng mà là một dấu hỏi. 359 00:22:22,060 --> 00:22:27,670 Và ngay sau khi phía bên tay phải của dòng 27 thực hiện, tôi, những gì tôi đặt bên trong của t? 360 00:22:27,670 --> 00:22:30,770 Cùng một điều đó là trong s. 361 00:22:30,770 --> 00:22:34,120 Vì vậy, nếu chúng ta cho một thời điểm loại bỏ trừu tượng mũi tên này và chúng tôi nói, 362 00:22:34,120 --> 00:22:40,330 oh, đây là địa chỉ tải bộ nhớ 123, khi bạn nói t được s, dấu chấm phẩy, 363 00:22:40,330 --> 00:22:42,700 bạn nghĩa đen đặt 123 ở đây. 364 00:22:42,700 --> 00:22:45,200 Bây giờ nếu chúng ta loại đơn giản hóa thế giới của chúng ta một lần nữa với hình ảnh, 365 00:22:45,200 --> 00:22:48,750 những gì bạn đã thực sự làm được chỉ cần thêm một mũi tên để thế giới của bạn 366 00:22:48,750 --> 00:22:52,910 chỉ từ t cùng một chuỗi chính xác. 367 00:22:52,910 --> 00:22:59,730 Vì vậy, khi ở dòng 31 và 32, tôi thực sự đi về việc thay đổi t [0], 368 00:22:59,730 --> 00:23:05,580 t là [0] dường như đồng nghĩa với bây giờ? s [0] 369 00:23:05,580 --> 00:23:07,030 Vì vậy, đó là tất cả những gì đang xảy ra. 370 00:23:07,030 --> 00:23:09,900 Và mặc dù loại này cảm thấy một chút cấp thấp và phức tạp 371 00:23:09,900 --> 00:23:12,760 và loại này cảm thấy như có lẽ trực giác này nên đã chỉ làm việc 372 00:23:12,760 --> 00:23:15,410 Tôi đã thực hiện bản sao của mọi thứ và nó chỉ làm việc - 373 00:23:15,410 --> 00:23:18,590 nếu bạn thực sự suy nghĩ về những gì một chuỗi thực sự là, đó là một *. 374 00:23:18,590 --> 00:23:21,700 Vâng, đó là những gì? Đó là địa chỉ của một số nhân vật. 375 00:23:21,700 --> 00:23:24,930 Sau đó, có lẽ nó có ý nghĩa hơn khi bạn cố gắng để làm một cái gì đó 376 00:23:24,930 --> 00:23:29,220 siêu dường như đơn giản như thế này, tất cả các bạn đang làm là sao chép một địa chỉ bộ nhớ. 377 00:23:29,220 --> 00:23:32,530 Bạn không thực sự làm bất cứ điều gì với chuỗi chính nó. 378 00:23:32,530 --> 00:23:37,500 Vì vậy, ngay cả khi bạn không có ý tưởng làm thế nào bạn sẽ giải quyết vấn đề này trong mã, 379 00:23:37,500 --> 00:23:45,080 cao cấp, khái niệm, chúng ta làm những gì cần phải làm để làm cho ta bản sao có dấu sao y bản chính của s, rõ ràng? 380 00:23:46,670 --> 00:23:48,820 Yeah. >> [Sinh viên] Cung cấp cho nó một vị trí mới? >> Chính xác. 381 00:23:48,820 --> 00:23:50,800 >> Chúng ta cần để cung cấp cho một vị trí thương hiệu mới. 382 00:23:50,800 --> 00:23:55,230 Chúng tôi cần phải bằng cách nào đó tạo ra một thế giới mà chúng tôi nhận được một đoạn mới của bộ nhớ, 383 00:23:55,230 --> 00:24:00,090 mà chỉ vì lợi ích của sự rõ ràng, tôi sẽ vẽ ngay bên dưới một trong những điều này, nhưng nó không cần phải có mặt ở đó. 384 00:24:00,090 --> 00:24:04,880 Nhưng nó cần phải có cùng kích thước, vì vậy tôi sẽ vẽ những đường thẳng đứng ở cùng một chỗ. 385 00:24:04,880 --> 00:24:09,720 Đó là tốt nếu điều này là tất cả các rác thải ban đầu. Ai biết được những gì đã có? 386 00:24:09,720 --> 00:24:13,850 Tuy nhiên, bước 1 là sẽ có được cho tôi như là bộ nhớ nhiều như tôi cần 387 00:24:13,850 --> 00:24:18,630 để phù hợp với một bản sao của hello, sau đó tìm ra làm thế nào để sao chép các h đây, e đây, 388 00:24:18,630 --> 00:24:20,390 l và vv. 389 00:24:20,390 --> 00:24:24,880 Nhưng điều này nên đã cảm thấy một chút rõ ràng ngay cả khi một số chi tiết vẫn còn trừu tượng. 390 00:24:24,880 --> 00:24:28,690 Để sao chép chuỗi này vào điều này, nó chỉ là một cho vòng lặp hoặc một vòng lặp trong khi 391 00:24:28,690 --> 00:24:31,580 hoặc một cái gì đó mà bạn đã trở nên quen thuộc hơn. 392 00:24:31,580 --> 00:24:35,970 Vì vậy, hãy thử này. Hãy để tôi đi vào copy2.c. 393 00:24:35,970 --> 00:24:43,270 Trong copy2.c chúng tôi đã gần như cùng một chương trình ngoại trừ dòng 27. 394 00:24:43,270 --> 00:24:47,260 Có vẻ một chút phức tạp, nhưng nếu chúng ta phá vỡ nó xuống mảnh của mảnh, 395 00:24:47,260 --> 00:24:48,950 phía bên tay trái là như nhau. 396 00:24:48,950 --> 00:24:52,790 Char * t tạo ra điều này trong bộ nhớ, mặc dù với một dấu hỏi 397 00:24:52,790 --> 00:24:54,680 bởi vì chúng tôi không có ý tưởng những gì đang có theo mặc định. 398 00:24:54,680 --> 00:24:57,920 Về phía bên phải bây giờ chúng tôi đang giới thiệu một chức năng mới, malloc, 399 00:24:57,920 --> 00:25:00,640 cho bộ nhớ phân bổ, đưa cho tôi bộ nhớ, 400 00:25:00,640 --> 00:25:06,900 và nó dường như có nhiều đối số, có bao nhiêu những thứ bên trong dấu ngoặc đơn? 401 00:25:09,660 --> 00:25:12,130 Tôi nghe nói murmurings 1 và 2, nhưng nó chỉ là 1. 402 00:25:12,130 --> 00:25:15,320 Có không có dấu phẩy, có nghĩa là chỉ có 1 điều bên trong dấu ngoặc đơn. 403 00:25:15,320 --> 00:25:17,720 Mặc dù có dấu ngoặc đơn khác, hãy để tôi làm nổi bật 404 00:25:17,720 --> 00:25:21,460 những gì bên trong dấu ngoặc đơn ngoài cùng, và nó biểu hiện này: 405 00:25:21,460 --> 00:25:25,880 (Strlen (s) + 1) * sizeof (char). 406 00:25:25,880 --> 00:25:29,190 Vì vậy, nếu chúng ta thực sự nghĩ rằng điều này thông qua, điều này được nói cho tôi chiều dài của s. 407 00:25:29,190 --> 00:25:34,440 Tại sao tôi, mặc dù, thêm 1 vào chiều dài? >> [Không nghe được sinh viên phản ứng] 408 00:25:34,440 --> 00:25:40,200 Chính xác. Chúng tôi cần không gian cho anh chàng này ở đuôi, nhân vật thứ sáu mà không có ý nghĩa tiếng Anh 409 00:25:40,200 --> 00:25:42,250 nhưng không có ý nghĩa đặc biệt của chương trình. 410 00:25:42,250 --> 00:25:46,800 >> Vì vậy, chúng ta cần một + 1 cho rằng bởi vì strlen trả về kỳ vọng của con người có chiều dài, 411 00:25:46,800 --> 00:25:50,890 chào hay 5, không cung cấp cho bạn thêm các ký tự null. 412 00:25:50,890 --> 00:25:52,980 Vì vậy, tôi tự thêm điều này với + 1. 413 00:25:52,980 --> 00:25:56,060 Và sau đó, * kích thước của (char), chúng tôi đã không nhìn thấy điều này trước khi. 414 00:25:56,060 --> 00:25:57,480 Đây không phải là kỹ thuật một chức năng. 415 00:25:57,480 --> 00:26:04,150 Đó là một từ khóa đặc biệt chỉ cho bạn biết những gì kích thước của một số loại dữ liệu trên một máy tính 416 00:26:04,150 --> 00:26:06,980 bởi vì trong thực tế, một số người trong chúng ta có máy tính 32-bit. 417 00:26:06,980 --> 00:26:10,900 Tôi có một máy tính khá cũ ở nhà, và nó chỉ sử dụng 32 bit để đại diện cho con trỏ. 418 00:26:10,900 --> 00:26:13,900 Và như vậy nếu tôi đã làm kích thước của một kiểu dữ liệu, nó có thể là 32 bit. 419 00:26:13,900 --> 00:26:18,300 Nhưng nếu tôi đang sử dụng máy tính mới ưa thích của tôi, tôi có thể nhận được lại một giá trị 64 bit 420 00:26:18,300 --> 00:26:20,510 cho một cái gì đó giống như một địa chỉ. 421 00:26:20,510 --> 00:26:25,400 Vì vậy, trong trường hợp này, chỉ để được siêu an toàn, chúng tôi không đi đến một cái gì đó cứng mã như 422 00:26:25,400 --> 00:26:28,740 tốt, kích thước của một char theo những gì chúng tôi đã nói cho đến nay là gì? 423 00:26:28,740 --> 00:26:34,450 Chúng tôi đã khá nhiều nói bằng lời nói rằng đó là 1 byte, và đó là khá nhiều đúng trên bảng. 424 00:26:34,450 --> 00:26:37,000 Nhưng một lần nữa, giả định có xu hướng là xấu. 425 00:26:37,000 --> 00:26:40,850 Họ dẫn đến phần mềm lỗi nếu mọi người sử dụng phần mềm của bạn theo những cách bạn không có ý. 426 00:26:40,850 --> 00:26:44,750 Vì vậy, hãy trừu tượng này đi và chỉ dẫn chung nói 427 00:26:44,750 --> 00:26:46,830 Tôi cần điều này khối nhiều bộ nhớ 428 00:26:46,830 --> 00:26:50,210 và mỗi đoạn bộ nhớ cần được tương đương với kích thước của một nhân vật, 429 00:26:50,210 --> 00:26:54,870 mà là trong thực tế, bằng 1 trong trường hợp này, nhưng đó là một cách chung chung hơn viết nó. 430 00:26:54,870 --> 00:27:00,460 Vì vậy, nếu từ đó là chào, bao nhiêu byte malloc dường như phân bổ lời chào? 431 00:27:00,460 --> 00:27:04,980 [Sinh viên] Sáu. >> Six. Chính xác như nhiều như chúng tôi có dấu hỏi trên màn hình. 432 00:27:04,980 --> 00:27:07,800 Và sau đó hãy đoán dựa trên sự hiểu biết của bạn GetString 433 00:27:07,800 --> 00:27:12,790 malloc những gì có thể quay trở lại? >> [Sinh viên] Một địa chỉ. 434 00:27:12,790 --> 00:27:17,020 Một địa chỉ của những gì? Của đoạn đầu tiên của bộ nhớ. 435 00:27:17,020 --> 00:27:20,670 >> Chúng tôi không có ý tưởng những gì đang có bởi vì một số chức năng khác 436 00:27:20,670 --> 00:27:23,010 có thể đã được sử dụng trước đó là bộ nhớ này. 437 00:27:23,010 --> 00:27:28,380 Nhưng malloc, như GetString, trả về địa chỉ của byte đầu tiên của bộ nhớ 438 00:27:28,380 --> 00:27:30,540 rằng nó đã dành cho bạn. 439 00:27:30,540 --> 00:27:38,380 Tuy nhiên, những gì nó không làm là điền vào chỗ trống này với một ký tự null dấu gạch chéo ngược 440 00:27:38,380 --> 00:27:43,030 bởi vì nó quay ra bạn có thể sử dụng malloc để cấp phát bất cứ điều gì: ints, chuỗi, mảng, 441 00:27:43,030 --> 00:27:45,700 phao, cấu trúc sinh viên. 442 00:27:45,700 --> 00:27:47,750 Bạn có thể sử dụng malloc hoàn toàn tổng quát. 443 00:27:47,750 --> 00:27:51,470 Nó không quan tâm hoặc cần phải biết những gì bạn đang cấp phát bộ nhớ cho. 444 00:27:51,470 --> 00:27:55,810 Vì vậy, nó sẽ là táo bạo cho malloc để đặt một 0 \ 445 00:27:55,810 --> 00:27:58,340 ở phần cuối của mỗi đoạn bộ nhớ nó đem lại cho bạn 446 00:27:58,340 --> 00:28:02,620 bởi vì đây \ 0 điều chỉ là một quy ước cho các chuỗi. 447 00:28:02,620 --> 00:28:06,310 Nó không được sử dụng cho ints, nó không được sử dụng cho nổi, nó không được sử dụng cho sinh viên. 448 00:28:06,310 --> 00:28:11,730 Và vì vậy Gotcha với malloc là gánh nặng là hoàn toàn vào bạn lập trình viên 449 00:28:11,730 --> 00:28:16,790 nhớ bao nhiêu byte bạn được giao và không bao giờ sử dụng một vòng lặp for 450 00:28:16,790 --> 00:28:21,570 hoặc một vòng lặp while và đi qua ranh giới của đoạn bộ nhớ bạn đã được. 451 00:28:21,570 --> 00:28:23,540 Nói cách khác, ngay sau khi bạn cấp phát bộ nhớ, 452 00:28:23,540 --> 00:28:28,510 bạn không thể yêu cầu hệ điều hành, oh, bằng cách này, làm thế nào lớn của một đoạn bộ nhớ này? 453 00:28:28,510 --> 00:28:32,080 Nó hoàn toàn vào bạn để nhớ nếu bạn cần giá trị đó. 454 00:28:32,080 --> 00:28:34,330 >> Vì vậy, chúng ta hãy xem làm thế nào tôi tiếp tục sử dụng bộ nhớ này. 455 00:28:34,330 --> 00:28:38,430 Trong dòng 28 và 29 lý do tại sao tôi làm điều này? 456 00:28:39,850 --> 00:28:42,260 Chỉ cần tổng kiểm tra sự tỉnh táo. 457 00:28:42,260 --> 00:28:45,110 Chỉ trong trường hợp một cái gì đó đã đi sai, tôi yêu cầu cho một số số tiền điên của bộ nhớ 458 00:28:45,110 --> 00:28:48,690 hoặc tôi đã quá nhiều thứ đang chạy trên máy tính mà chỉ là không đủ bộ nhớ, 459 00:28:48,690 --> 00:28:51,780 một cái gì đó như thế, tôi ít nhất là muốn để kiểm tra null. 460 00:28:51,780 --> 00:28:55,260 Trong thực tế, hầu hết các máy tính sẽ cung cấp cho bạn ảo tưởng rằng mọi chương trình 461 00:28:55,260 --> 00:28:57,080 có thể sử dụng toàn bộ bộ nhớ RAM của bạn, 462 00:28:57,080 --> 00:29:00,740 nhưng ngay cả như vậy, nếu người sử dụng các loại trong một số chuỗi dài điên có thể bởi vì họ là một kẻ xấu 463 00:29:00,740 --> 00:29:03,440 và họ đang thực sự cố gắng để sụp đổ chương trình hoặc hack của bạn vào đó, 464 00:29:03,440 --> 00:29:07,300 bạn muốn ít nhất là kiểm tra giá trị trả về của malloc và liệu nó có bằng null. 465 00:29:07,300 --> 00:29:11,630 Và nếu có, chúng ta hãy bỏ thuốc lá ngay bây giờ bởi vì tôi không biết phải làm gì trong trường hợp đó. 466 00:29:11,630 --> 00:29:13,950 Làm thế nào để sao chép chuỗi? Có một số cách để làm điều này. 467 00:29:13,950 --> 00:29:18,850 Có str sao chép các chức năng trong C, nhưng đó là siêu đơn giản cho chúng ta để làm điều này theo cách cũ. 468 00:29:18,850 --> 00:29:23,110 >> Trước tiên hãy để tôi tìm ra chiều dài của s. 469 00:29:23,110 --> 00:29:26,930 Tôi đã có thể đặt điều này trong vòng lặp, nhưng thay vào đó tôi chỉ cần đặt nó ra đây cho rõ ràng. 470 00:29:26,930 --> 00:29:30,610 Vì vậy, n tại lưu trữ độ dài của chuỗi ban đầu, rõ ràng là 5. 471 00:29:30,610 --> 00:29:35,290 Sau đó, trong vòng lặp cho tôi, tôi lặp lại từ 0 đến n, 472 00:29:35,290 --> 00:29:40,940 và mỗi lần lặp Tôi đang đặt s [i] bên trong của t [i]. 473 00:29:40,940 --> 00:29:45,060 Vì vậy, đó là những gì tôi ngụ ý với 2 ngón tay chỉ vào các dây trước khi. 474 00:29:45,060 --> 00:29:49,260 Vì đây cho vòng lặp như thế này, tôi sẽ được sao chép h vào đây, 475 00:29:49,260 --> 00:29:52,890 e vào đây, tôi vào đây vì đây là s, đây là t. 476 00:29:52,890 --> 00:29:58,770 Và sau đó cuối cùng, trong dòng 35 lý do tại sao tôi làm điều này? 477 00:29:58,770 --> 00:30:03,770 Tôi cần phải làm cho chắc chắn rằng tôi kết thúc chuỗi t. 478 00:30:03,770 --> 00:30:06,170 Và tôi đã làm nó theo cách này để được siêu rõ ràng. 479 00:30:06,170 --> 00:30:09,510 Nhưng đề xuất, một ai đó, nếu bạn có thể, một cách khác nhau để làm điều này. 480 00:30:09,510 --> 00:30:13,930 Tôi không thực sự cần dòng 35. Có một cách khác để làm điều này. 481 00:30:13,930 --> 00:30:18,880 Yeah. >> [Không nghe được sinh viên phản ứng] >> Nói cho nó to hơn. 482 00:30:18,880 --> 00:30:20,960 [Sinh viên] Nhỏ hơn hoặc bằng. >> Chính xác. 483 00:30:20,960 --> 00:30:24,450 Chúng tôi chỉ có thể nói nhỏ hơn hoặc bằng n, mà nói chung đã xấu 484 00:30:24,450 --> 00:30:28,190 bởi vì hầu như luôn luôn khi chúng tôi đi lên bằng những điều chúng ta đang đếm 485 00:30:28,190 --> 00:30:30,000 chúng tôi đi 1 bước quá xa. 486 00:30:30,000 --> 00:30:32,170 Nhưng hãy nhớ, chúng tôi phân bổ bao nhiêu byte? 487 00:30:32,170 --> 00:30:37,210 Chúng tôi phân bổ strlen của s, do đó, 5 + 1 cho tổng cộng 6. 488 00:30:37,210 --> 00:30:39,980 Vì vậy, trong trường hợp này, chúng ta có thể làm một cái gì đó như thế này 489 00:30:39,980 --> 00:30:46,450 để chúng tôi đang sao chép không chỉ hello mà còn 0 \ ở cuối. 490 00:30:46,450 --> 00:30:49,860 Ngoài ra, chúng tôi có thể sử dụng một chức năng gọi là str bản sao, strcpy, 491 00:30:49,860 --> 00:30:51,700 nhưng điều đó sẽ không được vui vẻ gần như là nhiều. 492 00:30:51,700 --> 00:30:54,000 Nhưng đó là tất cả nó bên dưới mui xe. 493 00:30:54,000 --> 00:30:56,050 Sau đó, cuối cùng, chúng tôi làm điều tương tự như trước đây. 494 00:30:56,050 --> 00:31:01,620 Tôi tận t và sau đó tôi cho rằng ban đầu trông như thế này và bản sao trông như thế. 495 00:31:01,620 --> 00:31:08,570 Vì vậy, chúng ta hãy thử điều này ngay bây giờ. Hãy để tôi đi ở đây. Hãy copy2. Chúng tôi sẽ phóng to, thu nhỏ và chạy copy2. 496 00:31:08,570 --> 00:31:13,840 Tôi sẽ gõ trong hello bằng chữ thường, và thực sự tôi có được chữ thường chào như bản gốc 497 00:31:13,840 --> 00:31:16,930 nhưng vốn Xin chào cho bản sao. 498 00:31:16,930 --> 00:31:20,300 Nhưng tôi không thực hiện chỉ được nêu ra. Tôi cần phải làm 1 điều cuối cùng ở đây. 499 00:31:20,300 --> 00:31:28,000 46 và 47 rõ ràng là giải phóng bộ nhớ, nhưng điều đó không thực sự có nghĩa? 500 00:31:28,000 --> 00:31:33,250 Tôi đang làm gì, bạn có nghĩ rằng, bằng cách gọi dòng 46 và dòng 47? 501 00:31:33,250 --> 00:31:38,900 Tác động gì có? Yeah. 502 00:31:38,900 --> 00:31:43,140 [Không nghe được sinh viên phản ứng] >> Chính xác. 503 00:31:43,140 --> 00:31:46,380 >> Bạn chỉ cần nói với hệ điều hành, hey, cảm ơn cho bộ nhớ này. 504 00:31:46,380 --> 00:31:48,320 Bây giờ bạn có thể sử dụng nó cho người khác. 505 00:31:48,320 --> 00:31:50,790 Và đây là một ví dụ hoàn hảo của các giá trị rác. 506 00:31:50,790 --> 00:31:55,430 Tôi đã chỉ sử dụng bộ nhớ này để viết xuống những từ hello tại 2 địa điểm, 507 00:31:55,430 --> 00:31:57,490 đây, ở đây, ở đây, và ở đây. 508 00:31:57,490 --> 00:32:00,910 Vì vậy, đây là h-e-l-l-o-\ 0. 509 00:32:00,910 --> 00:32:06,960 Nhưng sau đó tôi gọi là dòng 46 và dòng 47, và bạn biết điều gì sẽ xảy ra trong điều khoản của hình ảnh? 510 00:32:06,960 --> 00:32:10,010 Trên thực tế, chờ đợi, bức tranh này là cũ. 511 00:32:10,010 --> 00:32:12,550 Một khi chúng ta thực hiện các bản sao, anh chàng này thực sự là chỉ ở đây, 512 00:32:12,550 --> 00:32:16,110 vì vậy chúng ta hãy loại bỏ những con số và chỉ cần tóm tắt đi như mũi tên của chúng tôi một lần nữa. 513 00:32:16,110 --> 00:32:19,370 Điều gì sẽ xảy ra trong bức tranh này khi tôi gọi miễn phí? 514 00:32:19,370 --> 00:32:22,750 [Sinh viên không nghe được đáp ứng] >> Không, ngay cả. 515 00:32:22,750 --> 00:32:29,510 Nếu tôi gọi miễn phí trên s và t - loại một câu hỏi trick - hình này không thay đổi ở tất cả các 516 00:32:29,510 --> 00:32:33,880 bởi vì gọi điện thoại và gọi t chỉ cần nói với hệ điều hành, 517 00:32:33,880 --> 00:32:39,010 hey, bạn có thể sử dụng bộ nhớ một lần nữa, nhưng nó không thay đổi điều này để null 518 00:32:39,010 --> 00:32:41,840 hoặc một số ký tự đặc biệt, nó không thay đổi điều này, 519 00:32:41,840 --> 00:32:47,350 nó không thay đổi h hoặc e hoặc l l hoặc o trong hoặc nơi để bất cứ điều gì khác. 520 00:32:47,350 --> 00:32:51,610 Trong điều kiện của hình ảnh, ngay sau khi bạn gọi miễn phí, không có gì thay đổi. 521 00:32:51,610 --> 00:32:56,570 Và đây là nguồn gốc của giá trị rác bởi vì nếu tôi sau đó trong chương trình này 522 00:32:56,570 --> 00:33:01,010 yêu cầu hệ điều hành cho bộ nhớ nhiều hơn với GetString hoặc malloc hoặc một cái gì đó như là 523 00:33:01,010 --> 00:33:04,900 và hệ điều hành nói, chắc chắn, tôi có 12 byte bộ nhớ chỉ được giải phóng, 524 00:33:04,900 --> 00:33:08,080 sử dụng chúng, bạn sẽ được giao? 525 00:33:08,080 --> 00:33:10,830 Bạn sẽ được giao cho một đoạn bộ nhớ mà chúng ta thường sẽ vẽ 526 00:33:10,830 --> 00:33:13,700 với dấu hỏi, nhưng những dấu hỏi là gì? 527 00:33:13,700 --> 00:33:17,000 Chúng xảy ra là h-e-l-l-o, h-e-l-l-o. 528 00:33:17,000 --> 00:33:20,940 Đây là những giá trị rác mới của chúng tôi ngay khi bạn giải phóng bộ nhớ rằng. 529 00:33:20,940 --> 00:33:22,750 >> Có một ý nghĩa thực tế ở đây quá. 530 00:33:22,750 --> 00:33:24,720 Điều này xảy ra với bộ nhớ RAM, nhưng máy tính của bạn 531 00:33:24,720 --> 00:33:26,720 thực sự làm điều tương tự với đĩa. 532 00:33:26,720 --> 00:33:30,620 Chúng tôi sẽ nói về điều này đặc biệt với một tập hợp các vấn đề trong tương lai tập trung vào pháp y. 533 00:33:30,620 --> 00:33:36,170 Nhưng những gì thực sự xảy ra nếu bạn có một số tập tin tài chính nhạy cảm trên máy tính để bàn của bạn 534 00:33:36,170 --> 00:33:39,600 hoặc một số JPEG sơ sài và kéo nó vào thùng rác của bạn, 535 00:33:39,600 --> 00:33:44,390 điều gì sẽ xảy ra khi bạn kéo nó vào thùng rác hoặc thùng rác? 536 00:33:44,390 --> 00:33:47,240 Bạn biết những gì tôi đã nói về. [Cười] 537 00:33:47,240 --> 00:33:52,370 Điều gì sẽ xảy ra khi bạn đã kéo mà bằng chứng vào thùng rác hoặc thùng rác của bạn có thể? 538 00:33:52,370 --> 00:33:55,920 [Không nghe được sinh viên phản ứng] 539 00:33:55,920 --> 00:33:58,000 Tốt, vì vậy cẩn thận. Điều gì sẽ xảy ra khi bạn làm điều đó? 540 00:33:58,000 --> 00:34:01,030 Câu trả lời ngắn gọn là không có gì, phải không? 541 00:34:01,030 --> 00:34:04,790 Sketchy hoặc tập tin nhạy cảm vẫn chỉ ngồi đó một nơi nào đó trong ổ cứng của bạn. 542 00:34:04,790 --> 00:34:07,940 Hầu hết chúng ta ít nhất đã học được cách cứng mà bạn cần để trống thùng rác của bạn 543 00:34:07,940 --> 00:34:10,429 hoặc thùng rác của bạn để thực sự xóa các tập tin. 544 00:34:10,429 --> 00:34:13,440 Và quả thực, khi bạn kích chuột phải hoặc Kiểm soát nhấp chuột vào thùng rác của bạn có thể 545 00:34:13,440 --> 00:34:15,580 hoặc chọn File, Empty Trash hoặc bất cứ điều gì 546 00:34:15,580 --> 00:34:21,420 và bạn thực sự sạch thùng rác hoặc thùng rác, những gì thực sự xảy ra sau đó với hình ảnh này? 547 00:34:22,810 --> 00:34:25,969 Không có gì. Vì vậy, không có gì thực sự xảy ra trên đĩa. 548 00:34:25,969 --> 00:34:30,880 >> Và nếu chúng ta chỉ tạm thời lạc đề và viết sẽ chỉ cần sử dụng sau này. 549 00:34:30,880 --> 00:34:34,639 Vì vậy, bây giờ câu chuyện đang thay đổi từ RAM, đó là nơi mà các chương trình tồn tại 550 00:34:34,639 --> 00:34:39,250 trong khi bạn đang chạy chúng vào đĩa, đó là nơi mà chúng được lưu trữ lâu dài 551 00:34:39,250 --> 00:34:42,920 ngay cả khi cúp điện, cho bây giờ - và chúng tôi sẽ trở lại vấn đề này trong tương lai - 552 00:34:42,920 --> 00:34:46,380 chúng ta hãy giả vờ rằng điều này đại diện cho các bên trong ổ đĩa cứng của máy tính của bạn 553 00:34:46,380 --> 00:34:50,110 bởi vì trở lại trong ngày, họ sử dụng là các ổ đĩa tròn, giống như đĩa mềm. 554 00:34:50,110 --> 00:34:55,130 Vì vậy, nếu bạn có một số tập tin Excel nhạy cảm, nó có thể mất đến đoạn bộ nhớ này 555 00:34:55,130 --> 00:34:59,770 trên đĩa cứng của máy tính của bạn, và tôi là chỉ cần vẽ cùng 1s tùy ý và số 0. 556 00:34:59,770 --> 00:35:03,970 Khi bạn kéo thả các tập tin như thế để thùng rác của bạn hoặc có thể tái chế bin, 557 00:35:03,970 --> 00:35:07,750 nghĩa là không có gì xảy ra bởi vì Apple và Microsoft đã quyết định 558 00:35:07,750 --> 00:35:10,450 thùng rác và thùng rác thực sự chỉ là một trình giữ chỗ tạm thời. 559 00:35:10,450 --> 00:35:14,710 Có lẽ cuối cùng hệ điều hành sẽ sản phẩm nào đó cho bạn, nhưng thông thường, nó không làm bất cứ điều gì, 560 00:35:14,710 --> 00:35:17,090 ít nhất là cho đến khi bạn thực sự thấp trên không gian. 561 00:35:17,090 --> 00:35:20,870 >> Tuy nhiên, khi bạn đi vào thùng rác hoặc thùng rác trống rỗng, 562 00:35:20,870 --> 00:35:23,460 tương tự như vậy, không có gì xảy ra với hình ảnh này. 563 00:35:23,460 --> 00:35:28,590 Tất cả điều đó xảy ra ở những nơi khác trên máy tính của bạn, có một số loại bảng. 564 00:35:28,590 --> 00:35:35,400 Đó là loại giống như một cheat sheet nhỏ mà nói rằng, hãy nói, resume.doc, 565 00:35:35,400 --> 00:35:40,920 do đó, hồ sơ của bạn trong một tập tin Word của Microsoft được sử dụng để sống ở vị trí 123 trên đĩa cứng của bạn, 566 00:35:40,920 --> 00:35:43,710 không phải trong bộ nhớ và không có trong bộ nhớ RAM, nhưng trên đĩa cứng của bạn, 567 00:35:43,710 --> 00:35:49,050 và JPEG sơ sài của bạn cuộc sống tại 456, và Excel tập tin của bạn sống tại 789 hoặc bất cứ nơi nào. 568 00:35:49,050 --> 00:35:53,640 Khi bạn xóa các tập tin bằng cách thực sự dọn sạch thùng rác hoặc thùng rác, 569 00:35:53,640 --> 00:35:59,530 hình này không thay đổi. 0 và 1 trên ổ đĩa cứng của bạn không đi bất cứ nơi nào. 570 00:35:59,530 --> 00:36:03,930 Tuy nhiên, bảng này, cơ sở dữ liệu này của các loại, không thay đổi. 571 00:36:03,930 --> 00:36:08,750 Khi bạn xóa hồ sơ của bạn, nó là như tập tin bị xóa theo một nghĩa nào, 572 00:36:08,750 --> 00:36:12,790 nhưng tất cả các máy tính không được quên điều mà sống trên ổ đĩa cứng của bạn. 573 00:36:12,790 --> 00:36:17,870 0 và 1 mà soạn hồ sơ của bạn hoặc bất kỳ của những tập tin khác vẫn còn nguyên vẹn. 574 00:36:17,870 --> 00:36:21,960 >> Vì vậy, nếu bạn đã làm điều này vô tình, vẫn có một xác suất khác không 575 00:36:21,960 --> 00:36:25,800 mà bạn có thể phục hồi dữ liệu của bạn bằng cách sử dụng Norton Utilities hoặc một số phần mềm thương mại 576 00:36:25,800 --> 00:36:29,810 mà mục đích trong cuộc sống là tìm thấy 0 và 1 đã loại bị mồ côi, 577 00:36:29,810 --> 00:36:33,300 quên ở đây nhưng lại ở đây, để bạn có thể nhận được dữ liệu của bạn trở lại. 578 00:36:33,300 --> 00:36:38,410 Hoặc các nhà điều tra pháp y với cảnh sát hay FBI thực sự sẽ có một ổ cứng 579 00:36:38,410 --> 00:36:42,550 và thực sự cho các mẫu của số 0 và 1 mà trông giống như hình ảnh JPEG, trông giống như các tập tin Excel, 580 00:36:42,550 --> 00:36:46,400 và khôi phục lại chúng theo cách đó ngay cả khi máy tính đã quên chúng ở đó. 581 00:36:46,400 --> 00:36:49,820 Vì vậy, cách duy nhất để thực sự xóa dữ liệu, như chúng ta sẽ thảo luận trong tương lai, 582 00:36:49,820 --> 00:36:54,190 là để cọ rửa hoặc lau tập tin hoặc đĩa cứng bằng cách - 583 00:36:54,190 --> 00:36:56,540 Bạn có thể không thực sự có được loại bỏ của 0 và 1 584 00:36:56,540 --> 00:36:59,440 bởi vì nếu bạn muốn bắt đầu với một ổ đĩa cứng gigabyte 585 00:36:59,440 --> 00:37:02,380 và bạn muốn kết thúc với một ổ cứng megabyte nếu bạn thường xuyên được xóa, 586 00:37:02,380 --> 00:37:04,380 nghĩa đen, 0 và 1. 587 00:37:04,380 --> 00:37:06,310 Vì vậy, những gì bạn sẽ làm gì nếu bạn thực sự muốn bao gồm các bản nhạc của bạn 588 00:37:06,310 --> 00:37:10,510 và vấn đề cơ bản là vẫn còn 0 và 1 trên đĩa? 589 00:37:10,510 --> 00:37:14,930 Tôi nhìn thấy một người nào đó gesticulating rằng bạn có thể chất sẽ phá vỡ các thiết bị. Điều đó sẽ làm việc. 590 00:37:14,930 --> 00:37:19,600 [Cười] Nhưng nếu đó là loại của một giải pháp đắt tiền, những gì sẽ là hợp lý hơn? 591 00:37:19,600 --> 00:37:23,270 Yeah. >> [Sinh viên] Ghi đè lên chúng. >> Ghi đè lên chúng với những gì? >> [Sinh viên] Các dữ liệu khác. 592 00:37:23,270 --> 00:37:29,070 Các dữ liệu khác. Bạn chỉ có thể ghi đè lên đĩa cứng của bạn với số 0 hoặc 1 hoặc tất cả các số 0, tất cả 1s. 593 00:37:29,070 --> 00:37:31,230 >> Và đó là thực sự những gì một số phần mềm không. 594 00:37:31,230 --> 00:37:33,570 Bạn có thể mua phần mềm hoặc thậm chí có được phần mềm miễn phí, 595 00:37:33,570 --> 00:37:36,610 và thậm chí được xây dựng trong hệ điều hành Mac OS những ngày này, ít như vậy trong Windows, 596 00:37:36,610 --> 00:37:38,660 là khả năng xóa an toàn. 597 00:37:38,660 --> 00:37:41,960 Trên thực tế, nếu bạn muốn tất cả nhà chạy ngày hôm nay nếu bạn có một máy Mac và làm điều này, 598 00:37:41,960 --> 00:37:45,740 nếu bạn đã có một số công cụ trong thùng rác của bạn có thể, bạn có thể làm Secure Empty Trash, 599 00:37:45,740 --> 00:37:47,610 mà không chính xác điều đó. 600 00:37:47,610 --> 00:37:53,350 Thay vì chỉ xóa các tập tin ở đây, nó không xóa ở đây 0 và 1, 601 00:37:53,350 --> 00:38:01,240 đúng hơn, nó chỉ thay đổi tất cả, ví dụ, số 0 và dấu chấm, dấu chấm, dấu chấm. 602 00:38:01,240 --> 00:38:05,330 Vì vậy, một psets tương lai của bạn sẽ thực sự là cố ý phục hồi dữ liệu - 603 00:38:05,330 --> 00:38:08,430 các bức ảnh mà chúng tôi đã lấy của người, địa điểm, và những thứ trong khuôn viên trường 604 00:38:08,430 --> 00:38:12,810 mà chúng ta sẽ làm cho một hình ảnh pháp y của thẻ nhớ máy ảnh kỹ thuật số, 605 00:38:12,810 --> 00:38:17,120 đó là cùng một ý tưởng chính xác - và bạn sẽ có được thử thách để thực sự tìm thấy 606 00:38:17,120 --> 00:38:20,160 các mô hình đại diện cho hình ảnh JPEG trên ổ đĩa cứng của bạn, 607 00:38:20,160 --> 00:38:23,610 giống như là cựu sinh viên có email, tôi đọc một vài tuần trước 608 00:38:23,610 --> 00:38:25,860 để khôi phục lại hình ảnh của em gái mình. 609 00:38:25,860 --> 00:38:30,300 Tại sao chúng ta không mất một break 5-phút ở đây, và chúng tôi sẽ tập hợp lại với nhiều bộ nhớ. 610 00:38:33,030 --> 00:38:38,610 Vì vậy, đây là nơi mà mọi thứ có được một chút tâm-uốn, nhưng đây là một bước rất mạnh mẽ 611 00:38:38,610 --> 00:38:40,480 để hiểu được điều này tất cả các chi tiết. 612 00:38:40,480 --> 00:38:42,900 Đây là một chương trình được gọi là pointers.c. 613 00:38:42,900 --> 00:38:45,430 Nó là một trong những mẫu mã ngày nay. 614 00:38:45,430 --> 00:38:51,280 Chú ý rằng trong vài dòng đầu tiên, từ 19 đến 22, tất cả những gì chúng ta đang làm là một cái gì đó giống như GetString 615 00:38:51,280 --> 00:38:54,460 và trả về một địa chỉ, lưu trữ nó trong s. 616 00:38:54,460 --> 00:38:58,380 Từ nay trở đi cho pset thậm chí 3 nếu bạn muốn nhưng pset 4 và 617 00:38:58,380 --> 00:39:01,030 nơi bạn có thể bắt đầu để có những bánh xe đào tạo ra mình, 618 00:39:01,030 --> 00:39:04,030 không có lý do để giả vờ rằng chuỗi tồn tại nữa. 619 00:39:04,030 --> 00:39:07,030 Đó chắc chắn không sao chỉ cần bắt đầu nói char *. 620 00:39:07,030 --> 00:39:12,610 >> Một sang một bên, trong các tài liệu tham khảo trực tuyến và trong cuốn sách, bạn thường có thể nhìn thấy ngôi sao bên cạnh các biến. 621 00:39:12,610 --> 00:39:15,600 Bạn thậm chí có thể nhìn thấy không gian xung quanh cả hai mặt của nó. 622 00:39:15,600 --> 00:39:17,680 Tất cả những người có chức năng chính xác. 623 00:39:17,680 --> 00:39:21,180 Bây giờ, mặc dù, chúng tôi sẽ chuẩn hóa trên phương pháp tiếp cận này để làm cho siêu rõ ràng 624 00:39:21,180 --> 00:39:24,000 rằng * char là giống như nói rằng con trỏ ký tự. 625 00:39:24,000 --> 00:39:25,680 Đó là các kiểu dữ liệu. 626 00:39:25,680 --> 00:39:28,730 Và sau đó là tên của biến s trong trường hợp này. 627 00:39:28,730 --> 00:39:31,180 Vì vậy, chúng tôi đã nhận được một chuỗi và chúng tôi đã gọi nó là s. 628 00:39:31,180 --> 00:39:35,180 Và sau đó xuống đây nhận thấy rằng tôi đang làm thực sự là một chút thủ đoạn gian trá. 629 00:39:35,180 --> 00:39:39,080 Điều này được gọi là con trỏ số học, được sắp xếp đơn giản siêu. 630 00:39:39,080 --> 00:39:41,790 Nó chỉ có nghĩa là cộng và trừ các số cho con trỏ. 631 00:39:41,790 --> 00:39:43,660 Nhưng điều này thực sự hoạt động. 632 00:39:43,660 --> 00:39:49,170 Chương trình này dường như in nhân vật 1 chuỗi s trên mỗi dòng như vậy mà kết quả cuối cùng - 633 00:39:49,170 --> 00:39:54,920 Để chúng tôi có thể làm hỏng nơi này là đi, làm cho con trỏ, chạy con trỏ, cho tôi phóng to. 634 00:39:54,920 --> 00:39:58,940 Bây giờ hãy để tôi một cái gì đó giống như Hello và nhấn Enter 635 00:39:58,940 --> 00:40:01,080 và nó in 1 ký tự trên mỗi dòng. 636 00:40:01,080 --> 00:40:04,730 Cho đến một giây trước đó, chúng tôi đã có thể làm điều này bằng các ký hiệu khung hình vuông. 637 00:40:04,730 --> 00:40:09,760 Chúng tôi muốn có một vòng lặp for và chúng tôi muốn làm printf của s [i] và chúng tôi muốn làm điều đó một lần nữa và một lần nữa và một lần nữa 638 00:40:09,760 --> 00:40:11,950 với một n dấu gạch chéo ngược ở cuối mỗi dòng. 639 00:40:11,950 --> 00:40:16,800 Tuy nhiên, chương trình này là khác nhau. Chương trình này được sử dụng, nghĩa là, số học. 640 00:40:16,800 --> 00:40:18,860 Vì vậy, những gì đang xảy ra ở đây? 641 00:40:18,860 --> 00:40:24,720 Trước hết, trước khi vòng lặp này thậm chí thực hiện, những gì, chỉ để được rõ ràng, là thực sự? 642 00:40:24,720 --> 00:40:27,270 S là? >> [Sinh viên] Một địa chỉ. >> Một địa chỉ. 643 00:40:27,270 --> 00:40:32,980 >> Và đó là, trong trường hợp của hello, địa chỉ của ký tự đầu tiên trong từ ngữ đó, mà là h. 644 00:40:32,980 --> 00:40:37,370 Vì vậy, s, trong ví dụ này, địa chỉ của h. 645 00:40:37,370 --> 00:40:41,850 Vì vậy, nó có nghĩa là để làm s + i? 646 00:40:41,850 --> 00:40:46,280 Vâng, tôi bắt đầu từ 0 trong vòng lặp for. Chúng tôi đã thực hiện mà nhiều lần. 647 00:40:46,280 --> 00:40:49,760 Tôi sẽ đi đến độ dài của chuỗi, rõ ràng. 648 00:40:49,760 --> 00:40:53,950 Vì vậy, trên phiên đầu tiên của vòng lặp này, tôi rõ ràng là 0. 649 00:40:53,950 --> 00:41:01,740 Vì vậy, biểu thức này được nói s + i - đúng hơn, s +0- rằng rõ ràng là chỉ s. 650 00:41:01,740 --> 00:41:04,320 * Là những gì ở đây? 651 00:41:04,320 --> 00:41:08,530 Bây giờ chúng ta đang sử dụng các ngôi sao trong một cách hơi khác nhau. 652 00:41:08,530 --> 00:41:13,080 Hãy để tôi đi trước và thoát khỏi của t bởi vì chúng tôi đang thực hiện nói về t và các bản sao của s. 653 00:41:13,080 --> 00:41:15,540 Bây giờ chúng tôi chỉ muốn kể một câu chuyện liên quan đến s. 654 00:41:15,540 --> 00:41:20,090 Và như vậy tại thời điểm này, sau khi có kiểu chuỗi, thế giới của chúng ta trông khá giống như nó đã làm trước 655 00:41:20,090 --> 00:41:26,630 chỉ với s lưu trữ các địa chỉ h và nói chung chỉ vào chuỗi hello. 656 00:41:26,630 --> 00:41:33,170 Nếu tôi làm một dòng như * (s + i), chúng ta hãy cố gắng này ra. 657 00:41:33,170 --> 00:41:40,140 Vì vậy, * (s + i). Hãy để tôi đơn giản hóa này bởi vì đây là 0, vì vậy đây là * (+0). 658 00:41:40,140 --> 00:41:43,790 Vâng, chờ một phút. Đơn giản hóa hơn nữa. Đây là * (s). 659 00:41:43,790 --> 00:41:47,020 Vâng, bây giờ ngoặc là ngu ngốc, vì vậy bây giờ chúng ta hãy chỉ làm * s. 660 00:41:47,020 --> 00:41:50,540 Vì vậy, trong phiên đầu tiên của vòng lặp này, dòng đó sẽ được tô sáng, 26, 661 00:41:50,540 --> 00:41:53,650 là khá nhiều tương đương với in ấn này. 662 00:41:53,650 --> 00:41:56,040 Kiểu dữ liệu của s * là gì? 663 00:41:56,040 --> 00:42:00,770 Trong bối cảnh này, bởi vì ngôi sao sẽ xảy ra là bên cạnh s, 664 00:42:00,770 --> 00:42:04,930 nhưng cụ thể hơn, bởi vì chúng tôi không còn được tuyên bố, 665 00:42:04,930 --> 00:42:09,730 chúng ta không tạo ra một biến nữa, không có đề cập đến char * line 26, 666 00:42:09,730 --> 00:42:14,280 không có đề cập đến chuỗi từ khóa, chúng ta chỉ sử dụng một biến gọi là s, 667 00:42:14,280 --> 00:42:19,650 nó quay ra ngôi sao có hơi khác nhau, và phải thừa nhận rằng, khó hiểu ý nghĩa. 668 00:42:19,650 --> 00:42:26,590 * S ở đây có nghĩa là đi đến địa chỉ trong và in bất cứ điều gì là có. 669 00:42:26,590 --> 00:42:33,750 Vì vậy, s là ở đây, * s là loại như Chutes and Ladders, theo các mũi tên - ở đây. 670 00:42:33,750 --> 00:42:35,850 Vì vậy, đây là * s. 671 00:42:35,850 --> 00:42:39,060 >> Vì vậy, những gì được in trên phiên đầu tiên của vòng lặp đó trong dòng 26? 672 00:42:39,060 --> 00:42:42,170 Tôi in ra% c, đó là giữ chỗ cho một nhân vật, 673 00:42:42,170 --> 00:42:48,520 sau đó \ n cho một dòng mới. * (S + i) nơi mà tôi có là 0 là chỉ này. 674 00:42:48,520 --> 00:42:53,670 Vì vậy, những gì char để tôi đặt cho c%? H. 675 00:42:53,670 --> 00:42:56,900 Trong phiên bản kế tiếp của vòng lặp - có thể bạn có thể nhìn thấy nơi này là đi - 676 00:42:56,900 --> 00:43:01,350 lặp đi lặp lại tiếp theo tôi rõ ràng là 1, do đó, điều này có nghĩa là s +1, 677 00:43:01,350 --> 00:43:05,580 và sau đó bây giờ tôi không cần dấu ngoặc đơn bởi vì bây giờ các ngôi sao cần phải nói 678 00:43:05,580 --> 00:43:08,620 đi đến địa chỉ bộ nhớ s +1. 679 00:43:08,620 --> 00:43:14,170 S là gì? Hãy quay trở lại trong thời gian và nói mũi tên này giờ không thực sự làm chúng tôi bất kỳ ân huệ. 680 00:43:14,170 --> 00:43:18,450 Hãy cụ thể hơn nói rằng đó là lưu trữ 123 số 681 00:43:18,450 --> 00:43:25,110 vì sự bắt đầu của chuỗi này hello, đây là địa chỉ 123, 124, và vv. 682 00:43:25,110 --> 00:43:30,550 Vì vậy, trên lặp thứ hai khi tôi đang nói s 1, như nói 123 +1, 683 00:43:30,550 --> 00:43:35,340 nếu không được biết đến là 124, vì vậy những gì char được in trên lặp thứ hai? 684 00:43:35,340 --> 00:43:37,850 E ở địa chỉ bộ nhớ 124. 685 00:43:37,850 --> 00:43:44,440 Sau đó + một lần nữa, 125, 126, 127, và vòng lặp này may mắn dừng lại trước khi chúng tôi nhận được ở đây 686 00:43:44,440 --> 00:43:49,040 bởi vì tôi đang sử dụng strlen để làm cho chắc chắn rằng tôi không tính quá cao. 687 00:43:49,040 --> 00:43:50,810 Vì vậy, đó cũng là nó. 688 00:43:50,810 --> 00:43:55,000 Một lần nữa, điều này giống như chúng ta đã thực hiện một tuần trước đây. 689 00:43:55,000 --> 00:43:59,200 Hãy để tôi viết nó trên hàng dưới đây mặc dù chúng ta không muốn làm cả hai. 690 00:43:59,200 --> 00:44:02,500 Này giống hệt này. 691 00:44:02,500 --> 00:44:08,310 >> Vì vậy, mặc dù s là một chuỗi, như chúng ta đã gọi nó cho tuần, s thực sự là một *. 692 00:44:08,310 --> 00:44:13,270 Vì vậy, nếu chúng ta muốn được siêu hậu môn, nó thực sự thích hợp để viết các nhân vật cụ thể 693 00:44:13,270 --> 00:44:17,490 tại vị trí thứ i bằng cách sử dụng các địa chỉ số và nhà điều hành ngôi sao này, 694 00:44:17,490 --> 00:44:20,470 nhưng thẳng thắn, đây là sạch hơn rất nhiều. Vì vậy, điều này không phải là xấu. 695 00:44:20,470 --> 00:44:26,720 Không có lý do gì để ngăn chặn dòng 27 ở đây, nhưng 26 là chức năng giống nhau, 696 00:44:26,720 --> 00:44:31,570 và đó là chức năng tương tự cho chính xác những lý do mà chúng tôi đã thảo luận cho đến nay. 697 00:44:31,570 --> 00:44:33,650 Và cuối cùng, 29 là chỉ thực hành tốt. 698 00:44:33,650 --> 00:44:38,420 Gọi điện thoại miễn phí của s có nghĩa là bây giờ bạn đang đem lại cho trở lại bộ nhớ mà GetString cho bạn 699 00:44:38,420 --> 00:44:41,630 vì một lần nữa, như tôi đã đề cập Thứ hai, GetString cho tuần 700 00:44:41,630 --> 00:44:44,180 đã được giới thiệu một lỗi vào mã của bạn. 701 00:44:44,180 --> 00:44:46,490 Mã của bạn cho tuần đã có rò rỉ bộ nhớ 702 00:44:46,490 --> 00:44:49,970 nhờ đó mà bạn đã được yêu cầu GetString cho bộ nhớ, nhưng bạn đã không bao giờ được cho nó trở lại. 703 00:44:49,970 --> 00:44:53,410 Và điều đó đã cố tình lựa chọn của chúng tôi sư phạm 704 00:44:53,410 --> 00:44:55,880 bởi vì nó chỉ là quá nhiều để suy nghĩ về sớm. 705 00:44:55,880 --> 00:44:57,710 Nhưng bây giờ chúng tôi cần đối xứng hơn. 706 00:44:57,710 --> 00:45:00,830 Nếu bạn yêu cầu máy tính cho bộ nhớ, như là trường hợp cho GetString, 707 00:45:00,830 --> 00:45:02,820 như là trường hợp rõ ràng cho malloc, 708 00:45:02,820 --> 00:45:07,970 Bây giờ bạn phải cho 4 trở đi pset cũng miễn phí bất kỳ bộ nhớ như vậy. 709 00:45:07,970 --> 00:45:11,650 Chú ý điều này là khác nhau từ nói n int. 710 00:45:11,650 --> 00:45:15,040 Bạn không cần phải miễn phí này bởi vì bạn đã không gọi GetString 711 00:45:15,040 --> 00:45:16,890 và bạn đã không gọi malloc. 712 00:45:16,890 --> 00:45:20,610 >> Và thậm chí nếu bạn được gọi là getInt như chúng ta cuối cùng sẽ thấy, 713 00:45:20,610 --> 00:45:25,520 GetInt không cấp phát bộ nhớ cho bạn bởi vì bạn thực sự có thể vượt qua khoảng số nguyên 714 00:45:25,520 --> 00:45:29,430 và phao nổi và các ký tự chỉ là cách chúng tôi đã làm trong nhiều tuần. 715 00:45:29,430 --> 00:45:33,960 Strings, mặc dù, là đặc biệt bởi vì thực sự họ là những nối của nhiều ký tự. 716 00:45:33,960 --> 00:45:37,450 Vì vậy, chúng chỉ khác nhau từ các ký tự và phao nổi và ints và muốn. 717 00:45:37,450 --> 00:45:39,980 Nhưng chúng tôi sẽ quay trở lại mà chẳng bao lâu. 718 00:45:39,980 --> 00:45:44,920 Bất kỳ câu hỏi sau đó vào đầu con trỏ? Yeah. 719 00:45:44,920 --> 00:45:49,690 [Câu hỏi sinh viên không nghe được] 720 00:45:49,690 --> 00:45:51,440 Ah, câu hỏi rất tốt. 721 00:45:51,440 --> 00:45:55,790 Một trong số ít những thứ C thực hiện cho bạn, đó là vị trí thuận tiện, 722 00:45:55,790 --> 00:46:00,110 là nó ra cho bạn những gì kích thước của kiểu dữ liệu 723 00:46:00,110 --> 00:46:03,060 và sau đó là loại nhân cho bạn. 724 00:46:03,060 --> 00:46:06,610 Điều này là không thích hợp trong trường hợp của các ký tự bởi vì hầu như luôn luôn char là 1 byte, 725 00:46:06,610 --> 00:46:08,150 do đó, điều này chỉ hoạt động. 726 00:46:08,150 --> 00:46:11,220 Tuy nhiên, vì lợi ích của cuộc thảo luận, nếu bạn đã thực sự in số nguyên 727 00:46:11,220 --> 00:46:15,500 và bạn đã cố gắng để in ra một số giá trị đã được chỉ vào một số nguyên, 728 00:46:15,500 --> 00:46:20,720 bạn tương tự như vậy sẽ không cần phải làm + 4 * i chỉ vì một int là 4 byte. 729 00:46:20,720 --> 00:46:25,780 Con trỏ số học có nghĩa là C và trình biên dịch làm tất cả những toán học cho bạn. 730 00:46:25,780 --> 00:46:29,190 Tất cả những gì bạn phải quan tâm là kiểm loại của ý thức con người. Yeah. 731 00:46:29,190 --> 00:46:35,200 [Sinh viên] Nếu bạn khai báo một chuỗi bên trong một vòng lặp for, bạn có để giải phóng nó sau này? 732 00:46:35,200 --> 00:46:36,760 Tốt câu hỏi. 733 00:46:36,760 --> 00:46:41,390 >> Nếu bạn tuyên bố bên trong chuỗi cho vòng lặp, bạn có cần để giải phóng nó sau này? 734 00:46:41,390 --> 00:46:47,520 Bạn chỉ cần bộ nhớ miễn phí mà bạn phân bổ với GetString hoặc với malloc. 735 00:46:47,520 --> 00:46:53,110 Vì vậy, nếu bạn chỉ cần nói một cái gì đó như thế - cho tôi đặt dấu ngoặc nhọn do đó, tất cả các mã có liên quan. 736 00:46:53,110 --> 00:46:58,580 Nếu bạn đã làm một cái gì đó, mặc dù buggily, như thế này, char * t = s, 737 00:46:58,580 --> 00:47:03,450 bạn không cần phải miễn phí t vì t không liên quan đến bất kỳ đề cập đến malloc hoặc GetString. 738 00:47:03,450 --> 00:47:08,960 Nếu ngược lại, bạn đã làm điều này, GetString, sau đó có, bạn sẽ cần đến t miễn phí. 739 00:47:08,960 --> 00:47:14,350 Và trên thực tế, cơ hội duy nhất của bạn để làm điều đó bây giờ là bên trong vòng lặp này, đối với cùng một vấn đề phạm vi 740 00:47:14,350 --> 00:47:16,060 mà chúng tôi đã thảo luận trong quá khứ. 741 00:47:16,060 --> 00:47:18,830 Nếu không, bạn sẽ được cấp phát bộ nhớ, cấp phát bộ nhớ, cấp phát bộ nhớ, 742 00:47:18,830 --> 00:47:21,230 và ở phần cuối của chương trình bởi vì bạn đang ở bên ngoài vòng lặp, 743 00:47:21,230 --> 00:47:24,240 t không tồn tại, nhưng bạn không bao giờ nói với hệ điều hành 744 00:47:24,240 --> 00:47:26,750 mà bạn không cần phải có bộ nhớ nữa. 745 00:47:26,750 --> 00:47:30,430 Không lâu sau, cho pset 4 hoặc 5 chúng tôi sẽ trang bị cho bạn với một chương trình được gọi là Valgrind, 746 00:47:30,430 --> 00:47:34,160 đó là tinh thần tương tự GDB trong đó nó có phần nào của một giao diện phức tạp, 747 00:47:34,160 --> 00:47:35,750 nhưng mục đích của nó trong cuộc sống là để giúp bạn. 748 00:47:35,750 --> 00:47:39,380 Và Valgrind là một chương trình mà trong tương lai sẽ tìm kiếm các chương trình của bạn 749 00:47:39,380 --> 00:47:42,550 tìm kiếm rò rỉ bộ nhớ, cho dù từ GetString hay malloc, 750 00:47:42,550 --> 00:47:47,800 mà chúng ta sẽ bắt đầu sử dụng nhiều như chúng tôi dừng lại bằng cách sử dụng thư viện CS50 càng nhiều. 751 00:47:47,800 --> 00:47:53,030 Chúng tôi cuối cùng đã có loại của từ vựng và sắp xếp các mô hình tinh thần trong lý thuyết 752 00:47:53,030 --> 00:47:55,170 để giải quyết chương trình này bị hỏng. 753 00:47:55,170 --> 00:47:59,410 >> Vì vậy, trong chương trình này bị hỏng, trao đổi hoạt động bên trong vùng trao đổi, 754 00:47:59,410 --> 00:48:05,280 nhưng nó không bao giờ thực sự làm việc trong chính bởi vì chính thông qua tại x và y, thu hồi, 755 00:48:05,280 --> 00:48:07,260 và những người đã được thông qua tại bởi các giá trị, do đó, để nói chuyện. 756 00:48:07,260 --> 00:48:09,330 Bản sao của chúng đã được đưa ra để trao đổi. 757 00:48:09,330 --> 00:48:12,520 Đến cuối vùng trao đổi, a và b đã thực sự được trao đổi, 758 00:48:12,520 --> 00:48:16,120 nhưng tất nhiên x và y, như chúng ta đã thảo luận Thứ hai, đã không. 759 00:48:16,120 --> 00:48:19,940 Vì vậy, tôi đề nghị màu xanh lá cây ở đây rằng điều này thực sự là giải pháp ở đây. 760 00:48:19,940 --> 00:48:22,640 Và thực sự, hãy để tôi di chuyển sao của tôi chỉ để phù hợp 761 00:48:22,640 --> 00:48:24,440 mặc dù, một lần nữa, chức năng này không quan trọng. 762 00:48:24,440 --> 00:48:28,730 Trong những tuần trong tương lai, chúng tôi sẽ giải thích khi nào và lý do tại sao nó không thành vấn đề. 763 00:48:28,730 --> 00:48:30,600 Vì vậy, màu xanh lá cây là một giải pháp. 764 00:48:30,600 --> 00:48:33,700 Thẳng thắn mà nói, có vẻ một toàn bộ rất nhiều hỗn độn bởi vì tôi có tất cả những ngôi sao này. 765 00:48:33,700 --> 00:48:35,380 Hãy để tôi chỉ ra một điều. 766 00:48:35,380 --> 00:48:40,040 Dòng trên cùng ở đây, nơi nó nói int * a và int * b 767 00:48:40,040 --> 00:48:42,820 về cơ bản là làm điều tương tự như nó luôn luôn có. 768 00:48:42,820 --> 00:48:47,070 Nó được khai báo 2 đối số hoặc các thông số để trao đổi, 769 00:48:47,070 --> 00:48:49,940 là người đầu tiên trong số đó là một con trỏ int được gọi là một 770 00:48:49,940 --> 00:48:53,100 thứ hai trong số đó là một con trỏ int gọi là b. 771 00:48:53,100 --> 00:48:55,770 Điều duy nhất mà mới vào thời điểm này là một thực tế rằng có một ngôi sao ở đó. 772 00:48:55,770 --> 00:48:59,340 >> Điều đó có nghĩa là gì? Không phải là một int, b không phải là một int. 773 00:48:59,340 --> 00:49:04,100 Là địa chỉ của một int và b là địa chỉ của một int khác nhau. 774 00:49:04,100 --> 00:49:06,980 Ở đây, đây là nơi tôi thừa nhận C gây nhầm lẫn. 775 00:49:06,980 --> 00:49:09,790 Bây giờ chúng tôi đang sử dụng một ngôi sao, nhưng nó có ý nghĩa khác nhau trong bối cảnh này. 776 00:49:09,790 --> 00:49:13,150 Bởi vì chúng tôi không khai báo con trỏ như là chúng tôi đang ở đây, 777 00:49:13,150 --> 00:49:15,500 ở đây chúng tôi đang dereferencing vật. 778 00:49:15,500 --> 00:49:21,520 Vì vậy, về mặt kỹ thuật, ngôi sao trong bối cảnh này của dòng đầu tiên, thứ hai, và thứ ba bên trong vùng trao đổi 779 00:49:21,520 --> 00:49:24,560 được các nhà điều hành dereference, mà chỉ có nghĩa là đi đến đó. 780 00:49:24,560 --> 00:49:27,400 Vì vậy, chỉ cần ngón tay của tôi theo mũi tên để h, 781 00:49:27,400 --> 00:49:31,100 * Một phương tiện đi đến địa chỉ đó và tìm tôi int đó là có. 782 00:49:31,100 --> 00:49:34,250 * B có nghĩa là đi đến địa chỉ và vượt qua những gì đang có. 783 00:49:34,250 --> 00:49:40,730 Vì vậy, hãy vẽ lại hình ảnh từ thứ hai bằng cách sử dụng một ngăn xếp của khung hình, 784 00:49:40,730 --> 00:49:43,130 một trong những dưới cùng trong số đó là có được chính, 785 00:49:43,130 --> 00:49:47,600 trên một trong những số đó là có được trao đổi, 786 00:49:47,600 --> 00:49:50,880 do đó, giống như Thứ hai, thế giới của chúng ta trông như thế này. 787 00:49:50,880 --> 00:49:53,620 Dưới đây là một đoạn bộ nhớ chính được sử dụng. 788 00:49:53,620 --> 00:49:56,520 >> Nhớ lại từ thứ Hai rằng chương trình chỉ có 2 biến, 789 00:49:56,520 --> 00:50:01,930 một gọi là x và một gọi là y, và tôi đã đặt các con số 1 và 2 có. 790 00:50:01,930 --> 00:50:06,580 Bây giờ khi tôi gọi trao đổi như tôi đã làm ngày Thứ hai, 791 00:50:06,580 --> 00:50:11,000 trước đây khi tôi sử dụng phiên bản màu đỏ của chương trình này, như thế này, 792 00:50:11,000 --> 00:50:17,470 Tôi có 2 thông số, a và b, và những gì chúng tôi đã viết ở đây và ở đây? 793 00:50:17,470 --> 00:50:21,160 Chỉ cần 1 và 2, nghĩa là bản sao của x và y. 794 00:50:21,160 --> 00:50:23,070 Hôm nay chúng ta thay đổi điều đó. 795 00:50:23,070 --> 00:50:28,510 Hôm nay thay vì đi qua trong ints a và b chúng ta sẽ phải vượt qua trong 2 địa chỉ. 796 00:50:28,510 --> 00:50:34,290 Những địa chỉ xảy ra chỉ để ints, nhưng những địa chỉ không ints mình. 797 00:50:34,290 --> 00:50:37,330 Họ là những địa chỉ. Nó giống như một địa chỉ bưu điện thay thế. 798 00:50:37,330 --> 00:50:40,580 Vì vậy, bây giờ chúng ta cần phải chỉ cho bản thân mình một chi tiết nhỏ hơn trên màn hình. 799 00:50:40,580 --> 00:50:43,250 Đây là bộ nhớ máy tính của tôi như nó được tất cả các ngày. 800 00:50:43,250 --> 00:50:45,120 Bây giờ chúng ta cần một số đề án đánh số tùy ý. 801 00:50:45,120 --> 00:50:50,580 Vì vậy, chúng ta hãy chỉ nói, chỉ tình cờ thấy rằng đây là địa chỉ bộ nhớ 123, 124. 802 00:50:50,580 --> 00:50:55,660 Chúng ta hãy chỉ nói điều này là 125, 126, và vân vân, nhưng đó là hoàn toàn tùy ý. 803 00:50:55,660 --> 00:50:58,590 Chúng ta chỉ cần một số đề án đánh số trong bộ nhớ của tôi. 804 00:50:58,590 --> 00:51:04,030 Vì vậy, bây giờ khi tôi thực sự vượt qua trong x và y, tôi sẽ không để vượt qua trong x và y; 805 00:51:04,030 --> 00:51:08,400 Tôi sẽ vượt qua trong địa chỉ bưu điện, có thể nói, của x và y 806 00:51:08,400 --> 00:51:11,870 do đó những gì được lưu trữ ở đây và ở đây không phải là 1 và 2, 807 00:51:11,870 --> 00:51:16,030 nhưng nếu bạn có thể xem văn bản nhỏ của tôi, những gì được thông qua tại đây và ở đây? 808 00:51:16,030 --> 00:51:23,340 [Không nghe được sinh viên phản ứng] >> Chính xác. 123 được đặt ở đây và 124 được đặt ở đây. 809 00:51:23,340 --> 00:51:28,910 >> Bây giờ, vì tôi đã sử dụng ngôi sao trong cách này, dòng đầu tiên lên đây ở đầu trang, 810 00:51:28,910 --> 00:51:34,340 chương trình của tôi chỉ biết rằng 123 và 124, mặc dù họ rõ ràng là số nguyên 811 00:51:34,340 --> 00:51:40,160 rằng bất kỳ con người có thể nhận thấy, họ nên được giải thích như là địa chỉ, địa chỉ số. 812 00:51:40,160 --> 00:51:43,250 Họ không phải là trong và của chính ints, họ, địa chỉ, 813 00:51:43,250 --> 00:51:46,120 và đó là bởi vì tôi đã đặt một cách rõ ràng ngôi sao ở đó. 814 00:51:46,120 --> 00:51:51,360 Vì vậy, bây giờ trong dòng đầu tiên, thứ hai, thứ ba của tôi và mã thực tế những gì xảy ra ở đây? 815 00:51:51,360 --> 00:51:53,380 Chúng ta hãy vẽ phần còn lại của hình ảnh. 816 00:51:53,380 --> 00:51:56,980 Tmp là giống như nó là vào hôm thứ Hai. Không có gì đặc biệt về tmp. 817 00:51:56,980 --> 00:52:03,060 Đó là chỉ là một 32 bit biến địa phương, và bên trong đó, tôi dường như lưu trữ các giá trị của một *. 818 00:52:03,060 --> 00:52:08,580 Bây giờ, nếu tôi chỉ nói tmp = a, những gì tôi sẽ đặt ở đây? >> [Sinh viên] 123. 819 00:52:08,580 --> 00:52:10,370 123. Nhưng đó không phải những gì tôi đang làm. 820 00:52:10,370 --> 00:52:13,670 Tôi đang nói tmp = * a. Sao có nghĩa là đi đến đó. 821 00:52:13,670 --> 00:52:19,370 Vì vậy, đây là một, 123. Làm thế nào để đi đến đó? Giả vờ như có một mũi tên. 822 00:52:19,370 --> 00:52:24,460 Vâng, đó là, 1. Vì vậy, những gì được lưu trữ trong tmp, rõ ràng? Chỉ cần 1. 823 00:52:24,460 --> 00:52:29,620 Vì vậy, nói cách khác, tmp * a, * là một phương tiện đi đến các địa chỉ hiện đang trong, 824 00:52:29,620 --> 00:52:31,320 mà rõ ràng là 123. 825 00:52:31,320 --> 00:52:33,910 >> Được rồi, ở đây chúng tôi đang ở vị trí 123, tôi thấy số 1, 826 00:52:33,910 --> 00:52:35,670 vì vậy tôi sẽ đưa số 1. 827 00:52:35,670 --> 00:52:39,020 Bây giờ tôi phải làm gì trong dòng 2, * a = * b? 828 00:52:39,020 --> 00:52:44,570 Điều này là một chút liên quan bởi vì bây giờ là gì? Đó là 123. 829 00:52:44,570 --> 00:52:50,220 Vì vậy, là ở đâu? Bên phải, nơi tôi đã được trước đó. Vì vậy, đi đến đó. Okay. 830 00:52:50,220 --> 00:52:53,420 Bây giờ, cuối cùng, và sau đó cuối cùng này sẽ bắt đầu có ý nghĩa, hy vọng, 831 00:52:53,420 --> 00:53:00,280 * B có nghĩa là những gì trong b? 124. Vì vậy, tôi cần phải đến đó, đó là 2. 832 00:53:00,280 --> 00:53:03,430 Vì vậy, tôi phải làm gì đặt ở đâu? 833 00:53:03,430 --> 00:53:10,100 2 đi vào đây vì * b đi vào * a. Vì vậy, tôi sẽ làm điều đó. 834 00:53:10,100 --> 00:53:13,120 Và bạn đã có thể nhìn thấy, có lẽ, rằng chúng tôi gần gũi hơn nhiều 835 00:53:13,120 --> 00:53:17,710 để giải quyết vấn đề này, ngu ngốc, đơn giản một cách chính xác cho lần đầu tiên 836 00:53:17,710 --> 00:53:20,920 bởi vì bây giờ chúng tôi vẫn còn có một hồi ức của những gì x là, 837 00:53:20,920 --> 00:53:23,230 chúng tôi có 2 bản, thừa nhận, y, 838 00:53:23,230 --> 00:53:25,850 nhưng dòng 3 * b. 839 00:53:25,850 --> 00:53:31,080 Vì vậy, đây là b. * B có nghĩa là đi đến đó. Vì vậy, nơi vị trí 124? 840 00:53:31,080 --> 00:53:35,560 Đó là rõ ràng ở đây. Vì vậy, tôi phải làm gì đặt ở đây? Rõ ràng, tmp. 841 00:53:35,560 --> 00:53:39,600 Vì vậy, bây giờ tôi làm điều này. Vì vậy, tôi có 1 ở đây và 2 ở đây. 842 00:53:39,600 --> 00:53:43,560 Và bây giờ những gì về tất cả điều này, 123, 124, và 1? 843 00:53:43,560 --> 00:53:47,910 Ngay sau khi trở về trao đổi, bộ nhớ này là tốt như bị mất 844 00:53:47,910 --> 00:53:51,070 bởi vì ngay sau khi trở về trao đổi, hệ điều hành 845 00:53:51,070 --> 00:53:54,190 là miễn phí để sử dụng bộ nhớ một lần nữa trong tương lai. 846 00:53:54,190 --> 00:53:58,870 Chỉ chính của bộ nhớ ở dưới cùng của chồng này được gọi là gậy xung quanh. 847 00:53:58,870 --> 00:54:01,470 >> Và vì vậy chúng tôi cuối cùng đã có bây giờ là một phiên bản làm việc. 848 00:54:01,470 --> 00:54:06,310 Hãy để tôi đi thành swap.c, và chú ý những điều sau đây. 849 00:54:06,310 --> 00:54:11,280 Ở phía trên của chương trình, tôi đã thay đổi nguyên mẫu của tôi để được int * a và int * b. 850 00:54:11,280 --> 00:54:15,000 Vì vậy, điều duy nhất tôi thay đổi từ màu đỏ, mà là xấu, màu xanh lá cây, đó là tốt, 851 00:54:15,000 --> 00:54:17,350 Tôi được thêm vào những ngôi sao này ngày hôm nay. 852 00:54:17,350 --> 00:54:21,520 Nhưng sau đó xuống đây trong trao đổi bản thân tôi đã sao chép, dán những gì đã được chỉ trên slide. 853 00:54:21,520 --> 00:54:24,140 Tôi có một ngôi sao ở đây, ngôi sao ở đây - đó phù hợp với các mẫu thử nghiệm - 854 00:54:24,140 --> 00:54:27,930 và sau đó tất cả những điều này bây giờ có sao trừ tmp 855 00:54:27,930 --> 00:54:30,680 bởi vì việc sử dụng một biến tạm thời, không có gì mới. 856 00:54:30,680 --> 00:54:33,040 Tôi chỉ cần lưu trữ tạm thời cho một int. 857 00:54:33,040 --> 00:54:34,820 Vì vậy, chúng ta không cần một ngôi sao. 858 00:54:34,820 --> 00:54:39,310 Chúng ta chỉ cần ngôi sao để chúng tôi có thể vượt qua ranh giới tùy ý 859 00:54:39,310 --> 00:54:42,900 giữa 2 khung hình trong bộ nhớ của máy tính của tôi. 860 00:54:42,900 --> 00:54:45,630 Tuy nhiên, một điều cuối cùng có thay đổi, và bạn có thể đã thoáng thấy nó đã. 861 00:54:45,630 --> 00:54:48,810 Gì khác dòng rõ ràng là khác nhau? >> [Sinh viên] & x. 862 00:54:48,810 --> 00:54:53,270 >> Yeah, vì vậy 25 là dòng cuối cùng của mã tôi cần phải thay đổi để làm việc này. 863 00:54:53,270 --> 00:54:58,360 Một tuần trước và ngay cả ngày thứ hai, dòng 25 trông như thế này, trao đổi x và y, 864 00:54:58,360 --> 00:55:02,020 và điều này đã được chỉ bị hỏng bởi vì nếu bạn nói swap (x, y) 865 00:55:02,020 --> 00:55:05,660 bạn đang đưa ra các bản sao của x và y để trao đổi, sau đó nó làm nhiệm vụ của nó, 866 00:55:05,660 --> 00:55:09,080 nhưng bạn sẽ không bao giờ thực sự thay đổi x và y chính nó. 867 00:55:09,080 --> 00:55:12,880 Vì vậy, ngay cả khi bạn đã không bao giờ nhìn thấy nhân vật này trước đây với các ký hiệu trong mã, 868 00:55:12,880 --> 00:55:15,860 chỉ mất một đoán. Dấu và làm gì, rõ ràng không? 869 00:55:15,860 --> 00:55:17,890 [Sinh viên] Đưa các địa chỉ. >> Đưa địa chỉ. 870 00:55:17,890 --> 00:55:21,160 Vì vậy, các dấu "và" nói cho tôi địa chỉ của x. 871 00:55:21,160 --> 00:55:25,590 Ai biết nó ở đâu? Nó sẽ xảy ra là 123. Tôi không quan tâm. Chỉ cần cho tôi địa chỉ của x. 872 00:55:25,590 --> 00:55:28,340 & Y có nghĩa là cung cấp cho tôi địa chỉ của y. 873 00:55:28,340 --> 00:55:34,450 Và tại thời điểm đó câu chuyện là hoàn toàn phù hợp với hình ảnh, chúng tôi đã thu hút một chút thời gian trước đây. 874 00:55:34,450 --> 00:55:38,310 >> Vì vậy, tôi sẽ thừa nhận con trỏ, chắc chắn đối với tôi khi tôi lần đầu tiên bắt đầu công việc này, 875 00:55:38,310 --> 00:55:40,570 chắc chắn là một trong những điều khó khăn nhất để bọc tâm trí của tôi xung quanh. 876 00:55:40,570 --> 00:55:43,760 Nhưng nhận ra, đặc biệt là khi chúng tôi tiếp tục chơi với những thứ này, 877 00:55:43,760 --> 00:55:48,030 nếu bạn phá vỡ nó xuống để những siêu sắp xếp đơn giản của trí tuệ uninteresting vấn đề 878 00:55:48,030 --> 00:55:52,270 chỉ cần chuyển một số lượng xung quanh, câu trả lời cho rất nhiều nhầm lẫn với con trỏ 879 00:55:52,270 --> 00:55:56,590 thực sự có thể được bắt nguồn từ những cơ chế rất cơ bản. 880 00:55:56,590 --> 00:55:59,070 Dưới đây là một địa chỉ. Đến đó với ngôi sao. 881 00:55:59,070 --> 00:56:03,830 Hoặc ngược lại, đây là một dấu "và". Tìm ra địa chỉ thực sự là. 882 00:56:03,830 --> 00:56:06,270 Được rồi. 883 00:56:06,270 --> 00:56:09,000 Vì vậy, nơi tất cả các bộ nhớ này đến từ đâu? 884 00:56:09,000 --> 00:56:12,360 Chúng tôi đã vẽ bức tranh này một vài lần, và tôi tiếp tục hứa hẹn chúng tôi sẽ trở lại với nó, 885 00:56:12,360 --> 00:56:14,920 nhưng ở đây là các đại diện của bộ nhớ máy tính của bạn 886 00:56:14,920 --> 00:56:17,420 đó là một chút dán nhãn hơn so với bảng đen của chúng tôi ở đây là. 887 00:56:17,420 --> 00:56:21,590 Đoạn văn bản ở đầu đại diện cho những gì liên quan đến chương trình của bạn? 888 00:56:21,590 --> 00:56:26,090 [Không nghe được sinh viên phản ứng] >> Xin lỗi? Nói một lần nữa. 889 00:56:26,090 --> 00:56:28,660 [Sinh viên] chương trình thực tế. >> Chương trình thực tế. 890 00:56:28,660 --> 00:56:32,430 >> Vì vậy, các Clang 0 và 1 mà bạn đã biên soạn sau khi viết mã C và sau đó chạy 891 00:56:32,430 --> 00:56:35,910 và tạo ra các kết thúc 0 và 1 cùng bị nhét trong bộ nhớ 892 00:56:35,910 --> 00:56:38,570 bởi vì khi bạn nhấp đúp chuột vào một biểu tượng trên máy Mac hoặc máy PC của bạn 893 00:56:38,570 --> 00:56:43,010 hoặc chạy một lệnh như Mario tại dấu nhắc của bạn, 0 và 1 của bạn từ đĩa 894 00:56:43,010 --> 00:56:45,700 có được nạp vào bộ nhớ để các máy tính có thể thao tác chúng 895 00:56:45,700 --> 00:56:47,540 và thực hiện chúng một cách nhanh chóng hơn. 896 00:56:47,540 --> 00:56:50,880 Vì vậy, khởi tạo dữ liệu và dữ liệu chưa được khởi tạo, chúng tôi sẽ không nói nhiều về những người, 897 00:56:50,880 --> 00:56:52,420 nhưng chỉ là những biến toàn cầu. 898 00:56:52,420 --> 00:56:54,710 Khởi tạo có nghĩa là các biến toàn cầu mà bạn đã cho giá trị để; 899 00:56:54,710 --> 00:56:59,300 uninitialized có nghĩa là các biến toàn cầu mà bạn đã chưa cung cấp cho các giá trị để. 900 00:56:59,300 --> 00:57:01,900 Sau đó có các biến môi trường mà tôi hoàn toàn sẽ vẫy tay của tôi, 901 00:57:01,900 --> 00:57:04,860 nhưng họ có và lưu trữ những thứ như tên người dùng của bạn 902 00:57:04,860 --> 00:57:08,090 và các loại chi tiết mức độ thấp hơn. 903 00:57:08,090 --> 00:57:12,880 Tuy nhiên, các mảnh juiciest bố trí bộ nhớ của bạn là điều này được gọi là stack và heap. 904 00:57:12,880 --> 00:57:17,470 Ngăn xếp một lần nữa, để được rõ ràng, là bộ nhớ được sử dụng bất cứ khi nào chức năng này được gọi là, 905 00:57:17,470 --> 00:57:19,710 bất cứ khi nào có các biến địa phương 906 00:57:19,710 --> 00:57:22,120 và bất cứ khi nào có thông số đang được thông qua xung quanh. 907 00:57:22,120 --> 00:57:24,490 Tất cả điều đó xảy ra trong ngăn xếp. 908 00:57:24,490 --> 00:57:29,570 Đống, chúng tôi đã không nói chuyện, nhưng có nhiều phán đoán những người sử dụng các đống. 909 00:57:31,120 --> 00:57:32,690 Chỉ cần một đoạn khác nhau của bộ nhớ. 910 00:57:32,690 --> 00:57:36,620 Nó xảy ra được rút ra ở đây ở đầu trang, nhưng đó là một quy ước bằng hình ảnh tùy ý. 911 00:57:36,620 --> 00:57:41,670 Ai rõ rệt đã được sử dụng bộ nhớ từ đống cho tuần? 912 00:57:41,670 --> 00:57:44,830 Đó là kỹ thuật bạn nhưng gián tiếp. >> [Sinh viên] GetString. 913 00:57:44,830 --> 00:57:47,950 GetString và malloc. Vì vậy, đây là sự khác biệt cơ bản. 914 00:57:47,950 --> 00:57:51,300 >> Bạn có biết trong vài tuần qua rằng nếu bạn cần bộ nhớ, chỉ cần khai báo một biến. 915 00:57:51,300 --> 00:57:54,560 Nếu bạn cần rất nhiều bộ nhớ, khai báo một mảng nằm ngay bên trong chức năng của bạn. 916 00:57:54,560 --> 00:57:59,620 Nhưng vấn đề chúng tôi đã giữ phải đối mặt với là nếu bạn khai báo các biến cục bộ bên trong các chức năng, 917 00:57:59,620 --> 00:58:05,340 ngay sau khi trở về chức năng, những gì xảy ra với bộ nhớ và các biến? 918 00:58:05,340 --> 00:58:09,620 Chỉ cần sắp xếp của nó không còn là của bạn, phải không? Nó chỉ biến mất loại khái niệm. 919 00:58:09,620 --> 00:58:13,950 Nó vẫn còn thể chất có, rõ ràng, nhưng nó không còn là quyền của bạn để sử dụng. 920 00:58:13,950 --> 00:58:17,160 Điều này rõ ràng là có vấn đề nếu bạn muốn viết các chức năng trong cuộc sống 921 00:58:17,160 --> 00:58:20,440 mà thực sự cấp phát bộ nhớ và không cho nó trở lại ngay lập tức. 922 00:58:20,440 --> 00:58:24,180 Trường hợp tại điểm: GetString mục đích trong cuộc sống là không có ý tưởng trước 923 00:58:24,180 --> 00:58:26,390 lớn như thế nào của một chuỗi tôi sẽ gõ vào bàn phím, 924 00:58:26,390 --> 00:58:30,390 nhưng nó có để có thể cấp phát bộ nhớ để giữ David hoặc hello 925 00:58:30,390 --> 00:58:32,860 hoặc toàn bộ một bài luận mà người sử dụng có thể đã gõ. 926 00:58:32,860 --> 00:58:35,280 Vì vậy, GetString đã được sử dụng malloc. 927 00:58:35,280 --> 00:58:38,910 Malloc do đó phải được sử dụng không phải ngăn xếp; 928 00:58:38,910 --> 00:58:40,770 thay vào đó nó sử dụng điều này được gọi là đống. 929 00:58:40,770 --> 00:58:44,430 Không có gì khác nhau về bộ nhớ. Nó không phải là nhanh hơn hoặc chậm hơn hoặc bất cứ điều gì như thế. 930 00:58:44,430 --> 00:58:46,570 Nó chỉ là thể chất ở một vị trí khác nhau. 931 00:58:46,570 --> 00:58:50,120 >> Tuy nhiên, quy tắc là bộ nhớ được cấp phát trên heap 932 00:58:50,120 --> 00:58:56,180 sẽ không bao giờ được lấy đi từ bạn cho đến khi bạn gọi một đoán miễn phí. 933 00:58:56,180 --> 00:59:00,510 Ngược lại, bất kỳ bộ nhớ, bạn yêu cầu trên các ngăn xếp bởi chỉ cần khai báo một mảng 934 00:59:00,510 --> 00:59:03,320 hoặc khai báo một biến như chúng tôi đã làm trong nhiều tuần, 935 00:59:03,320 --> 00:59:05,640 theo mặc định kết thúc trên stack. 936 00:59:05,640 --> 00:59:09,550 Và rằng hoạt động 90% thời gian, nhưng vào những dịp hiếm 937 00:59:09,550 --> 00:59:12,470 nơi bạn muốn cấp phát bộ nhớ và giữ nó xung quanh, 938 00:59:12,470 --> 00:59:14,730 sau đó bạn cần phải sử dụng một chức năng giống như malloc. 939 00:59:14,730 --> 00:59:19,370 Hay chúng ta đã sử dụng một chức năng như GetString, mà lần lượt sử dụng malloc. 940 00:59:19,370 --> 00:59:23,300 Hãy xem nơi này có thể phá vỡ và sau đó mất một peek tại Binky. 941 00:59:23,300 --> 00:59:25,820 Chúng tôi sẽ trở lại đó trong tương lai. 942 00:59:25,820 --> 00:59:29,270 Dưới đây là một chương trình đơn giản siêu trong 2 dòng đầu tiên làm những gì? 943 00:59:29,270 --> 00:59:33,460 Trong tiếng Anh, 2 dòng đầu tiên của mã gì bên trong của chính? 944 00:59:33,460 --> 00:59:35,600 [Không nghe được sinh viên phản ứng] 945 00:59:35,600 --> 00:59:37,880 Cẩn thận. Nó không cung cấp cho tôi địa chỉ của x hoặc y. 946 00:59:37,880 --> 00:59:41,840 [Sinh viên] Cung cấp cho con trỏ để ints. >> Good. Hãy cho tôi 2 con trỏ đến số nguyên. 947 00:59:41,840 --> 00:59:45,130 Nói cách khác, cho tôi 2 phần bộ nhớ mà tôi tiếp tục vẽ ngày hôm nay, 948 00:59:45,130 --> 00:59:46,950 mặc dù tôi xóa nó bây giờ, như hình vuông. 949 00:59:46,950 --> 00:59:50,000 Hãy cho tôi 2 phần bộ nhớ, một gọi là x, một gọi là y - 950 00:59:50,000 --> 00:59:54,320 trước đó tôi gọi họ s và t và các loại mà đoạn bộ nhớ là những gì? 951 00:59:54,320 --> 00:59:57,160 Nó sẽ lưu trữ một địa chỉ. 952 00:59:57,160 --> 00:59:59,110 Đó là kiểu int *. 953 00:59:59,110 --> 01:00:01,630 >> Vì vậy, các địa chỉ của một int cuối cùng sẽ sống trong x, 954 01:00:01,630 --> 01:00:03,860 địa chỉ của một int cuối cùng sẽ sống trong y, 955 01:00:03,860 --> 01:00:08,460 nhưng ban đầu, những gì bên trong của x và y? Ai biết được? Garbage giá trị. 956 01:00:08,460 --> 01:00:10,180 Nó không có gì để làm với con trỏ. 957 01:00:10,180 --> 01:00:12,720 Nếu chúng tôi không đặt một cái gì đó ở đó, những người hiểu biết những gì thực sự có? 958 01:00:12,720 --> 01:00:18,950 Bây giờ, x. Điều gì sẽ xảy ra đây? Điều này là VN bây giờ bởi vì x là một con trỏ. Đây là một int *. 959 01:00:18,950 --> 01:00:21,870 Vì vậy, điều đó có nghĩa là tôi có thể đặt trong x địa chỉ của một số đoạn bộ nhớ. 960 01:00:21,870 --> 01:00:25,120 Malloc gì trở lại? Hoàn hảo, nó sẽ trả về địa chỉ, 961 01:00:25,120 --> 01:00:28,510 địa chỉ của byte đầu tiên trong một đoạn toàn bộ bộ nhớ. 962 01:00:28,510 --> 01:00:31,140 Bao nhiêu byte này dường như phân bổ, ví dụ, trong thiết bị? 963 01:00:31,140 --> 01:00:33,510 Kích thước của một int là gì? 4. 964 01:00:33,510 --> 01:00:36,600 Nếu bạn nghĩ rằng trở lại 1 tuần, nó không phải là siêu quan trọng để luôn luôn nhớ rằng, 965 01:00:36,600 --> 01:00:38,870 nhưng trong trường hợp này đó là hữu ích để biết, 4 byte. 966 01:00:38,870 --> 01:00:41,770 Vì vậy, đây là phân bổ trên 4 byte đống 967 01:00:41,770 --> 01:00:46,110 và nó trở về địa chỉ của một trong những đầu tiên để tôi tùy tiện. 968 01:00:46,110 --> 01:00:47,700 Bây giờ, x đang làm gì? 969 01:00:47,700 --> 01:00:52,200 A * x = 42 là làm những gì? 970 01:00:52,200 --> 01:00:57,150 Nếu vào thời điểm này trong câu chuyện, chúng tôi có x, trông như thế này với một số giá trị rác, 971 01:00:57,150 --> 01:01:04,120 đây là bây giờ y với một số giá trị rác, bây giờ trong dòng 3, tôi đã được giao 4 byte. 972 01:01:04,120 --> 01:01:06,950 Hình ảnh này về cơ bản trông như thế này. 973 01:01:06,950 --> 01:01:12,010 Hoặc cụ thể hơn, nếu điều này là tùy ý địa chỉ 123, đây là câu chuyện của chúng tôi bây giờ trông giống như. 974 01:01:12,010 --> 01:01:23,940 * X = 42 bây giờ có nghĩa là gì? Điều đó có nghĩa là đi đến số 123 địa chỉ và số 42 có. 975 01:01:23,940 --> 01:01:26,220 Tôi không cần phải rút ra những dòng này bởi vì chúng ta không làm dây. 976 01:01:26,220 --> 01:01:29,480 >> Tôi có nên viết nó như thế này, và chỉ vì lợi ích trình diễn của, 977 01:01:29,480 --> 01:01:33,240 42 như một loại int của chiếm rất nhiều không gian, 4 byte. 978 01:01:33,240 --> 01:01:35,960 Vì vậy, đó là những gì đang xảy ra ở đó, nhưng có một vấn đề. 979 01:01:35,960 --> 01:01:40,580 * Y = 13. Điều gì sẽ xảy ra ở đây? 980 01:01:40,580 --> 01:01:46,470 Vấn đề là * y trên thế giới đơn giản của chúng tôi chỉ có nghĩa là đi đến địa chỉ trong y. 981 01:01:46,470 --> 01:01:48,590 Gì trong y? Đó là một số giá trị rác. 982 01:01:48,590 --> 01:01:53,150 Vì vậy, chúng ta hãy giả định rằng giá trị rác là 5551212, một cái gì đó điên rồ như thế. 983 01:01:53,150 --> 01:01:56,750 * Y có nghĩa là đi để giải quyết 5.551.212. 984 01:01:56,750 --> 01:02:00,450 Điều đó giống như ở đây. Nó không tồn tại, ví dụ. 985 01:02:00,450 --> 01:02:05,310 Vì vậy, * y được 13 có nghĩa là tôi đang cố gắng để vẽ 13 ở đây. Nó không tồn tại. 986 01:02:05,310 --> 01:02:08,790 Tôi đã vượt quá phân đoạn của bảng đen. Tôi nhận được gì? 987 01:02:08,790 --> 01:02:14,930 Đó là thông điệp bí ẩn phân khúc lỗi vì tôi đang cố gắng để đưa vào bộ nhớ 988 01:02:14,930 --> 01:02:19,470 một giá trị như 13 tại một địa điểm không tồn tại. 989 01:02:19,470 --> 01:02:23,900 Phần còn lại của chương trình có thể làm việc được, nhưng cho đến thời điểm đó nó không. 990 01:02:23,900 --> 01:02:25,350 Vì vậy, chúng ta hãy cố gắng kể câu chuyện này. 991 01:02:25,350 --> 01:02:27,830 Chúng tôi sẽ quay trở lại khi chúng tôi đã nói chuyện về hex. 992 01:02:27,830 --> 01:02:30,290 Hãy quay trở lại này và kết luận với điều này được gọi là Binky, 993 01:02:30,290 --> 01:02:33,710 thu hồi là một giáo sư Stanford ngồi ở nhà chơi với Claymation, 994 01:02:33,710 --> 01:02:36,380 để kể câu chuyện chính xác của chương trình đó. 995 01:02:36,380 --> 01:02:40,580 Nó chỉ khoảng 3 phút. Ở đây chúng tôi có Binky. 996 01:02:40,580 --> 01:02:45,030 [Male loa trên video] Hey Binky, dậy đi. Đó là thời gian cho vui con trỏ. 997 01:02:45,030 --> 01:02:50,080 [Binky] đó là gì? Tìm hiểu về con trỏ? Oh, goody! 998 01:02:50,080 --> 01:02:53,700 [Nam loa] Vâng, để bắt đầu, tôi đoán chúng ta sẽ cần một vài con trỏ. 999 01:02:53,700 --> 01:02:57,890 >> [Binky] Okay. Đoạn mã này cấp phát 2 con trỏ có thể trỏ đến số nguyên. 1000 01:02:57,890 --> 01:03:02,220 [Male loa] Okay. Vâng, tôi thấy 2 con trỏ, nhưng họ dường như không được trỏ đến bất cứ điều gì. 1001 01:03:02,220 --> 01:03:05,550 [Binky] Đó là đúng. Ban đầu, con trỏ không trỏ đến bất cứ điều gì. 1002 01:03:05,550 --> 01:03:09,270 Những điều họ chỉ được gọi là pointees, và thiết lập chúng là một bước riêng biệt. 1003 01:03:09,270 --> 01:03:12,330 [Nam loa] Oh, đúng, đúng. Tôi biết điều đó. Các pointees là riêng biệt. 1004 01:03:12,330 --> 01:03:15,630 Er, do đó, làm thế nào để bạn phân bổ một pointee? 1005 01:03:15,630 --> 01:03:21,510 [Binky] Okay. Mã này phân bổ một pointee số nguyên, và phần này đặt x để trỏ đến nó. 1006 01:03:21,510 --> 01:03:23,500 [Male loa] Hey, có vẻ tốt hơn. 1007 01:03:23,500 --> 01:03:26,030 Vì vậy, làm cho nó làm một cái gì đó. >> [Binky] Okay. 1008 01:03:26,030 --> 01:03:30,300 Tôi sẽ tới đích của con trỏ x để lưu trữ các số 42 được pointee của nó. 1009 01:03:30,300 --> 01:03:34,410 Cho trick này, tôi sẽ cần phải cây đũa thần của tôi dereferencing. 1010 01:03:34,410 --> 01:03:38,610 [Male loa] cây đũa thần của bạn dereferencing? Đó là tuyệt vời. 1011 01:03:38,610 --> 01:03:44,230 [Binky] Đây là những gì mã trông giống như. Tôi chỉ sẽ thiết lập số lượng và ... [Popping âm thanh] 1012 01:03:44,230 --> 01:03:46,100 [Male loa] nhìn, có nó đi. 1013 01:03:46,100 --> 01:03:50,990 Vì vậy, làm một dereference trên x sau mũi tên để truy cập pointee của nó, 1014 01:03:50,990 --> 01:03:53,230 trong trường hợp này để lưu trữ 42 trong đó. 1015 01:03:53,230 --> 01:03:57,630 Hey, hãy thử sử dụng nó để lưu trữ các số 13 thông qua con trỏ khác, y. 1016 01:03:57,630 --> 01:04:03,250 [Binky] Okay. Tôi sẽ chỉ đi qua đây y và con số 13 thiết lập 1017 01:04:03,250 --> 01:04:08,360 và sau đó lấy cây đũa phép của dereferencing và chỉ cần ... [Ù âm thanh] Whoa! 1018 01:04:08,360 --> 01:04:10,980 [Nam loa] Oh hey, mà không làm việc. 1019 01:04:10,980 --> 01:04:14,870 >> Nói, Binky, tôi không nghĩ rằng dereferencing y là một ý tưởng tốt 1020 01:04:14,870 --> 01:04:17,880 bởi vì thiết lập các pointee là một bước riêng biệt 1021 01:04:17,880 --> 01:04:19,850 và tôi không bao giờ nghĩ rằng chúng tôi đã làm nó. 1022 01:04:19,850 --> 01:04:21,770 [Binky] Hmm, điểm tốt. 1023 01:04:21,770 --> 01:04:26,640 [Male loa] Yeah. Chúng tôi phân bổ y con trỏ, nhưng chúng tôi không bao giờ thiết lập nó để trỏ đến một pointee. 1024 01:04:26,640 --> 01:04:28,780 [Binky] Hmm, rất giỏi quan sát. 1025 01:04:28,780 --> 01:04:30,690 [Nam loa] Hey, bạn đang tìm kiếm tốt, Binky. 1026 01:04:30,690 --> 01:04:34,160 Bạn có thể sửa chữa nó để y đến pointee giống như x? >> [Binky] Chắc chắn rồi. 1027 01:04:34,160 --> 01:04:37,100 Tôi sẽ sử dụng cây đũa thần của tôi giao con trỏ. 1028 01:04:37,100 --> 01:04:39,070 [] Loa nam là sẽ là một vấn đề như trước đây? 1029 01:04:39,070 --> 01:04:40,840 [Binky] Không, điều này không chạm vào các pointees. 1030 01:04:40,840 --> 01:04:44,780 Nó chỉ thay đổi một con trỏ để trỏ đến cùng một điều như là một. [Popping âm thanh] 1031 01:04:44,780 --> 01:04:48,570 [Male loa] Ồ, tôi nhìn thấy. Bây giờ y điểm đến cùng một nơi như x. 1032 01:04:48,570 --> 01:04:51,140 Vì vậy, chờ đợi. Bây giờ y được cố định. Nó có một pointee. 1033 01:04:51,140 --> 01:04:54,520 Vì vậy, bạn có thể thử cây đũa phép của dereferencing một lần nữa để gửi hơn 13. 1034 01:04:54,520 --> 01:04:58,130 [Binky] Uh, okay. Ở đây đi. [Popping âm thanh] 1035 01:04:58,130 --> 01:05:01,250 [Male loa] Hey, nhìn vào đó. Bây giờ dereferencing công trình về y. 1036 01:05:01,250 --> 01:05:05,200 Và bởi vì các con trỏ được chia sẻ là một trong những pointee, cả hai đều thấy số 13. 1037 01:05:05,200 --> 01:05:06,910 [Binky] Yeah, chia sẻ. Sao cũng được. 1038 01:05:06,910 --> 01:05:08,880 >> Vì vậy, chúng ta sẽ chuyển đổi địa điểm ngay bây giờ? 1039 01:05:08,880 --> 01:05:11,420 [Male loa] Oh nhìn, chúng tôi hết thời gian. >> [Binky] - 1040 01:05:11,420 --> 01:05:13,880 [Male loa] Chỉ cần nhớ 3 quy tắc con trỏ. 1041 01:05:13,880 --> 01:05:18,630 Number 1, cấu trúc cơ bản là bạn có một con trỏ và nó chỉ qua một pointee. 1042 01:05:18,630 --> 01:05:23,120 Nhưng con trỏ và pointee riêng biệt, và các lỗi phổ biến là để thiết lập một con trỏ 1043 01:05:23,120 --> 01:05:25,680 nhưng để quên để cho nó một pointee. 1044 01:05:25,680 --> 01:05:29,580 Số 2, con trỏ dereferencing bắt đầu từ con trỏ và sau mũi tên của nó trên 1045 01:05:29,580 --> 01:05:31,060 để truy cập pointee của nó. 1046 01:05:31,060 --> 01:05:34,340 Như chúng ta đều biết, điều này chỉ hoạt động nếu có pointee, 1047 01:05:34,340 --> 01:05:36,460 trong đó loại được trở lại để loại trừ số 1. 1048 01:05:36,460 --> 01:05:39,870 Số 3, con trỏ chuyển nhượng mất một con trỏ và thay đổi nó 1049 01:05:39,870 --> 01:05:42,390 để trỏ đến pointee giống như con trỏ khác. 1050 01:05:42,390 --> 01:05:45,890 Vì vậy, sau khi chuyển nhượng, 2 con trỏ sẽ trỏ đến cùng một pointee. 1051 01:05:45,890 --> 01:05:47,800 Đôi khi điều đó được gọi là chia sẻ. 1052 01:05:47,800 --> 01:05:50,910 >> Và đó là tất cả để có nó thực sự. Bye-bye. 1053 01:05:50,910 --> 01:05:55,840 Đây là Binky. Đây là CS50. Chúng ta sẽ thấy bạn vào tuần tới. [Vỗ tay] 1054 01:05:55,840 --> 01:05:59,000 >> [CS50.TV]