1 00:00:00,000 --> 00:00:11,320 2 00:00:11,320 --> 00:00:13,260 >> DAVID Malan: Xin chào, và chào đón trở lại CS50. 3 00:00:13,260 --> 00:00:14,860 Vì vậy, đây là kết thúc của tuần thứ tư. 4 00:00:14,860 --> 00:00:16,680 Chỉ cần một thông báo đầu tiên. 5 00:00:16,680 --> 00:00:19,600 Vì vậy, cái gọi là thứ năm thứ hai là sắp tới này Monday tới. 6 00:00:19,600 --> 00:00:22,800 Đây là cơ hội để thay đổi từ SAT / UNSAT một lớp thư, hoặc từ 7 00:00:22,800 --> 00:00:24,130 lớp thư SAT / UNSAT. 8 00:00:24,130 --> 00:00:27,130 Khó chịu, quá trình đó đòi hỏi một chữ ký, bởi vì bạn phải điền 9 00:00:27,130 --> 00:00:28,770 ra một trong những add / thả các hình thức màu hồng. 10 00:00:28,770 --> 00:00:31,680 >> Bởi vì về mặt kỹ thuật, SAT / UNSAT phiên bản và phiên bản cấp thư 11 00:00:31,680 --> 00:00:33,320 có số Danh mục riêng biệt. 12 00:00:33,320 --> 00:00:34,240 Nhưng không có việc lớn. 13 00:00:34,240 --> 00:00:36,620 Chỉ đến gặp tôi hoặc Rob hoặc Lauren tại bất kỳ điểm nào. 14 00:00:36,620 --> 00:00:39,550 Hoặc email cho chúng tôi nếu bạn không có các loại thủ tục giấy tờ bạn cần ngày hôm nay, và chúng tôi 15 00:00:39,550 --> 00:00:43,410 chắc chắn sẽ giúp bạn sóc đó trước thứ Hai. 16 00:00:43,410 --> 00:00:45,780 >> Được rồi, vì vậy hôm nay - 17 00:00:45,780 --> 00:00:47,630 trên thực tế, có một chút của một tiếng vang. 18 00:00:47,630 --> 00:00:51,070 Chúng tôi có thể giai điệu tôi xuống một chút? 19 00:00:51,070 --> 00:00:51,730 OK. 20 00:00:51,730 --> 00:00:54,850 Vì vậy, ngày hôm nay, chúng tôi giới thiệu một chủ đề được gọi là con trỏ. 21 00:00:54,850 --> 00:00:57,770 Và tôi sẽ thừa nhận rằng đây là một trong những chủ đề phức tạp hơn là chúng ta có xu hướng 22 00:00:57,770 --> 00:01:00,960 bao gồm trong nhóm này, hoặc thực sự bất kỳ khóa học giới thiệu sử dụng C. 23 00:01:00,960 --> 00:01:05,510 >> Nhưng dùng từ ngữ của tôi cho nó, đặc biệt nếu tâm trí của bạn cảm thấy một chút cong 24 00:01:05,510 --> 00:01:07,100 hôm nay và trong những tuần tới. 25 00:01:07,100 --> 00:01:10,340 Nó không phải là đại diện của bạn nhận được bất kỳ tồi tệ hơn lúc này nó chỉ có nghĩa là 26 00:01:10,340 --> 00:01:13,360 đó là một chủ đề đặc biệt phức tạp mà tôi hứa, một vài tuần 27 00:01:13,360 --> 00:01:17,610 do đó, sẽ có vẻ như tất cả các quá nổi bật đơn giản khi nhìn lại. 28 00:01:17,610 --> 00:01:18,720 >> Tôi vẫn còn nhớ đến ngày nay. 29 00:01:18,720 --> 00:01:22,190 Tôi đang ngồi trong Elliott Phòng ăn, ngồi bên cạnh TF tôi Nishat Mehta, 30 00:01:22,190 --> 00:01:24,070 là đối tượng cư trú của Elliott nhà. 31 00:01:24,070 --> 00:01:26,340 Và đối với một số lý do, điều này chủ đề chỉ nhấp chuột. 32 00:01:26,340 --> 00:01:29,430 Mà là để nói rằng tôi quá vất vả với nó cho một số lượng thời gian, nhưng tôi 33 00:01:29,430 --> 00:01:33,610 sẽ làm hết sức mình để tránh bất kỳ như vậy đấu tranh với một chủ đề mà cuối cùng 34 00:01:33,610 --> 00:01:34,580 là khá mạnh mẽ. 35 00:01:34,580 --> 00:01:37,350 >> Trong thực tế, một trong những chủ đề chúng ta sẽ thảo luận về trong những tuần tới là 36 00:01:37,350 --> 00:01:41,130 an ninh, và làm thế nào bạn có thể thực sự khai thác máy móc trong cách 37 00:01:41,130 --> 00:01:42,320 mà không được dự định. 38 00:01:42,320 --> 00:01:45,850 Và những người bóc lột thường là kết quả của lỗi, những sai lầm mà chúng ta 39 00:01:45,850 --> 00:01:49,740 người thực hiện bằng cách không hiểu biết một số việc thực hiện cơ bản 40 00:01:49,740 --> 00:01:52,250 chi tiết thông qua các chương trình được thực hiện. 41 00:01:52,250 --> 00:01:55,410 >> Bây giờ thực hiện điều này dường như tất cả người sử dụng hơn thân thiện, tôi nghĩ rằng tôi muốn chơi một 10 42 00:01:55,410 --> 00:01:59,680 xem trước thứ hai của một claymation ít con số có tên là Binky người đã được đưa đến 43 00:01:59,680 --> 00:02:03,020 cuộc sống của một người bạn của chúng ta tại Đại học Stanford, Giáo sư Nick Parlante. 44 00:02:03,020 --> 00:02:06,753 Vì vậy, cho phép tôi để cung cấp cho bạn này teaser Binky đây. 45 00:02:06,753 --> 00:02:09,520 >> [VIDEO xem lại] 46 00:02:09,520 --> 00:02:10,380 >> -Này, Binky. 47 00:02:10,380 --> 00:02:11,050 Thức dậy. 48 00:02:11,050 --> 00:02:13,610 Đó là thời gian cho con trỏ vui vẻ. 49 00:02:13,610 --> 00:02:14,741 >> -Cái gì thế? 50 00:02:14,741 --> 00:02:16,440 Tìm hiểu về con trỏ? 51 00:02:16,440 --> 00:02:17,928 Oh, goodie. 52 00:02:17,928 --> 00:02:18,920 >> [END xem video] 53 00:02:18,920 --> 00:02:20,670 >> DAVID Malan: Đó là Stanford khoa học máy tính. 54 00:02:20,670 --> 00:02:23,194 Vì vậy, thêm vào đó đi. 55 00:02:23,194 --> 00:02:24,930 >> [Vỗ tay] 56 00:02:24,930 --> 00:02:26,660 >> DAVID Malan: Xin lỗi, Nick. 57 00:02:26,660 --> 00:02:30,680 >> Vì vậy, nhớ lại rằng thời gian qua, chúng tôi đã kết thúc cliffhanger thực sự thú vị này 58 00:02:30,680 --> 00:02:32,960 theo đó chức năng này chỉ không làm việc. 59 00:02:32,960 --> 00:02:34,960 Ít nhất là trực giác, nó cảm thấy như nó phải làm việc. 60 00:02:34,960 --> 00:02:37,600 Chỉ đơn giản là trao đổi các giá trị của hai số nguyên. 61 00:02:37,600 --> 00:02:40,915 Nhưng nhớ lại rằng khi chúng ta in ra giá trị ban đầu trong chính, một trong và 62 00:02:40,915 --> 00:02:44,210 hai, họ vẫn còn một và hai và không hai và một. 63 00:02:44,210 --> 00:02:46,070 >> Vì vậy, hãy để tôi thực sự chuyển đổi hơn vào thiết bị. 64 00:02:46,070 --> 00:02:50,180 Và tôi đã viết lên một chút mã xương trong trước đây, mà tôi cho rằng x 65 00:02:50,180 --> 00:02:52,500 sẽ được 1, y sẽ là 2. 66 00:02:52,500 --> 00:02:54,810 Sau đó tôi in ra cả hai họ giá trị với in f. 67 00:02:54,810 --> 00:02:57,540 >> Sau đó tôi yêu cầu bồi thường xuống đây mà chúng ta sẽ trao đổi chúng. 68 00:02:57,540 --> 00:03:00,800 Tôi để lại một chỗ trống ở đây để chúng tôi điền vào hôm nay chỉ trong một thời điểm. 69 00:03:00,800 --> 00:03:03,380 Sau đó, tôi sẽ cho rằng hai biến đã được đổi chỗ. 70 00:03:03,380 --> 00:03:04,770 Sau đó, tôi sẽ in họ trở lại. 71 00:03:04,770 --> 00:03:07,090 Và vì vậy hy vọng, tôi phải thấy được 1, 2. 72 00:03:07,090 --> 00:03:07,380 2, 1. 73 00:03:07,380 --> 00:03:09,830 Đó là siêu đơn giản mục tiêu ngay bây giờ. 74 00:03:09,830 --> 00:03:12,430 >> Vì vậy, làm thế nào để chúng tôi đi về trao đổi hai biến? 75 00:03:12,430 --> 00:03:17,220 Vâng, nếu tôi đưa ra ở đây là các cốc có thể đại diện cho bộ nhớ trong máy tính. 76 00:03:17,220 --> 00:03:19,070 Đây là một vài miếng, điều này là một vài miếng. 77 00:03:19,070 --> 00:03:23,260 Có thể chúng ta có một tình nguyện đến trên và trộn chúng tôi một số đồ uống, nếu quen thuộc? 78 00:03:23,260 --> 00:03:23,920 Lên đây. 79 00:03:23,920 --> 00:03:24,815 Tên của bạn là gì? 80 00:03:24,815 --> 00:03:25,260 >> JESS: Jess. 81 00:03:25,260 --> 00:03:25,690 >> DAVID Malan: Jess? 82 00:03:25,690 --> 00:03:26,540 Lên đây, Jess. 83 00:03:26,540 --> 00:03:29,180 Nếu bạn không nhớ, chúng ta phải đặt Google Glass trên bạn vì vậy chúng tôi có thể 84 00:03:29,180 --> 00:03:30,430 bất tử này. 85 00:03:30,430 --> 00:03:32,800 86 00:03:32,800 --> 00:03:34,670 OK, thủy tinh. 87 00:03:34,670 --> 00:03:37,250 Quay video. 88 00:03:37,250 --> 00:03:43,103 Và OK, chúng tôi là tốt để đi với Jess đây. 89 00:03:43,103 --> 00:03:43,810 Được rồi. 90 00:03:43,810 --> 00:03:45,120 Hân hạnh được gặp bạn. 91 00:03:45,120 --> 00:03:47,720 >> Vì vậy, những gì tôi muốn bạn làm ở đây - nếu bạn có thể, khá nhanh chóng - 92 00:03:47,720 --> 00:03:51,040 chỉ đổ cho chúng tôi một nửa ly nước cam nước trái cây và một nửa ly sữa, 93 00:03:51,040 --> 00:03:55,710 đại diện có hiệu quả số 1 trong một ly và 2 trong cốc khác. 94 00:03:55,710 --> 00:04:01,380 95 00:04:01,380 --> 00:04:02,630 >> Điều này là có được cảnh quay tốt. 96 00:04:02,630 --> 00:04:04,910 97 00:04:04,910 --> 00:04:05,860 >> JESS: Xin lỗi. 98 00:04:05,860 --> 00:04:06,330 >> DAVID Malan: Không, không. 99 00:04:06,330 --> 00:04:08,703 Đó là OK. 100 00:04:08,703 --> 00:04:10,120 Tốt đẹp. 101 00:04:10,120 --> 00:04:12,950 Được rồi, vì vậy chúng tôi có bốn byte giá trị của nước cam. 102 00:04:12,950 --> 00:04:14,460 Chúng tôi sẽ gọi nó là giá trị 1. 103 00:04:14,460 --> 00:04:16,579 Bây giờ thêm bốn byte giá trị của sữa. 104 00:04:16,579 --> 00:04:18,519 Sẽ gọi nó là giá trị 2. 105 00:04:18,519 --> 00:04:20,440 Vì vậy, x và y tương ứng. 106 00:04:20,440 --> 00:04:23,450 >> Được rồi, vì vậy bây giờ nếu công việc ở bàn tay - cho bạn, Jess, trước mặt tất cả 107 00:04:23,450 --> 00:04:24,270 các bạn cùng lớp của bạn - 108 00:04:24,270 --> 00:04:28,510 là để trao đổi các giá trị của x và y như vậy mà chúng tôi muốn các nước cam trong 109 00:04:28,510 --> 00:04:32,070 cốc khác và sữa trong chén này, làm thế nào có thể giúp bạn - trước khi bạn thực sự làm 110 00:04:32,070 --> 00:04:34,020 nó - đi về việc này? 111 00:04:34,020 --> 00:04:35,220 >> OK, khôn ngoan quyết định. 112 00:04:35,220 --> 00:04:36,340 Vì vậy, bạn cần nhiều bộ nhớ hơn một chút. 113 00:04:36,340 --> 00:04:38,190 Vì vậy, chúng ta hãy tạm thời phân bổ một tách, nếu bạn sẽ. 114 00:04:38,190 --> 00:04:40,540 Và bây giờ tiến hành trao đổi x và y. 115 00:04:40,540 --> 00:04:52,950 116 00:04:52,950 --> 00:04:53,530 >> Tuyệt vời. 117 00:04:53,530 --> 00:04:54,420 Vì vậy, thực hiện rất tốt. 118 00:04:54,420 --> 00:04:55,670 Cảm ơn bạn rất nhiều, Jess. 119 00:04:55,670 --> 00:04:59,520 120 00:04:59,520 --> 00:05:00,020 Của bạn đây. 121 00:05:00,020 --> 00:05:01,950 Một món quà lưu niệm nhỏ. 122 00:05:01,950 --> 00:05:04,350 >> OK, vì vậy rõ ràng, ý tưởng siêu đơn giản. 123 00:05:04,350 --> 00:05:07,500 Hoàn toàn trực quan mà chúng ta cần một chút không gian lưu trữ nhiều hơn - trong hình thức này, 124 00:05:07,500 --> 00:05:09,750 một tách - nếu chúng ta thực sự muốn trao đổi hai biến. 125 00:05:09,750 --> 00:05:11,110 Vì vậy, chúng ta hãy làm chính xác điều đó. 126 00:05:11,110 --> 00:05:14,330 Lên đây ở giữa nơi tôi yêu cầu tôi sẽ được làm một số trao đổi, tôi sẽ 127 00:05:14,330 --> 00:05:15,720 đi trước và tuyên bố tạm thời. 128 00:05:15,720 --> 00:05:17,980 Và tôi sẽ thiết lập nó bằng, nói, x. 129 00:05:17,980 --> 00:05:21,110 >> Sau đó, tôi sẽ thay đổi giá trị của x giống như Jess đã làm ở đây với 130 00:05:21,110 --> 00:05:23,200 sữa và nước cam được bằng y. 131 00:05:23,200 --> 00:05:27,460 Và tôi sẽ thay đổi y để được bình đẳng để không x, bởi vì bây giờ chúng tôi sẽ 132 00:05:27,460 --> 00:05:29,530 bị mắc kẹt trong một vòng tròn, mà là tạm thời. 133 00:05:29,530 --> 00:05:33,170 Nơi tôi tạm thời - hoặc nơi Jess tạm thời đặt các nước cam 134 00:05:33,170 --> 00:05:35,460 trước khi clobbering mà cốc với sữa. 135 00:05:35,460 --> 00:05:37,250 >> Vì vậy, hãy để tôi đi trước bây giờ và làm cho điều này. 136 00:05:37,250 --> 00:05:39,210 Nó được gọi là noswap.c. 137 00:05:39,210 --> 00:05:41,190 Và bây giờ cho phép tôi chạy không trao đổi. 138 00:05:41,190 --> 00:05:43,910 Và thực sự tôi thấy, nếu tôi mở rộng cửa sổ một chút, mà 139 00:05:43,910 --> 00:05:45,160 x 1, y là 2. 140 00:05:45,160 --> 00:05:47,230 Và sau đó là 2 x, y là 1. 141 00:05:47,230 --> 00:05:51,910 >> Nhưng nhớ lại rằng vào thứ hai, chúng tôi đã làm những điều một chút khác nhau trong đó tôi 142 00:05:51,910 --> 00:05:56,760 thay vì thực hiện một chức năng trợ giúp, nếu bạn muốn, đó là thực sự hiệu. 143 00:05:56,760 --> 00:05:58,010 Tôi gọi nó là trao đổi. 144 00:05:58,010 --> 00:06:01,600 Tôi đưa cho nó hai tham số, và tôi được gọi là họ và tôi gọi chúng là b. 145 00:06:01,600 --> 00:06:04,380 >> Thành thật mà nói, tôi có thể gọi họ là x và y. 146 00:06:04,380 --> 00:06:06,040 Có gì ngăn cản là tôi từ làm điều đó. 147 00:06:06,040 --> 00:06:08,140 Nhưng tôi sẽ cho nó sau đó một chút mơ hồ. 148 00:06:08,140 --> 00:06:11,910 Bởi vì thu hồi cho hôm thứ Hai rằng chúng tôi tuyên bố rằng những thông số này 149 00:06:11,910 --> 00:06:13,650 các bản sao của các giá trị thông qua nhập 150 00:06:13,650 --> 00:06:15,640 Vì vậy, nó chỉ messes với bạn tâm trí, tôi nghĩ rằng, nếu bạn sử dụng 151 00:06:15,640 --> 00:06:17,370 chính xác các biến tương tự. 152 00:06:17,370 --> 00:06:20,150 >> Vì vậy, tôi thay vì sẽ gọi cho họ một và b, chỉ cần cho rõ ràng. 153 00:06:20,150 --> 00:06:21,840 Nhưng chúng ta có thể gọi họ là nhất bất cứ điều gì chúng ta muốn. 154 00:06:21,840 --> 00:06:26,280 Và tôi sẽ sao chép và dán hiệu quả mã này từ trên đó 155 00:06:26,280 --> 00:06:27,170 xuống đây. 156 00:06:27,170 --> 00:06:29,110 Bởi vì tôi chỉ thấy rằng nó hoạt động. 157 00:06:29,110 --> 00:06:30,790 Vì vậy, đó là trong hình dạng khá tốt. 158 00:06:30,790 --> 00:06:37,390 Và tôi sẽ thay đổi của tôi x một, tôi x một, y của tôi để b và y của tôi để b. 159 00:06:37,390 --> 00:06:39,130 >> Vì vậy, nói cách khác, cùng một logic chính xác. 160 00:06:39,130 --> 00:06:40,850 Cùng một điều chính xác mà Jess đã làm. 161 00:06:40,850 --> 00:06:44,350 Và sau đó là một điều tôi phải làm lên ở đây, tất nhiên, bây giờ gọi này 162 00:06:44,350 --> 00:06:45,990 chức năng, hoặc gọi chức năng này. 163 00:06:45,990 --> 00:06:50,430 Vì vậy, tôi sẽ gọi hàm này với hai đầu vào, x và y, và nhấn Save. 164 00:06:50,430 --> 00:06:52,300 >> Được rồi, vì vậy về cơ bản điều tương tự. 165 00:06:52,300 --> 00:06:55,570 Trong thực tế, tôi đã có thể thực hiện chương trình phức tạp không cần thiết bởi 166 00:06:55,570 --> 00:07:00,820 viết một chức năng đó chỉ dùng một số sáu dòng mã trong khi tôi 167 00:07:00,820 --> 00:07:02,970 trước đó đã thực hiện trong này chỉ ba. 168 00:07:02,970 --> 00:07:06,230 >> Vì vậy, hãy để tôi đi trước bây giờ và làm lại này, làm cho không có trao đổi. 169 00:07:06,230 --> 00:07:07,920 Được rồi, tôi hơi say lên đây. 170 00:07:07,920 --> 00:07:11,290 Điều này sẽ là một lỗi mà bạn có thể thấy ngày càng phổ biến như của bạn 171 00:07:11,290 --> 00:07:12,380 chương trình trở nên phức tạp hơn. 172 00:07:12,380 --> 00:07:13,470 Nhưng có một sửa chữa dễ dàng. 173 00:07:13,470 --> 00:07:15,650 Hãy để tôi di chuyển trở lại lên đây. 174 00:07:15,650 --> 00:07:18,190 >> Và các lỗi đầu tiên tôi nhìn thấy là những gì? 175 00:07:18,190 --> 00:07:19,520 Khai tiềm ẩn. 176 00:07:19,520 --> 00:07:21,466 Điều đó thường như thế nào? 177 00:07:21,466 --> 00:07:22,830 Oh, tôi quên mất nguyên mẫu. 178 00:07:22,830 --> 00:07:26,900 Tôi quên để dạy các trình biên dịch hoán đổi sẽ tồn tại mặc dù anh 179 00:07:26,900 --> 00:07:28,920 không tồn tại ngay từ đầu của chương trình. 180 00:07:28,920 --> 00:07:35,780 Vì vậy, tôi chỉ muốn nói có hiệu lực, trao đổi, int, int a, b, dấu chấm phẩy. 181 00:07:35,780 --> 00:07:37,280 >> Vì vậy, tôi sẽ không để reimplement nó. 182 00:07:37,280 --> 00:07:39,140 Nhưng bây giờ nó phù hợp với những gì ở đây. 183 00:07:39,140 --> 00:07:42,530 Và thông báo, trường hợp không có một dấu chấm phẩy ở đây, đó là không cần thiết khi 184 00:07:42,530 --> 00:07:43,200 triển khai thực hiện. 185 00:07:43,200 --> 00:07:46,010 >> Vì vậy, hãy để tôi làm lại điều này, chắc không trao đổi. 186 00:07:46,010 --> 00:07:46,910 Hình dạng tốt hơn nhiều. 187 00:07:46,910 --> 00:07:48,130 Chạy không trao đổi. 188 00:07:48,130 --> 00:07:48,740 Và chết tiệt. 189 00:07:48,740 --> 00:07:51,650 Bây giờ chúng tôi đang trở lại nơi chúng tôi vào thứ hai, nơi điều không trao đổi. 190 00:07:51,650 --> 00:07:55,410 >> Và giải thích trực quan là những gì cho lý do tại sao đây là trường hợp? 191 00:07:55,410 --> 00:07:56,380 Yeah? 192 00:07:56,380 --> 00:07:57,630 >> HỌC SINH: [nghe được]. 193 00:07:57,630 --> 00:08:04,140 194 00:08:04,140 --> 00:08:05,230 >> DAVID Malan: Chính xác. 195 00:08:05,230 --> 00:08:07,330 Vì vậy, a và b là bản sao của x và y. 196 00:08:07,330 --> 00:08:10,680 Và trong thực tế, bất cứ lúc nào bạn đã được gọi một hàm vậy, đến nay 197 00:08:10,680 --> 00:08:12,540 chuyển biến như ints - 198 00:08:12,540 --> 00:08:14,470 cũng như trao đổi được mong đợi ở đây - 199 00:08:14,470 --> 00:08:16,270 các bạn đã từng trải qua trong bản. 200 00:08:16,270 --> 00:08:19,150 >> Bây giờ có nghĩa là phải mất một chút thời gian, một tách thứ hai, cho 201 00:08:19,150 --> 00:08:23,270 máy tính để sao chép các bit từ một biến thành các bit của người khác. 202 00:08:23,270 --> 00:08:24,610 Nhưng đó không phải là một việc lớn như vậy. 203 00:08:24,610 --> 00:08:25,920 Nhưng họ dù sao một bản sao. 204 00:08:25,920 --> 00:08:30,020 >> Và vì vậy bây giờ, trong bối cảnh trao đổi, Tôi đang ở trong thực tế thành công 205 00:08:30,020 --> 00:08:31,180 thay đổi a và b. 206 00:08:31,180 --> 00:08:33,000 Trong thực tế, chúng ta hãy làm một cách nhanh chóng kiểm tra sanity. 207 00:08:33,000 --> 00:08:36,830 In f một là% i, dòng mới. 208 00:08:36,830 --> 00:08:38,770 Và chúng ta hãy cắm vào một. 209 00:08:38,770 --> 00:08:41,830 Bây giờ chúng ta hãy làm điều tương tự với b. 210 00:08:41,830 --> 00:08:43,640 Và chúng ta hãy làm điều tương tự ở đây. 211 00:08:43,640 --> 00:08:47,260 >> Và bây giờ, hãy để tôi sao chép các đường cùng một lần nữa ở dưới cùng của các chức năng 212 00:08:47,260 --> 00:08:51,250 sau ba dòng của tôi thú vị có thể thực hiện, và 213 00:08:51,250 --> 00:08:53,270 in a và b một lần nữa. 214 00:08:53,270 --> 00:08:56,030 Vì vậy, bây giờ chúng ta hãy làm điều này, chắc không trao đổi. 215 00:08:56,030 --> 00:08:58,430 Hãy để tôi làm cho cửa sổ thiết bị đầu cuối bit cao hơn, để chúng ta có thể nhìn thấy 216 00:08:58,430 --> 00:08:59,520 hơn của nó cùng một lúc. 217 00:08:59,520 --> 00:09:00,860 >> Và chạy không trao đổi. 218 00:09:00,860 --> 00:09:04,000 x 1, y là 2. a là 1, b là 2. 219 00:09:04,000 --> 00:09:06,070 Và sau đó, một là 2, b là 1. 220 00:09:06,070 --> 00:09:09,390 Vì vậy, nó làm việc, giống như Jess đã làm ở đây trong trao đổi. 221 00:09:09,390 --> 00:09:13,090 Nhưng tất nhiên, nó không có hiệu lực trên các biến trong chính. 222 00:09:13,090 --> 00:09:15,360 >> Vì vậy, chúng ta đã thấy một thủ thuật nhờ đó chúng ta có thể khắc phục điều này, phải không? 223 00:09:15,360 --> 00:09:19,560 Khi bạn đang phải đối mặt với Phạm vi này vấn đề, bạn chỉ có thể punt và làm cho x 224 00:09:19,560 --> 00:09:22,400 và y những loại biến để thay thế? 225 00:09:22,400 --> 00:09:23,390 >> Bạn có thể làm cho họ toàn cầu. 226 00:09:23,390 --> 00:09:27,560 Đặt chúng ở trên cùng của tập tin như chúng ta đã làm, ngay cả trong các trò chơi của 15. 227 00:09:27,560 --> 00:09:28,890 Chúng tôi sử dụng một biến toàn cầu. 228 00:09:28,890 --> 00:09:32,420 Nhưng trong bối cảnh của trò chơi một 15, đó là hợp lý để có một toàn cầu 229 00:09:32,420 --> 00:09:37,170 biến đại diện cho hội đồng quản trị, bởi vì toàn bộ 15.c là tất cả 230 00:09:37,170 --> 00:09:38,650 về việc thực hiện trò chơi đó. 231 00:09:38,650 --> 00:09:41,470 Đó là những gì các tập tin tồn tại để làm. 232 00:09:41,470 --> 00:09:44,170 >> Nhưng trong trường hợp này đây, tôi gọi một hoán đổi chức năng. 233 00:09:44,170 --> 00:09:45,380 Tôi muốn trao đổi hai biến. 234 00:09:45,380 --> 00:09:48,950 Và nó sẽ bắt đầu cảm thấy chỉ cẩu thả nếu giải pháp cho tất cả chúng tôi 235 00:09:48,950 --> 00:09:51,300 vấn đề khi chúng tôi chạy vào phạm vi vấn đề là làm cho nó toàn cầu. 236 00:09:51,300 --> 00:09:54,730 Bởi vì rất nhanh chóng chương trình của chúng tôi là sẽ trở nên khá lộn xộn. 237 00:09:54,730 --> 00:09:57,760 Và chúng tôi đã làm điều đó rất ít kết quả là trong 15.c. 238 00:09:57,760 --> 00:10:00,470 >> Nhưng hóa ra có một cách tốt hơn hoàn toàn. 239 00:10:00,470 --> 00:10:05,600 Hãy để tôi thực sự quay trở lại và xóa in f, chỉ để đơn giản hóa mã này. 240 00:10:05,600 --> 00:10:09,160 Và cho tôi đề nghị này, thực sự, là xấu. 241 00:10:09,160 --> 00:10:15,990 Nhưng nếu tôi thay vì thêm vào một số dấu sao và các ngôi sao, tôi thay vì có thể biến điều này 242 00:10:15,990 --> 00:10:18,670 chức năng vào một trong đó là thực sự hoạt động. 243 00:10:18,670 --> 00:10:25,020 >> Vì vậy, hãy để tôi quay trở lại đây và thừa nhận rằng dấu hoa thị luôn luôn là khó khăn, 244 00:10:25,020 --> 00:10:26,170 vì vậy tôi sẽ nói sao. 245 00:10:26,170 --> 00:10:27,660 Tôi sẽ chỉ fess lên với một. 246 00:10:27,660 --> 00:10:28,190 Được rồi. 247 00:10:28,190 --> 00:10:30,190 Và bây giờ, những gì tôi sẽ làm thay vào đó? 248 00:10:30,190 --> 00:10:34,130 >> Vì vậy, trước hết, tôi sẽ chỉ định thay vì đi qua một int vào 249 00:10:34,130 --> 00:10:37,980 chức năng trao đổi, tôi thay vì đi nói int sao. 250 00:10:37,980 --> 00:10:39,170 Bây giờ, những gì các ngôi sao như thế nào? 251 00:10:39,170 --> 00:10:41,970 Đây là khái niệm về một con trỏ Binky, nhân vật claymation, là 252 00:10:41,970 --> 00:10:43,465 đề cập đến một thời điểm trước đây. 253 00:10:43,465 --> 00:10:47,610 >> Vì vậy, nếu chúng ta nói int sao, ý nghĩa của này bây giờ là một sẽ không được 254 00:10:47,610 --> 00:10:49,110 thông qua tại bởi giá trị của nó. 255 00:10:49,110 --> 00:10:50,350 Nó sẽ không được sao chép in 256 00:10:50,350 --> 00:10:54,700 Thay vào đó, địa chỉ của một là sẽ được thông qua nhập 257 00:10:54,700 --> 00:10:57,840 >> Vì vậy, nhớ lại rằng bên trong máy tính của bạn là một bó toàn bộ bộ nhớ, nếu không 258 00:10:57,840 --> 00:10:58,760 được gọi là bộ nhớ RAM. 259 00:10:58,760 --> 00:11:00,520 Và bộ nhớ RAM mà chỉ một là bó toàn bộ các byte. 260 00:11:00,520 --> 00:11:03,320 Vì vậy, nếu máy Mac của bạn hoặc máy tính của bạn có hai gigabyte, bạn có 2 261 00:11:03,320 --> 00:11:05,760 tỷ byte của bộ nhớ. 262 00:11:05,760 --> 00:11:08,440 >> Bây giờ chúng ta hãy giả sử rằng chỉ để giữ cho mọi thứ tốt đẹp và có trật tự, chúng tôi 263 00:11:08,440 --> 00:11:09,450 gán địa chỉ - 264 00:11:09,450 --> 00:11:10,170 một số - 265 00:11:10,170 --> 00:11:12,270 đến từng byte bộ nhớ RAM trong máy tính của bạn. 266 00:11:12,270 --> 00:11:15,410 Các byte đầu tiên của những người 2 tỷ là do số không. 267 00:11:15,410 --> 00:11:18,572 Tiếp theo là một byte số một, số hai, tất cả các cách trên lên, chấm chấm 268 00:11:18,572 --> 00:11:20,530 dấu chấm, để khoảng 2 tỷ USD. 269 00:11:20,530 --> 00:11:23,640 >> Vì vậy, bạn có thể số lượng các byte bộ nhớ trong máy tính của bạn. 270 00:11:23,640 --> 00:11:26,460 Vì vậy, chúng ta hãy giả sử rằng đó là những gì chúng tôi có nghĩa là một địa chỉ. 271 00:11:26,460 --> 00:11:31,360 Vì vậy, khi tôi nhìn thấy int một ngôi sao, những gì đang xảy ra được chuyển vào trao đổi bây giờ là 272 00:11:31,360 --> 00:11:32,830 địa chỉ của một. 273 00:11:32,830 --> 00:11:37,150 Không giá trị của nó, nhưng bất cứ điều gì bưu chính của nó địa chỉ, do đó, để nói chuyện - 274 00:11:37,150 --> 00:11:38,810 vị trí của nó trong bộ nhớ RAM. 275 00:11:38,810 --> 00:11:41,250 >> Và tương tự cho b, tôi sẽ để nói điều tương tự. 276 00:11:41,250 --> 00:11:42,720 Int, ngôi sao, b. 277 00:11:42,720 --> 00:11:46,350 Như một sang một bên, về mặt kỹ thuật các ngôi sao có thể đi trong các địa điểm khác. 278 00:11:46,350 --> 00:11:50,140 Nhưng chúng tôi sẽ chuẩn hóa trên các ngôi sao được ngay bên cạnh các kiểu dữ liệu. 279 00:11:50,140 --> 00:11:54,080 >> Vì vậy, trao đổi chữ ký bây giờ có nghĩa là, cho tôi địa chỉ của một int, và cuộc gọi 280 00:11:54,080 --> 00:11:55,400 địa chỉ một. 281 00:11:55,400 --> 00:11:58,690 Và đưa cho tôi một địa chỉ của một int và gọi đó là địa chỉ b. 282 00:11:58,690 --> 00:12:01,120 >> Nhưng bây giờ mã của tôi ở đây đã thay đổi. 283 00:12:01,120 --> 00:12:03,470 Bởi vì nếu tôi khai báo int tạm thời - 284 00:12:03,470 --> 00:12:05,580 mà vẫn còn kiểu int - 285 00:12:05,580 --> 00:12:08,700 nhưng tôi lưu trữ trong nó một, loại có giá trị? 286 00:12:08,700 --> 00:12:12,870 Để được rõ ràng, tôi đặt một một với các mã như được viết ngay bây giờ? 287 00:12:12,870 --> 00:12:14,360 >> Tôi đang đặt vị trí trong một. 288 00:12:14,360 --> 00:12:16,500 Nhưng tôi không quan tâm về vị trí bây giờ, phải không? 289 00:12:16,500 --> 00:12:21,940 Nhiệt độ chỉ tồn tại Jess 'chén thứ ba tồn tại, cho mục đích gì? 290 00:12:21,940 --> 00:12:23,090 Để lưu trữ một giá trị. 291 00:12:23,090 --> 00:12:24,830 Sữa hoặc nước cam. 292 00:12:24,830 --> 00:12:28,520 Không thực sự lưu trữ địa chỉ của một trong những điều đó, mà cảm thấy một 293 00:12:28,520 --> 00:12:31,200 ít vô nghĩa trong này thực bối cảnh thế giới nào. 294 00:12:31,200 --> 00:12:34,990 >> Vì vậy, thực sự, những gì tôi muốn đặt ở nhiệt độ không phải là địa chỉ của một, nhưng các 295 00:12:34,990 --> 00:12:36,180 nội dung của một. 296 00:12:36,180 --> 00:12:41,930 Vì vậy, nếu một là một con số như 123, đây là 123 byte của bộ nhớ mà một chỉ 297 00:12:41,930 --> 00:12:45,090 sẽ xảy ra là chiếm đóng, rằng giá trị trong một sẽ xảy ra là chiếm đóng. 298 00:12:45,090 --> 00:12:49,040 >> Nếu tôi muốn đi đến địa chỉ đó, Tôi cần phải nói một ngôi sao. 299 00:12:49,040 --> 00:12:52,610 Tương tự như vậy, nếu tôi có thể thay đổi những gì tại địa chỉ một, tôi thay đổi 300 00:12:52,610 --> 00:12:53,570 này để bắt đầu một. 301 00:12:53,570 --> 00:12:58,185 Nếu tôi muốn lưu trữ trong những gì ở vị trí một với những gì ở vị trí 302 00:12:58,185 --> 00:13:02,180 tại b, b sao sao. 303 00:13:02,180 --> 00:13:05,340 >> Vì vậy, trong ngắn hạn, thậm chí nếu điều này là không hoàn toàn chìm trong nhưng - và tôi sẽ không mong đợi 304 00:13:05,340 --> 00:13:06,560 rằng nó sẽ rất nhanh - 305 00:13:06,560 --> 00:13:11,100 nhận ra rằng tất cả tôi đang làm là tiền tố những ngôi sao để biến của tôi, 306 00:13:11,100 --> 00:13:13,350 nói không lấy các giá trị. 307 00:13:13,350 --> 00:13:14,520 Không làm thay đổi giá trị. 308 00:13:14,520 --> 00:13:17,600 Nhưng đúng hơn, đi đến những địa chỉ và có được giá trị. 309 00:13:17,600 --> 00:13:21,430 Đi đến địa chỉ và thay đổi giá trị đó. 310 00:13:21,430 --> 00:13:25,500 >> Vì vậy, bây giờ hãy để tôi di chuyển trở lại lên đến đỉnh, chỉ để sửa chữa đường dây này đây, để 311 00:13:25,500 --> 00:13:27,690 thay đổi mẫu cho phù hợp. 312 00:13:27,690 --> 00:13:30,280 Nhưng bây giờ tôi cần phải làm một việc khác. 313 00:13:30,280 --> 00:13:35,500 Trực giác, nếu tôi đã thay đổi các loại các đối số trao đổi được mong đợi, 314 00:13:35,500 --> 00:13:37,245 những gì khác tôi cần phải thay đổi trong mã của tôi? 315 00:13:37,245 --> 00:13:39,750 316 00:13:39,750 --> 00:13:40,840 >> Khi tôi gọi điện trao đổi. 317 00:13:40,840 --> 00:13:43,340 Bởi vì ngay bây giờ, những gì am Tôi đi qua để trao đổi vẫn còn? 318 00:13:43,340 --> 00:13:47,450 Giá trị x và các giá trị của y, hoặc sữa và nước cam. 319 00:13:47,450 --> 00:13:48,510 Nhưng tôi không muốn làm điều đó. 320 00:13:48,510 --> 00:13:51,060 Tôi thay vì muốn vượt qua trong những gì? 321 00:13:51,060 --> 00:13:53,050 Vị trí của x và vị trí của y. 322 00:13:53,050 --> 00:13:55,300 Địa chỉ bưu chính của họ là gì, vậy để nói chuyện. 323 00:13:55,300 --> 00:13:57,600 >> Vì vậy, để làm được điều đó, có một ký hiệu. 324 00:13:57,600 --> 00:13:59,260 Loại ký hiệu của âm thanh như địa chỉ. 325 00:13:59,260 --> 00:14:03,240 như vậy n, ký hiệu, địa chỉ của x, và địa chỉ của y. 326 00:14:03,240 --> 00:14:06,790 Vì vậy, nó cố ý mà chúng tôi sử dụng ampersands khi gọi chức năng, 327 00:14:06,790 --> 00:14:10,230 và các ngôi sao khi khai báo và khi thực hiện chức năng. 328 00:14:10,230 --> 00:14:14,220 >> Và chỉ cần nghĩ về ký hiệu là địa chỉ của nhà điều hành, và ngôi sao như các 329 00:14:14,220 --> 00:14:15,490 đến đó điều hành - 330 00:14:15,490 --> 00:14:18,640 hoặc, đúng hơn, toán tử tham chiếu. 331 00:14:18,640 --> 00:14:23,480 Vì vậy, đó là một toàn bộ rất nhiều lời chỉ để nói rằng bây giờ, hy vọng, trao đổi đang diễn ra 332 00:14:23,480 --> 00:14:24,440 được chính xác. 333 00:14:24,440 --> 00:14:26,550 >> Hãy để tôi đi trước và thực hiện - 334 00:14:26,550 --> 00:14:30,940 chúng ta hãy thực sự đổi tên tập tin, vì sợ chương trình này vẫn được gọi là không có trao đổi. 335 00:14:30,940 --> 00:14:33,240 Tôi cho rằng chúng ta sẽ gọi nó là swap.c bây giờ. 336 00:14:33,240 --> 00:14:35,670 Vì vậy, làm cho, trao đổi. 337 00:14:35,670 --> 00:14:37,520 Dấu chấm, dấu gạch chéo, trao đổi. 338 00:14:37,520 --> 00:14:40,210 >> Và bây giờ thực sự, x 1, y là 2. 339 00:14:40,210 --> 00:14:44,040 Và sau đó, x là 2, y là một. 340 00:14:44,040 --> 00:14:46,500 Vâng chúng ta hãy xem nếu chúng ta không thể làm điều này một chút khác nhau như những gì 341 00:14:46,500 --> 00:14:47,180 xảy ra ở đây. 342 00:14:47,180 --> 00:14:51,250 Đầu tiên, hãy để tôi phóng to trên của chúng tôi vẽ màn hình ở đây. 343 00:14:51,250 --> 00:14:54,160 Và cho tôi đề nghị cho một thời điểm - và bất cứ khi nào tôi rút ra ở đây sẽ được nhân đôi 344 00:14:54,160 --> 00:14:58,660 lên hiện nay - cho tôi đề nghị đây là một bó toàn bộ bộ nhớ, hoặc 345 00:14:58,660 --> 00:15:00,540 RAM, bên trong máy tính của tôi. 346 00:15:00,540 --> 00:15:04,140 >> Và đây sẽ là số cắn, hãy nói, 1. 347 00:15:04,140 --> 00:15:05,720 Đây sẽ là byte số 2. 348 00:15:05,720 --> 00:15:08,220 Và tôi sẽ làm một bó toàn bộ hơn, và sau đó một loạt các dấu chấm dấu chấm dấu chấm để 349 00:15:08,220 --> 00:15:10,880 chỉ ra rằng có 2 tỷ những điều này. 350 00:15:10,880 --> 00:15:13,520 4, 5, và vv. 351 00:15:13,520 --> 00:15:17,055 >> Như vậy, có là năm byte đầu tiên bộ nhớ máy tính của tôi. 352 00:15:17,055 --> 00:15:17,560 Tất cả phải không? 353 00:15:17,560 --> 00:15:19,060 Rất ít ra khỏi 2 tỷ USD. 354 00:15:19,060 --> 00:15:21,120 Nhưng bây giờ tôi sẽ đề xuất sau. 355 00:15:21,120 --> 00:15:27,490 Tôi sẽ đề nghị x sẽ lưu trữ số 1, và y sẽ 356 00:15:27,490 --> 00:15:29,690 để lưu trữ các số 2. 357 00:15:29,690 --> 00:15:35,000 Và để cho tôi đi trước bây giờ và đại diện các giá trị như sau. 358 00:15:35,000 --> 00:15:41,510 >> Chúng ta hãy làm điều này như sau. 359 00:15:41,510 --> 00:15:42,870 Cho tôi chỉ một giây. 360 00:15:42,870 --> 00:15:44,150 Thứ hai. 361 00:15:44,150 --> 00:15:45,680 OK. 362 00:15:45,680 --> 00:15:47,560 Tôi muốn làm điều này một chút - 363 00:15:47,560 --> 00:15:50,440 chúng ta hãy làm điều này một lần nữa. 364 00:15:50,440 --> 00:15:53,250 Không thì tôi sẽ để và sử dụng con số tương tự, vô tình, 365 00:15:53,250 --> 00:15:54,230 nhiều lần. 366 00:15:54,230 --> 00:15:57,320 >> Vì vậy, chỉ vì vậy chúng tôi có số lượng khác nhau để nói về, chúng ta hãy gọi byte này 367 00:15:57,320 --> 00:16:03,391 số 123, 124, 125, 126, và dấu chấm chấm chấm. 368 00:16:03,391 --> 00:16:08,400 Và hãy để tôi khẳng định bây giờ mà tôi sẽ đặt giá trị 1 ở đây, và giá trị 2 369 00:16:08,400 --> 00:16:11,990 ở đây, hay còn gọi là x và y. 370 00:16:11,990 --> 00:16:15,300 Vì vậy, nó chỉ như vậy sẽ xảy ra rằng đây là x, đây là y. 371 00:16:15,300 --> 00:16:18,180 >> Và chỉ bằng một số cơ hội ngẫu nhiên, máy tính, hệ điều hành, 372 00:16:18,180 --> 00:16:21,890 đã xảy ra tại địa điểm đặt x số 123. 373 00:16:21,890 --> 00:16:25,590 Và y đã kết thúc ở vị trí 124 - 374 00:16:25,590 --> 00:16:26,330 chết tiệt. 375 00:16:26,330 --> 00:16:28,700 Tôi có nên cố định này. 376 00:16:28,700 --> 00:16:34,040 Ôi trời, tôi thực sự muốn làm điều này? 377 00:16:34,040 --> 00:16:37,340 Có, tôi muốn để sửa lỗi này và b thích về điều này hôm nay. 378 00:16:37,340 --> 00:16:39,950 Xin lỗi, mới lúc này. 379 00:16:39,950 --> 00:16:45,020 >> 127, 131, và tôi không muốn làm được điều này phức tạp, nhưng tại sao tôi thay đổi 380 00:16:45,020 --> 00:16:46,340 con số đó? 381 00:16:46,340 --> 00:16:48,360 Bởi vì tôi muốn các số nguyên để thực sự là bốn byte. 382 00:16:48,360 --> 00:16:49,810 Vì vậy, hãy là siêu hậu môn về việc này. 383 00:16:49,810 --> 00:16:53,800 Vì vậy, nếu 1 xảy ra để được giải quyết 123, 2 là có được tại địa chỉ 384 00:16:53,800 --> 00:16:55,730 127 bởi vì nó chỉ là 4 lời tạm biệt đi. 385 00:16:55,730 --> 00:16:56,210 Đó là tất cả. 386 00:16:56,210 --> 00:16:58,640 Và chúng tôi sẽ quên đi tất cả các địa chỉ khác trên thế giới. 387 00:16:58,640 --> 00:17:03,320 >> Vì vậy, x là ở vị trí 123, y là ở vị trí 127. 388 00:17:03,320 --> 00:17:05,770 Và bây giờ, những gì tôi làm thực sự muốn làm gì? 389 00:17:05,770 --> 00:17:10,099 Khi tôi gọi điện trao đổi bây giờ, những gì thực sự xảy ra? 390 00:17:10,099 --> 00:17:14,920 Vâng, khi tôi gọi điện trao đổi, tôi đang đi qua trong địa chỉ của x và địa chỉ của y. 391 00:17:14,920 --> 00:17:18,540 Vì vậy, ví dụ, nếu hai phần giấy bây giờ đại diện cho hai 392 00:17:18,540 --> 00:17:23,510 đối số a, b để trao đổi, tôi là gì sẽ viết vào ngày đầu tiên trong số này, 393 00:17:23,510 --> 00:17:27,720 mà tôi sẽ gọi đề cập đến như một? 394 00:17:27,720 --> 00:17:30,610 >> Chính xác, 123. 395 00:17:30,610 --> 00:17:31,905 Vì vậy, điều này tôi khẳng định là một. 396 00:17:31,905 --> 00:17:32,955 Đây là một tham số. 397 00:17:32,955 --> 00:17:35,856 Tôi đang đặt địa chỉ của x trong đó. 398 00:17:35,856 --> 00:17:38,152 >> Đó là những gì? 399 00:17:38,152 --> 00:17:40,890 >> Đó là những gì? 400 00:17:40,890 --> 00:17:41,190 >> Không, không. 401 00:17:41,190 --> 00:17:41,720 Đó là OK. 402 00:17:41,720 --> 00:17:42,570 Vẫn tốt, vẫn còn tốt. 403 00:17:42,570 --> 00:17:43,530 Vì vậy, đây là một. 404 00:17:43,530 --> 00:17:46,240 Và bây giờ, phần thứ hai của bài báo, này là có được b, và những gì tôi 405 00:17:46,240 --> 00:17:49,010 sẽ được viết trên mảnh giấy này? 406 00:17:49,010 --> 00:17:50,080 127. 407 00:17:50,080 --> 00:17:53,720 >> Vì vậy, điều duy nhất đó là thay đổi kể từ đang chu trước đây về câu chuyện này là, 408 00:17:53,720 --> 00:17:58,590 chứ không phải theo nghĩa đen 1 và 2, tôi sẽ vượt qua trong 123 và 127. 409 00:17:58,590 --> 00:18:02,130 Và bây giờ tôi sẽ đưa các bên trong của ô này, tất cả phải không? 410 00:18:02,130 --> 00:18:04,640 Vì vậy mà hộp đen hiện chiếm chức năng trao đổi. 411 00:18:04,640 --> 00:18:07,230 >> Trong khi đó, bây giờ chúng ta có một người nào đó thực hiện chức năng trao đổi. 412 00:18:07,230 --> 00:18:09,090 Sẽ có người lên đây muốn tình nguyện? 413 00:18:09,090 --> 00:18:09,560 Lên đây. 414 00:18:09,560 --> 00:18:11,080 Tên của bạn là gì? 415 00:18:11,080 --> 00:18:11,460 Charlie. 416 00:18:11,460 --> 00:18:12,080 Được rồi, Charlie. 417 00:18:12,080 --> 00:18:14,810 Lên đây. 418 00:18:14,810 --> 00:18:17,310 >> Vì vậy, Charlie sẽ chơi vai trò của hộp đen của chúng tôi. 419 00:18:17,310 --> 00:18:21,460 Và Charlie, những gì tôi muốn bạn làm bây giờ là thực hiện trao đổi theo cách như vậy 420 00:18:21,460 --> 00:18:25,320 rằng, với hai địa chỉ, bạn đã thực sự đi 421 00:18:25,320 --> 00:18:26,330 để thay đổi các giá trị. 422 00:18:26,330 --> 00:18:28,290 Và tôi sẽ thì thầm vào tai của bạn làm thế nào để chạy TV đây. 423 00:18:28,290 --> 00:18:29,930 >> Nên đi trước, và bạn là hộp đen. 424 00:18:29,930 --> 00:18:30,920 Đạt được trong đó. 425 00:18:30,920 --> 00:18:34,054 Những giá trị làm bạn thấy một, và những giá trị làm bạn thấy cho b? 426 00:18:34,054 --> 00:18:36,740 >> CHARLIE: một là 123 và b là 127. 427 00:18:36,740 --> 00:18:37,530 >> DAVID Malan: OK, chính xác. 428 00:18:37,530 --> 00:18:38,940 Bây giờ tạm dừng ở đó chỉ là một thời điểm. 429 00:18:38,940 --> 00:18:41,680 Điều đầu tiên bạn sẽ làm gì bây giờ, theo mã - mà 430 00:18:41,680 --> 00:18:43,220 Bây giờ tôi sẽ kéo lên trên màn hình - 431 00:18:43,220 --> 00:18:46,750 là có được phân bổ một chút bit của bộ nhớ được gọi là tạm thời. 432 00:18:46,750 --> 00:18:48,850 Vì vậy, tôi sẽ đi trước và cung cấp cho bạn bộ nhớ. 433 00:18:48,850 --> 00:18:52,210 >> Vì vậy, đây sẽ là một biến thứ ba mà bạn có thể truy cập vào 434 00:18:52,210 --> 00:18:54,080 bạn được gọi là tạm thời. 435 00:18:54,080 --> 00:18:57,120 Và những gì thì bạn sẽ viết trên mảnh giấy tạm thời? 436 00:18:57,120 --> 00:19:02,524 437 00:19:02,524 --> 00:19:03,470 >> CHARLIE: Con trỏ, phải không? 438 00:19:03,470 --> 00:19:04,790 >> DAVID Malan: OK, cũng không nhất thiết phải là con trỏ. 439 00:19:04,790 --> 00:19:07,230 Vì vậy, các dòng mã mà tôi đã nhấn mạnh ở phía bên tay phải, 440 00:19:07,230 --> 00:19:07,900 chúng ta hãy bắt đầu từ đó. 441 00:19:07,900 --> 00:19:08,890 Nó nói một ngôi sao. 442 00:19:08,890 --> 00:19:11,670 Vì vậy, một hiện đang lưu trữ số 123. 443 00:19:11,670 --> 00:19:16,660 Và chỉ bằng trực giác, những gì đã sao 123 nghĩa là gì? 444 00:19:16,660 --> 00:19:21,630 >> Nhưng đặc biệt, nếu là 123, một ngôi sao có nghĩa là gì? 445 00:19:21,630 --> 00:19:22,560 Giá trị của một. 446 00:19:22,560 --> 00:19:24,580 Hoặc tình cờ hơn, đến đó. 447 00:19:24,580 --> 00:19:28,620 Vì vậy, hãy để tôi đề xuất rằng, giữ một trong bàn tay của bạn, đi trước và điều trị bệnh này 448 00:19:28,620 --> 00:19:29,430 như thể đó là một bản đồ. 449 00:19:29,430 --> 00:19:32,940 Và đi bộ một mình qua của máy tính bộ nhớ, và tìm thấy chúng tôi là những gì 450 00:19:32,940 --> 00:19:36,520 ở vị trí 123. 451 00:19:36,520 --> 00:19:37,720 Chính xác. 452 00:19:37,720 --> 00:19:41,100 >> Vì vậy, chúng ta thấy ở vị trí 123 là những gì, rõ ràng? 453 00:19:41,100 --> 00:19:44,240 OK, vì vậy những gì giá trị bây giờ là bạn sẽ đưa vào tạm thời? 454 00:19:44,240 --> 00:19:44,750 Chính xác. 455 00:19:44,750 --> 00:19:45,600 Vì vậy, đi trước và làm điều đó. 456 00:19:45,600 --> 00:19:51,280 Và viết số 1 trên mảnh giấy hiện đang có tựa đề tạm thời. 457 00:19:51,280 --> 00:19:53,540 >> Và bây giờ là bước tiếp theo bạn sẽ thực hiện 458 00:19:53,540 --> 00:19:54,310 là có được những gì. 459 00:19:54,310 --> 00:19:57,820 Vâng, ở phía bên tay phải của dòng tiếp theo của mã là sao b. b, của 460 00:19:57,820 --> 00:19:59,260 Tất nhiên, các cửa hàng một địa chỉ. 461 00:19:59,260 --> 00:20:02,270 Có địa chỉ 127. 462 00:20:02,270 --> 00:20:06,620 Sao b có nghĩa là gì, tình cờ nói? 463 00:20:06,620 --> 00:20:08,700 >> Đi đến địa điểm đó. 464 00:20:08,700 --> 00:20:14,988 Vì vậy, đi trước và tìm thấy chúng tôi những gì ở vị trí 127. 465 00:20:14,988 --> 00:20:15,480 OK. 466 00:20:15,480 --> 00:20:19,170 Tất nhiên, ở vị trí 127, vẫn là giá trị 2. 467 00:20:19,170 --> 00:20:24,060 Vì vậy, những gì đang xảy ra tại cửa hàng tại bất cứ điều gì ở các vị trí trong một? 468 00:20:24,060 --> 00:20:26,860 Vì vậy, ngôi sao một phương tiện đi đến vị trí một. 469 00:20:26,860 --> 00:20:29,770 Vị trí một là những gì? 470 00:20:29,770 --> 00:20:30,430 >> Chính xác. 471 00:20:30,430 --> 00:20:34,190 Vì vậy, bây giờ, nếu bạn muốn thay đổi những gì tại địa điểm đó - 472 00:20:34,190 --> 00:20:36,470 Tôi sẽ đi trước và chạy tẩy đang ở đây. 473 00:20:36,470 --> 00:20:37,760 Và bây giờ đặt nó trở lại trên bàn chải. 474 00:20:37,760 --> 00:20:42,190 Số những gì bạn sẽ viết trong đó ô trống bây giờ? 475 00:20:42,190 --> 00:20:42,850 >> Chính xác. 476 00:20:42,850 --> 00:20:46,470 Vì vậy, dòng mã này, đã rõ ràng - cho tôi dừng lại những gì của Charlie làm và 477 00:20:46,470 --> 00:20:51,730 chỉ ra ở đây, những gì ông vừa làm viết vào hộp đó ở vị trí 123 478 00:20:51,730 --> 00:20:55,150 giá trị mà trước đây tại b. 479 00:20:55,150 --> 00:20:59,140 Và vì vậy chúng tôi đã thực hiện tại thực sự dòng thứ hai của mã. 480 00:20:59,140 --> 00:21:01,920 >> Bây giờ không may, có vẫn còn một dòng còn lại. 481 00:21:01,920 --> 00:21:04,900 Bây giờ những gì là ở nhiệt độ, theo nghĩa đen? 482 00:21:04,900 --> 00:21:06,200 Đó rõ ràng là số một. 483 00:21:06,200 --> 00:21:07,020 Đó không phải là một địa chỉ. 484 00:21:07,020 --> 00:21:09,380 Nó chỉ là một số, loại một biến từ một tuần. 485 00:21:09,380 --> 00:21:13,520 >> Và bây giờ khi bạn nói sao b, điều đó có nghĩa đi đến địa chỉ b, là của 486 00:21:13,520 --> 00:21:15,090 Tất nhiên ở đây. 487 00:21:15,090 --> 00:21:16,020 Vì vậy, khi bạn đến nơi - 488 00:21:16,020 --> 00:21:18,320 Tôi sẽ đi trước và xóa những gì thực sự có - và những gì bạn 489 00:21:18,320 --> 00:21:20,820 sẽ viết tại 127 vị trí? 490 00:21:20,820 --> 00:21:22,010 >> CHARLIE: Nhiệt độ, đó là một trong. 491 00:21:22,010 --> 00:21:23,430 >> DAVID Malan: Nhiệt độ, đó là một trong. 492 00:21:23,430 --> 00:21:25,670 Và những gì xảy ra với nhiệt độ cuối cùng? 493 00:21:25,670 --> 00:21:26,600 Vâng, chúng tôi thực sự không biết. 494 00:21:26,600 --> 00:21:27,420 Chúng tôi không thực sự quan tâm. 495 00:21:27,420 --> 00:21:31,090 Bất cứ lúc nào chúng tôi đã thực hiện một chức năng cho đến nay, bất kỳ biến địa phương mà bạn có 496 00:21:31,090 --> 00:21:31,890 thực sự là địa phương. 497 00:21:31,890 --> 00:21:33,060 Và họ chỉ biến mất. 498 00:21:33,060 --> 00:21:35,040 Họ khai hoang bởi điều hành hệ thống cuối cùng. 499 00:21:35,040 --> 00:21:39,800 >> Vì vậy, thực tế là tạm thời vẫn có giá trị 1 là loại cơ bản 500 00:21:39,800 --> 00:21:41,150 không thú vị cho chúng tôi. 501 00:21:41,150 --> 00:21:43,100 Được rồi, do đó, một tràng pháo tay nếu chúng ta có thể cho Charlie. 502 00:21:43,100 --> 00:21:46,400 Thực hiện rất tốt. 503 00:21:46,400 --> 00:21:51,520 >> Được rồi, vì vậy những gì hơn không điều này có nghĩa là chúng ta có thể làm gì? 504 00:21:51,520 --> 00:21:54,400 Vì vậy, nó chỉ ra rằng chúng tôi đã nói một vài lời nói dối 505 00:21:54,400 --> 00:21:55,540 trong một thời gian. 506 00:21:55,540 --> 00:21:59,990 Trên thực tế, nó chỉ ra rằng một chuỗi, tất cả thời gian này, không phải là thực sự là một 507 00:21:59,990 --> 00:22:02,190 chuỗi ký tự cho mỗi gia nhập. 508 00:22:02,190 --> 00:22:03,980 Nó loại là trực giác. 509 00:22:03,980 --> 00:22:08,270 >> Nhưng nói về mặt kỹ thuật, chuỗi là một kiểu dữ liệu mà chúng ta tuyên bố bên trong 510 00:22:08,270 --> 00:22:12,170 thư viện CS50 để đơn giản hóa thế giới trong vài tuần đầu tiên của lớp. 511 00:22:12,170 --> 00:22:20,130 Địa chỉ là một chuỗi thực sự là của một nhân vật ở đâu đó trong bộ nhớ RAM. 512 00:22:20,130 --> 00:22:25,530 Một chuỗi thực sự là một con số, như 123 hoặc 127, điều đó xảy ra để phân ranh giới 513 00:22:25,530 --> 00:22:28,420 nơi một chuỗi bắt đầu trong bộ nhớ máy tính của bạn. 514 00:22:28,420 --> 00:22:31,870 >> Nhưng nó không đại diện cho chuỗi, cho mỗi gia nhập, chính nó. 515 00:22:31,870 --> 00:22:33,460 Và chúng ta có thể thấy điều này như sau. 516 00:22:33,460 --> 00:22:35,980 Hãy để tôi đi trước và mở ra một số mã đó là trong 517 00:22:35,980 --> 00:22:38,340 ví dụ mã nguồn của ngày hôm nay. 518 00:22:38,340 --> 00:22:42,225 Và tôi sẽ đi trước và mở lên, chúng ta hãy nói, so sánh-0.c. 519 00:22:42,225 --> 00:22:44,830 520 00:22:44,830 --> 00:22:48,790 Đây là một chương trình lỗi có nghĩa là sẽ được thực hiện như sau. 521 00:22:48,790 --> 00:22:49,040 >> Đầu tiên. 522 00:22:49,040 --> 00:22:50,420 Tôi sẽ nói điều gì đó. 523 00:22:50,420 --> 00:22:52,660 Sau đó tôi sẽ đi trước và nhận được một chuỗi từ người sử dụng 524 00:22:52,660 --> 00:22:53,750 trong đó dòng tiếp theo. 525 00:22:53,750 --> 00:22:55,370 Sau đó, tôi sẽ nói lại lần nữa. 526 00:22:55,370 --> 00:22:57,540 Sau đó, tôi sẽ nhận được một chuỗi từ người sử dụng. 527 00:22:57,540 --> 00:23:00,390 >> Và thông báo, tôi thấy một trong những chuỗi trong một biến gọi là, và 528 00:23:00,390 --> 00:23:03,040 khác của các chuỗi trong một biến gọi là t. 529 00:23:03,040 --> 00:23:07,480 Và bây giờ tôi sẽ yêu cầu bồi thường, rất hợp lý, rằng nếu s tương đương với bằng t, 530 00:23:07,480 --> 00:23:08,940 các chuỗi đều giống nhau. 531 00:23:08,940 --> 00:23:09,970 Bạn gõ cùng một điều. 532 00:23:09,970 --> 00:23:11,830 Khác, các chuỗi là không phải là điều tương tự. 533 00:23:11,830 --> 00:23:15,440 >> Sau khi tất cả, nếu chúng ta đầu vào hai số nguyên, hai ký tự, hai phao, hai đôi, bất kỳ 534 00:23:15,440 --> 00:23:18,400 các kiểu dữ liệu, chúng tôi đã nói chuyện về cho đến nay để so sánh chúng - 535 00:23:18,400 --> 00:23:22,070 nhớ lại chúng ta thực hiện rất rõ ràng trong khi trước đây mà bạn không làm được điều này, bởi vì một 536 00:23:22,070 --> 00:23:25,840 dấu bằng là các khóa học các nhà điều hành chuyển nhượng. 537 00:23:25,840 --> 00:23:26,820 Vì vậy, đó sẽ là một lỗi. 538 00:23:26,820 --> 00:23:29,260 >> Chúng tôi sử dụng dấu bằng bằng, mà thực sự so sánh 539 00:23:29,260 --> 00:23:31,050 thứ cho thật sự bình đẳng. 540 00:23:31,050 --> 00:23:32,275 Nhưng tôi khẳng định đây là lỗi. 541 00:23:32,275 --> 00:23:37,400 Nếu tôi đi trước và thực hiện so sánh không, và sau đó làm dấu chấm dấu gạch chéo so sánh không. 542 00:23:37,400 --> 00:23:39,700 Và tôi gõ vào, chúng ta hãy nói, xin chào. 543 00:23:39,700 --> 00:23:41,590 Và sau đó chúng ta hãy nói lời chào một lần nữa. 544 00:23:41,590 --> 00:23:46,040 Nghĩa là điều tương tự, máy tính tuyên bố tôi gõ những thứ khác nhau. 545 00:23:46,040 --> 00:23:47,640 >> Bây giờ có lẽ tôi chỉ gõ sai một cái gì đó. 546 00:23:47,640 --> 00:23:49,910 Tôi sẽ gõ tên của tôi thời gian này. 547 00:23:49,910 --> 00:23:52,580 Ý tôi là, xin chào. 548 00:23:52,580 --> 00:23:54,770 Xin chào. 549 00:23:54,770 --> 00:23:57,360 Nó khác nhau mỗi lần duy nhất. 550 00:23:57,360 --> 00:23:58,430 >> Vâng, tại sao vậy? 551 00:23:58,430 --> 00:24:00,140 Thực sự là những gì xảy ra bên dưới mui xe? 552 00:24:00,140 --> 00:24:03,270 Vâng, những gì đang thực sự xảy ra bên dưới mui xe là một chuỗi sau đó 553 00:24:03,270 --> 00:24:07,410 Tôi gõ vào đó lần đầu tiên ví dụ là lời chào, tất nhiên. 554 00:24:07,410 --> 00:24:11,660 Nhưng nếu chúng tôi đại diện này bên dưới mui xe, nhớ lại rằng một 555 00:24:11,660 --> 00:24:13,470 chuỗi trong một mảng. 556 00:24:13,470 --> 00:24:15,040 Và chúng tôi đã nói như vậy trong quá khứ. 557 00:24:15,040 --> 00:24:20,200 >> Vì vậy, nếu tôi vẽ mảng như thế này, tôi sẽ đại diện cho một cái gì đó khá 558 00:24:20,200 --> 00:24:23,030 tương tự như những gì chúng tôi đã làm một thời điểm trước đây. 559 00:24:23,030 --> 00:24:25,390 Và có thực sự là một cái gì đó đặc biệt ở đây, quá. 560 00:24:25,390 --> 00:24:28,090 Chúng tôi đã xác định được tại cuối mỗi chuỗi? 561 00:24:28,090 --> 00:24:30,760 Yeah, dấu gạch chéo ngược này không, đó là chỉ cách đại diện, 562 00:24:30,760 --> 00:24:33,610 nghĩa đen, 00000000. 563 00:24:33,610 --> 00:24:35,680 Tám bit 0 liên tiếp. 564 00:24:35,680 --> 00:24:37,610 >> Tôi không biết, thẳng thắn, những gì sau này. 565 00:24:37,610 --> 00:24:40,090 Đó chỉ là một bó hơn RAM bên trong máy tính của tôi. 566 00:24:40,090 --> 00:24:40,970 Nhưng đây là một mảng. 567 00:24:40,970 --> 00:24:42,260 Chúng tôi nói về mảng trước. 568 00:24:42,260 --> 00:24:45,010 Và chúng tôi thường nói về mảng như là vị trí không, 569 00:24:45,010 --> 00:24:46,580 sau đó, sau đó hai. 570 00:24:46,580 --> 00:24:47,950 Nhưng đó chỉ là để thuận tiện. 571 00:24:47,950 --> 00:24:49,380 Và đó là hoàn toàn tương đối. 572 00:24:49,380 --> 00:24:53,010 >> Khi bạn thực sự nhận được từ bộ nhớ máy tính, đó là tất nhiên bất cứ 573 00:24:53,010 --> 00:24:55,450 2 tỷ một số byte lẻ, có khả năng. 574 00:24:55,450 --> 00:24:59,100 Vì vậy, thực sự bên dưới mui xe, tất cả thời gian này, có. 575 00:24:59,100 --> 00:25:01,670 Điều này rất có thể là khung không. 576 00:25:01,670 --> 00:25:04,780 Nhưng nếu bạn đào sâu hơn bên dưới mui xe, đó là thực sự 577 00:25:04,780 --> 00:25:07,000 địa chỉ số 123. 578 00:25:07,000 --> 00:25:09,150 Đây là địa chỉ 124. 579 00:25:09,150 --> 00:25:11,040 Đây là địa chỉ 125. 580 00:25:11,040 --> 00:25:12,540 >> Và tôi đã không vít lên thời gian này. 581 00:25:12,540 --> 00:25:15,840 Giờ đây là một byte ngoài vì lý do gì? 582 00:25:15,840 --> 00:25:17,930 Làm thế nào lớn là một char? 583 00:25:17,930 --> 00:25:19,170 Một char chỉ là một byte. 584 00:25:19,170 --> 00:25:20,570 Một int thường là bốn byte. 585 00:25:20,570 --> 00:25:24,850 Vì vậy, đó là lý do tại sao tôi đã làm cho nó 123, 127, 131 và vv. 586 00:25:24,850 --> 00:25:27,560 Bây giờ tôi có thể giữ cho toán học đơn giản và chỉ cần làm thêm 1. 587 00:25:27,560 --> 00:25:30,510 Và đây là bây giờ những gì thực sự xảy ra trên dưới mui xe. 588 00:25:30,510 --> 00:25:37,760 >> Vì vậy, khi bạn khai báo một cái gì đó như thế này, string s, điều này thực sự - 589 00:25:37,760 --> 00:25:39,170 nó quay ra - 590 00:25:39,170 --> 00:25:41,190 char sao. 591 00:25:41,190 --> 00:25:44,640 Ngôi sao, tất nhiên, có nghĩa là địa chỉ, hay còn gọi là con trỏ. 592 00:25:44,640 --> 00:25:46,200 Vì vậy, nó là địa chỉ của một cái gì đó. 593 00:25:46,200 --> 00:25:47,510 Đó là những gì địa chỉ của? 594 00:25:47,510 --> 00:25:47,760 >> Cũng - 595 00:25:47,760 --> 00:25:51,680 Tôi là người duy nhất có thể nhìn thấy rất điểm quan trọng mà tôi đang làm, hoặc nghĩ 596 00:25:51,680 --> 00:25:52,560 Tôi đang thực hiện. 597 00:25:52,560 --> 00:25:55,270 Vì vậy, chuỗi - 598 00:25:55,270 --> 00:25:57,180 điều đáng buồn là tôi có một màn hình ngay nơi tôi 599 00:25:57,180 --> 00:25:58,100 có thể thấy rằng. 600 00:25:58,100 --> 00:26:00,990 >> Được rồi, vì vậy chuỗi s là những gì Tôi tuyên bố trước đó. 601 00:26:00,990 --> 00:26:04,600 Nhưng hóa ra, nhờ một chút ma thuật trong thư viện CS50, tất cả điều này 602 00:26:04,600 --> 00:26:08,780 Hiện chuỗi có nghĩa được char sao. 603 00:26:08,780 --> 00:26:11,310 Các ngôi sao lại có nghĩa con trỏ hoặc địa chỉ. 604 00:26:11,310 --> 00:26:14,180 Thực tế là nó chầu từ char có nghĩa là đó là 605 00:26:14,180 --> 00:26:15,970 địa chỉ của một nhân vật. 606 00:26:15,970 --> 00:26:23,100 >> Vì vậy, nếu có được chuỗi được gọi, và tôi gõ trong H-E-L-L-O, đề nghị bây giờ những gì đã có được 607 00:26:23,100 --> 00:26:27,330 chuỗi đúng là đã được trả lại tất cả các thời gian này, mặc dù chúng tôi đã thay 608 00:26:27,330 --> 00:26:29,980 giản trên thế giới? 609 00:26:29,980 --> 00:26:33,310 Những gì không có được chuỗi thực sự trở lại như giá trị trả về của nó? 610 00:26:33,310 --> 00:26:35,830 611 00:26:35,830 --> 00:26:38,720 >> 123 trong trường hợp này, ví dụ. 612 00:26:38,720 --> 00:26:42,630 Trước đó chúng tôi đã nói rằng nhận được chuỗi chỉ đơn giản là trả về một chuỗi, một chuỗi các 613 00:26:42,630 --> 00:26:43,300 ký tự. 614 00:26:43,300 --> 00:26:44,790 Nhưng đó là một chút của một lời nói dối. 615 00:26:44,790 --> 00:26:48,010 Cách nhận được chuỗi thực sự làm việc bên dưới mui xe là nó được một 616 00:26:48,010 --> 00:26:48,930 chuỗi từ người sử dụng. 617 00:26:48,930 --> 00:26:51,530 Nó plops các ký tự họ loại trong bộ nhớ. 618 00:26:51,530 --> 00:26:54,680 Nó đặt một dấu gạch chéo ngược không ở cuối của những chuỗi ký tự. 619 00:26:54,680 --> 00:26:57,310 >> Nhưng sau đó những gì không có được chuỗi nghĩa đen trở lại? 620 00:26:57,310 --> 00:27:02,710 Nó nghĩa là trả về địa chỉ của byte đầu tiên trong bộ nhớ RAM mà 621 00:27:02,710 --> 00:27:04,130 nó được sử dụng cho sức mạnh đó. 622 00:27:04,130 --> 00:27:07,500 Và nó chỉ ra rằng chỉ bằng cách trả lại một địa chỉ duy nhất của 623 00:27:07,500 --> 00:27:12,120 ký tự đầu tiên trong chuỗi, đó là đủ cho việc tìm kiếm toàn bộ 624 00:27:12,120 --> 00:27:12,630 chuỗi. 625 00:27:12,630 --> 00:27:16,930 >> Nói cách khác, nhận được chuỗi không có trở lại 123 và 124 và 125. 626 00:27:16,930 --> 00:27:19,950 Nó không có để cung cấp cho tôi một dài danh sách của tất cả các byte 627 00:27:19,950 --> 00:27:20,740 chuỗi của tôi đang sử dụng. 628 00:27:20,740 --> 00:27:22,670 Bởi vì một, tất cả đều trở lại trở lại. 629 00:27:22,670 --> 00:27:28,160 Và hai, dựa trên địa chỉ đầu tiên, tôi có thể tìm ra nơi kết thúc chuỗi. 630 00:27:28,160 --> 00:27:29,910 Làm thế nào? 631 00:27:29,910 --> 00:27:33,490 >> Các ký tự null đặc biệt, dấu gạch chéo ngược không ở cuối. 632 00:27:33,490 --> 00:27:35,430 Vì vậy, nói cách khác, nếu bạn chuyển - 633 00:27:35,430 --> 00:27:36,530 bên trong của các biến - 634 00:27:36,530 --> 00:27:41,300 địa chỉ của một char, và bạn giả mà tại kết thúc một chuỗi, bất kỳ 635 00:27:41,300 --> 00:27:45,040 chuỗi các ký tự như con người chúng ta suy nghĩ những chuỗi, nếu bạn cho rằng 636 00:27:45,040 --> 00:27:48,600 tại kết thúc một chuỗi như vậy có một số không dấu chéo ngược, bạn vàng. 637 00:27:48,600 --> 00:27:52,430 Bởi vì bạn luôn luôn có thể tìm thấy kết thúc của một chuỗi. 638 00:27:52,430 --> 00:27:54,870 >> Bây giờ những gì đang thực sự sau đó đi trên trong chương trình này? 639 00:27:54,870 --> 00:27:59,990 Tại sao chương trình này, so sánh-0.c, lỗi? 640 00:27:59,990 --> 00:28:01,690 Những gì thực sự đang được so sánh? 641 00:28:01,690 --> 00:28:02,420 Yeah? 642 00:28:02,420 --> 00:28:05,000 >> HỌC SINH: [nghe được]. 643 00:28:05,000 --> 00:28:05,730 >> DAVID Malan: Chính xác. 644 00:28:05,730 --> 00:28:08,350 Nó so sánh các địa điểm của các chuỗi. 645 00:28:08,350 --> 00:28:12,420 Vì vậy, nếu người dùng đã gõ trong chào một lần, như tôi đã làm, bộ nhớ có thể kết thúc 646 00:28:12,420 --> 00:28:13,430 tìm kiếm như thế này. 647 00:28:13,430 --> 00:28:18,210 Nếu người dùng sau đó loại trong chào một lần nữa, nhưng bằng cách gọi nhận được chuỗi một lần nữa, c là 648 00:28:18,210 --> 00:28:21,800 không đặc biệt thông minh, trừ khi bạn dạy nó sẽ được thông minh bằng cách viết mã. 649 00:28:21,800 --> 00:28:22,430 >> C - 650 00:28:22,430 --> 00:28:23,860 và các máy tính nói chung - 651 00:28:23,860 --> 00:28:27,370 nếu bạn gõ vào từ hello một lần nữa, bạn biết những gì bạn sẽ nhận được. 652 00:28:27,370 --> 00:28:31,480 Bạn chỉ cần đi để có được một mảng thứ hai bộ nhớ, có, xảy ra, hãy 653 00:28:31,480 --> 00:28:35,510 lưu trữ H-E-L-L-O và vv. 654 00:28:35,510 --> 00:28:38,240 >> Nó sẽ giống nhau để con người chúng ta, nhưng địa chỉ này 655 00:28:38,240 --> 00:28:39,460 có thể không được 123. 656 00:28:39,460 --> 00:28:42,470 Nó chỉ có thể để xảy ra rằng hệ điều hành có một số có sẵn 657 00:28:42,470 --> 00:28:45,430 không gian ví dụ tại địa điểm - 658 00:28:45,430 --> 00:28:49,820 chúng ta hãy nói điều gì đó tùy ý, như thế này là vị trí 200. 659 00:28:49,820 --> 00:28:51,620 Và đây là vị trí 201. 660 00:28:51,620 --> 00:28:53,060 Và đây là vị trí 202. 661 00:28:53,060 --> 00:28:55,730 Chúng tôi không có ý tưởng đó là sẽ có trong bộ nhớ. 662 00:28:55,730 --> 00:28:59,110 >> Nhưng điều này có nghĩa là đó là những gì sẽ được lưu trữ cuối cùng trong s? 663 00:28:59,110 --> 00:29:00,750 Số 123. 664 00:29:00,750 --> 00:29:04,860 Những gì sẽ được lưu trữ trong t, trong ví dụ tùy ý này? 665 00:29:04,860 --> 00:29:06,300 Số 200. 666 00:29:06,300 --> 00:29:11,410 Và tất cả những gì có nghĩa là sau đó rõ ràng là, 123 không bằng 200. 667 00:29:11,410 --> 00:29:14,940 Và vì vậy điều này nếu điều kiện không bao giờ đánh giá đúng sự thật. 668 00:29:14,940 --> 00:29:18,430 Vì get chuỗi được sử dụng khác nhau khối bộ nhớ mỗi lần. 669 00:29:18,430 --> 00:29:20,360 >> Bây giờ chúng ta có thể thấy điều này một lần nữa trong ví dụ khác. 670 00:29:20,360 --> 00:29:23,764 Hãy để tôi đi trước và mở bản sao-0.c. 671 00:29:23,764 --> 00:29:28,770 Tôi cho rằng ví dụ này sẽ cố gắng - nhưng không - sao chép hai dây 672 00:29:28,770 --> 00:29:29,910 như sau. 673 00:29:29,910 --> 00:29:31,730 >> Tôi sẽ nói điều gì đó cho người sử dụng. 674 00:29:31,730 --> 00:29:34,490 Tôi sau đó sẽ nhận được một chuỗi và gọi nó là s. 675 00:29:34,490 --> 00:29:36,400 Và bây giờ, tôi đang làm việc kiểm tra này đây. 676 00:29:36,400 --> 00:29:37,990 Chúng tôi đề cập đến điều này một khi trở lại. 677 00:29:37,990 --> 00:29:42,490 Nhưng khi có thể nhận được chuỗi trở lại null, một nhân vật đặc biệt, hoặc đặc biệt 678 00:29:42,490 --> 00:29:45,050 biểu tượng chúng ta hãy nói. 679 00:29:45,050 --> 00:29:45,900 Nếu nó ra khỏi bộ nhớ. 680 00:29:45,900 --> 00:29:48,970 >> Ví dụ, nếu người sử dụng thực sự là khó khăn và các loại một tồi tệ 681 00:29:48,970 --> 00:29:51,220 số ký tự tại bàn phím và số truy cập Nhập. 682 00:29:51,220 --> 00:29:54,580 Nếu mà số ký tự chỉ có thể không phù hợp với bộ nhớ RAM cho bất cứ điều gì điên 683 00:29:54,580 --> 00:29:57,820 lý do, cũng có được chuỗi might rất tốt trả về null. 684 00:29:57,820 --> 00:30:01,080 >> Hoặc nếu chương trình của bạn tự nó được làm rất nhiều những thứ khác và có chỉ 685 00:30:01,080 --> 00:30:03,790 không đủ bộ nhớ cho get chuỗi để thành công, nó có thể kết thúc 686 00:30:03,790 --> 00:30:05,240 lên trở về null. 687 00:30:05,240 --> 00:30:07,160 Nhưng chúng ta hãy chính xác hơn như này là gì. 688 00:30:07,160 --> 00:30:10,280 Kiểu dữ liệu s là những gì thực sự? 689 00:30:10,280 --> 00:30:11,610 Sao char. 690 00:30:11,610 --> 00:30:14,560 >> Thực ra, bây giờ chúng tôi có thể bóc sao các lớp null. 691 00:30:14,560 --> 00:30:17,500 Hóa ra, null là - có, rõ ràng một biểu tượng đặc biệt. 692 00:30:17,500 --> 00:30:19,190 Nhưng nó là những gì thực sự? 693 00:30:19,190 --> 00:30:25,220 Thực sự, vô giá trị chỉ là một biểu tượng mà chúng ta con người sử dụng để đại diện cho không là tốt. 694 00:30:25,220 --> 00:30:29,010 >> Vì vậy, các tác giả của C, và máy tính nói chung, quyết định năm trước 695 00:30:29,010 --> 00:30:30,010 đó, bạn biết những gì. 696 00:30:30,010 --> 00:30:34,850 Tại sao chúng ta không đảm bảo rằng không có người dùng dữ liệu là bao giờ, bao giờ, bao giờ 697 00:30:34,850 --> 00:30:36,730 bảo quản ở tạm biệt không? 698 00:30:36,730 --> 00:30:39,610 Trong thực tế, ngay cả trong ví dụ tùy ý của tôi trước đó, tôi đã không bắt đầu đánh số 699 00:30:39,610 --> 00:30:40,390 byte tại số không. 700 00:30:40,390 --> 00:30:41,540 Tôi bắt đầu tại một. 701 00:30:41,540 --> 00:30:44,950 Bởi vì tôi biết rằng mọi người trên thế giới đã quyết định bảo lưu không 702 00:30:44,950 --> 00:30:47,970 byte trong bộ nhớ RAM của bất kỳ ai như một cái gì đó đặc biệt. 703 00:30:47,970 --> 00:30:52,020 >> Lý do là, bất cứ lúc nào bạn muốn báo hiệu rằng một cái gì đó đã đi sai 704 00:30:52,020 --> 00:30:55,960 Đối với các địa chỉ với, bạn quay trở lại null - hay còn gọi là không - 705 00:30:55,960 --> 00:30:59,410 và bởi vì bạn biết rằng không có legit dữ liệu tại địa chỉ không rõ ràng 706 00:30:59,410 --> 00:31:00,400 có nghĩa là một lỗi. 707 00:31:00,400 --> 00:31:04,080 Và đó là lý do tại sao chúng ta, theo quy ước, kiểm tra cho null và trở lại một cái gì đó 708 00:31:04,080 --> 00:31:06,260 như một trong những trường hợp đó. 709 00:31:06,260 --> 00:31:09,300 >> Vì vậy, nếu chúng ta di chuyển xuống bây giờ, đây chỉ là sau đó một số kiểm tra lỗi, chỉ trong trường hợp 710 00:31:09,300 --> 00:31:10,610 một cái gì đó đã đi sai với [? cứu?] 711 00:31:10,610 --> 00:31:13,470 hoàn toàn và thoát khỏi chương trình bằng cách quay đầu. 712 00:31:13,470 --> 00:31:19,030 Dòng này bây giờ có thể được viết lại như này, có nghĩa là gì? 713 00:31:19,030 --> 00:31:23,155 Ở phía bên tay trái, cho tôi một con trỏ đến một nhân vật, và gọi nó là t. 714 00:31:23,155 --> 00:31:26,935 Tôi đang lưu trữ những gì bên trong của t, dựa về điều này một dòng mã? 715 00:31:26,935 --> 00:31:30,950 716 00:31:30,950 --> 00:31:32,170 >> Tôi đang lưu trữ một địa điểm. 717 00:31:32,170 --> 00:31:34,742 Đặc biệt là vị trí đó là trong s. 718 00:31:34,742 --> 00:31:39,000 Vì vậy, nếu người dùng đã gõ trong hello, và mà lần đầu tiên chào xảy ra để kết thúc 719 00:31:39,000 --> 00:31:42,567 ở đây, sau đó là số 123 là sẽ trở lại từ được 720 00:31:42,567 --> 00:31:43,810 chuỗi và được lưu trữ - 721 00:31:43,810 --> 00:31:44,780 như chúng tôi đã nói trước đó - 722 00:31:44,780 --> 00:31:45,440 trong s. 723 00:31:45,440 --> 00:31:50,560 >> Khi bây giờ tôi tuyên bố một con trỏ để một char và gọi nó là t, những gì số là 724 00:31:50,560 --> 00:31:53,940 nghĩa là sẽ kết thúc trong t theo những câu chuyện? 725 00:31:53,940 --> 00:31:55,420 Vì vậy, 123. 726 00:31:55,420 --> 00:32:00,310 >> Vì vậy, về mặt kỹ thuật bây giờ cả hai s và t được trỏ đến chính xác 727 00:32:00,310 --> 00:32:02,410 cùng một khối của bộ nhớ. 728 00:32:02,410 --> 00:32:06,140 Vì vậy, nhận thấy những gì tôi sẽ làm bây giờ để chứng minh rằng chương trình này là lỗi. 729 00:32:06,140 --> 00:32:08,820 >> Đầu tiên tôi sẽ yêu cầu bồi thường, với một bản in f, tận 730 00:32:08,820 --> 00:32:10,080 các bản sao của chuỗi. 731 00:32:10,080 --> 00:32:11,660 Sau đó, tôi sẽ làm một ít kiểm tra lỗi. 732 00:32:11,660 --> 00:32:12,160 Tôi sẽ đảm bảo. 733 00:32:12,160 --> 00:32:16,710 Hãy chắc chắn rằng chuỗi t là ít nhất là lớn hơn không dài, 734 00:32:16,710 --> 00:32:19,190 do đó, có một số nhân vật có để thực sự tận dụng. 735 00:32:19,190 --> 00:32:22,840 >> Và sau đó bạn có thể nhớ lại này từ ví dụ trước. 736 00:32:22,840 --> 00:32:25,630 2 trên - đó là trong các tập tin ctype.h. 737 00:32:25,630 --> 00:32:30,800 T khung không mang lại cho tôi không ký tự của chuỗi t. 738 00:32:30,800 --> 00:32:34,360 Và 2 trên của cùng một giá trị, Tất nhiên, chuyển đổi nó thành chữ hoa. 739 00:32:34,360 --> 00:32:38,230 >> Vì vậy, bằng trực giác, dòng này nhấn mạnh mã được tận dụng đầu tiên 740 00:32:38,230 --> 00:32:40,250 thư trong t. 741 00:32:40,250 --> 00:32:44,485 Nhưng nó không tận dụng, trực giác, các chữ cái đầu tiên trong s. 742 00:32:44,485 --> 00:32:48,130 Nhưng nếu bạn đang suy nghĩ trước, tôi là gì về để xem khi tôi chạy chương trình này 743 00:32:48,130 --> 00:32:54,220 và in ra cả hai bản gốc, , và cái gọi là bản sao, t? 744 00:32:54,220 --> 00:32:55,350 >> Họ đang thực sự có được như vậy. 745 00:32:55,350 --> 00:32:56,600 Và tại sao họ sẽ giống nhau không? 746 00:32:56,600 --> 00:32:58,970 747 00:32:58,970 --> 00:33:01,020 Họ đều trỏ đến chính xác những điều tương tự. 748 00:33:01,020 --> 00:33:01,610 Vì vậy, chúng ta hãy làm điều này. 749 00:33:01,610 --> 00:33:03,160 >> Làm sao không. 750 00:33:03,160 --> 00:33:04,070 Nó biên dịch OK. 751 00:33:04,070 --> 00:33:06,500 Cho phép tôi chạy bản sao không. 752 00:33:06,500 --> 00:33:10,110 Hãy để tôi gõ một cái gì đó như chào trong tất cả các chữ thường sau đó nhấn Enter. 753 00:33:10,110 --> 00:33:16,520 Và nó tuyên bố rằng cả hai ban đầu của và bản sao có thực sự giống hệt nhau. 754 00:33:16,520 --> 00:33:17,920 >> Vì vậy, những gì thực sự xảy ra ở đây? 755 00:33:17,920 --> 00:33:20,100 Hãy để tôi vẽ lại hình ảnh này chỉ kể lại câu chuyện trong một 756 00:33:20,100 --> 00:33:21,340 cách hơi khác nhau. 757 00:33:21,340 --> 00:33:26,060 Thực sự là những gì đang diễn ra bên dưới mui xe khi tôi tuyên bố một cái gì đó như 758 00:33:26,060 --> 00:33:30,410 char bắt đầu, hoặc chuỗi s, Tôi nhận được một con trỏ - 759 00:33:30,410 --> 00:33:33,090 mà sẽ xảy ra là bốn byte trong các thiết bị CS50 760 00:33:33,090 --> 00:33:34,410 và trong rất nhiều máy tính. 761 00:33:34,410 --> 00:33:36,008 Và tôi sẽ gọi s này. 762 00:33:36,008 --> 00:33:39,810 Và điều này hiện có một số giá trị không rõ. 763 00:33:39,810 --> 00:33:43,900 >> Khi bạn khai báo một biến, trừ khi bạn mình đặt một giá trị đó, những người 764 00:33:43,900 --> 00:33:44,570 biết những gì đang có. 765 00:33:44,570 --> 00:33:48,110 Nó có thể là một số trình tự ngẫu nhiên bit từ thực hiện trước đó. 766 00:33:48,110 --> 00:33:52,490 Vì vậy, khi tôi, trong dòng của tôi dùng để làm được chuỗi, và sau đó lưu lại 767 00:33:52,490 --> 00:33:54,800 giá trị trong s nhận được chuỗi bằng cách nào đó - 768 00:33:54,800 --> 00:33:58,520 và chúng tôi sẽ cuối cùng vỏ lại như thế nào có được công trình chuỗi, bằng cách nào đó phân bổ một 769 00:33:58,520 --> 00:34:00,480 mảng có thể trông một chút như thế này. 770 00:34:00,480 --> 00:34:05,390 H-E-L-L-O, dấu gạch chéo ngược không. 771 00:34:05,390 --> 00:34:09,510 >> Chúng ta hãy giả sử rằng đây là địa chỉ 123 chỉ thống nhất đầu tiên. 772 00:34:09,510 --> 00:34:13,000 Vì vậy, có được lợi nhuận chuỗi, trong nhấn mạnh dòng đó, nó trả về 773 00:34:13,000 --> 00:34:15,000 số chúng tôi đã nói, 123. 774 00:34:15,000 --> 00:34:17,420 Vì vậy, những gì thực sự diễn ra bên trong của s đây? 775 00:34:17,420 --> 00:34:26,590 >> Vâng, những gì thực sự đi bên trong của s là 123. 776 00:34:26,590 --> 00:34:29,250 Nhưng thẳng thắn mà nói, tôi nhận được một chút bối rối bởi tất cả các địa chỉ, 777 00:34:29,250 --> 00:34:30,320 tất cả các số bất kỳ. 778 00:34:30,320 --> 00:34:32,290 123, 124, 127. 779 00:34:32,290 --> 00:34:34,570 Vì vậy, chúng ta hãy thực sự đơn giản hóa thế giới một chút. 780 00:34:34,570 --> 00:34:38,800 >> Khi chúng ta nói về con trỏ, thẳng thắn, để con người chúng ta, ai có hề quan tâm đến nơi 781 00:34:38,800 --> 00:34:39,870 điều này là trong bộ nhớ? 782 00:34:39,870 --> 00:34:41,080 Đó là hoàn toàn tùy ý. 783 00:34:41,080 --> 00:34:43,370 Nó sẽ phụ thuộc vào cách nhiêu RAM người dùng có. 784 00:34:43,370 --> 00:34:46,590 Nó sẽ phụ thuộc vào khi trong ngày bạn chạy chương trình, có lẽ, và 785 00:34:46,590 --> 00:34:48,250 những gì đầu vào người sử dụng cung cấp cho bạn. 786 00:34:48,250 --> 00:34:50,060 Chúng tôi đang ở trên chi tiết không quan trọng. 787 00:34:50,060 --> 00:34:54,230 >> Vì vậy, chúng ta hãy tóm tắt đi và nói rằng, khi bạn chạy một dòng mã như thế này, 788 00:34:54,230 --> 00:34:57,320 char sao không thắng được trở lại giá trị của get chuỗi. 789 00:34:57,320 --> 00:35:02,720 Tại sao chúng ta không thay vì chỉ vẽ những gì chúng tôi tiếp tục gọi một con trỏ như thể đó là 790 00:35:02,720 --> 00:35:04,140 chỉ vào một cái gì đó? 791 00:35:04,140 --> 00:35:07,000 Vì vậy, tôi khẳng định bây giờ mà s lên có một con trỏ - 792 00:35:07,000 --> 00:35:08,480 bên dưới mui xe đó là một địa chỉ. 793 00:35:08,480 --> 00:35:11,330 Nhưng nó chỉ trỏ đến byte đầu tiên trong 794 00:35:11,330 --> 00:35:12,780 chuỗi đó là được trả lại. 795 00:35:12,780 --> 00:35:16,710 >> Nếu bây giờ tôi quay trở lại mã ở đây, những gì đang xảy ra ở dòng này? 796 00:35:16,710 --> 00:35:20,020 Vâng, trong này nhấn mạnh dòng bây giờ, Tôi tuyên bố rõ ràng khác 797 00:35:20,020 --> 00:35:21,070 biến gọi là t. 798 00:35:21,070 --> 00:35:25,700 Nhưng nó cũng là một con trỏ, vì vậy tôi sẽ để vẽ nó như, trong lý thuyết, chính xác 799 00:35:25,700 --> 00:35:26,710 hộp cùng kích thước. 800 00:35:26,710 --> 00:35:28,160 Và tôi sẽ gọi nó là t. 801 00:35:28,160 --> 00:35:33,500 >> Và bây giờ nếu chúng ta quay trở lại mã một lần nữa, khi tôi lưu trữ s bên trong của t, 802 00:35:33,500 --> 00:35:36,920 những gì tôi về mặt kỹ thuật đặt bên trong t? 803 00:35:36,920 --> 00:35:39,350 Tốt về mặt kỹ thuật, điều này là số 123. 804 00:35:39,350 --> 00:35:42,270 Vì vậy, thực sự tôi nên viết số 123 có. 805 00:35:42,270 --> 00:35:43,900 Nhưng chúng ta hãy xem nó cấp cao hơn. 806 00:35:43,900 --> 00:35:48,090 t, nếu nó chỉ là một con trỏ, trực giác, chỉ là. 807 00:35:48,090 --> 00:35:49,800 Đó là tất cả những gì là được lưu trữ trong đó. 808 00:35:49,800 --> 00:35:54,970 >> Vì vậy, bây giờ trong các đường thú vị nhất mã, khi tôi thực sự đi về 809 00:35:54,970 --> 00:36:00,680 tận dụng các nhân vật không trong t, những gì đang xảy ra? 810 00:36:00,680 --> 00:36:06,310 Vâng, t khung không được bây giờ chỉ với những gì nhân vật, có lẽ? 811 00:36:06,310 --> 00:36:07,460 >> Nó chỉ vào h. 812 00:36:07,460 --> 00:36:08,870 Vì t khung không - 813 00:36:08,870 --> 00:36:12,490 nhớ lại, đây là cú pháp cũ. t khung không chỉ có nghĩa là nếu t là một chuỗi, t 814 00:36:12,490 --> 00:36:15,590 khung không có nghĩa là nhận được không nhân vật trong sức mạnh. 815 00:36:15,590 --> 00:36:18,650 Vì vậy, những gì mà thực sự có nghĩa là là đi đến mảng này - 816 00:36:18,650 --> 00:36:21,520 và có, điều này có thể là 123, này có thể là 124. 817 00:36:21,520 --> 00:36:22,790 Nhưng đó là tất cả tương đối, hãy nhớ. 818 00:36:22,790 --> 00:36:25,640 Bất cứ khi nào nói về một mảng, chúng ta có lợi thế là nói về 819 00:36:25,640 --> 00:36:27,000 chỉ số tương đối. 820 00:36:27,000 --> 00:36:31,120 >> Và vì vậy bây giờ chúng ta chỉ có thể giả định mà t khung không là h. 821 00:36:31,120 --> 00:36:35,090 Vì vậy, nếu tôi gọi 2 trên trên nó, những gì đó thực sự làm là tận 822 00:36:35,090 --> 00:36:38,290 h chữ thường để chữ hoa H. Nhưng tất nhiên, những gì là s? 823 00:36:38,290 --> 00:36:41,010 Nó chỉ vào chuỗi darn cùng. 824 00:36:41,010 --> 00:36:44,200 >> Vì vậy, đây là tất cả những gì đã xảy ra trong mã này cho đến nay. 825 00:36:44,200 --> 00:36:45,960 Vì vậy, những gì sau đó ngụ ý? 826 00:36:45,960 --> 00:36:48,300 Làm thế nào để chúng tôi sửa chữa hai vấn đề này? 827 00:36:48,300 --> 00:36:50,870 Làm thế nào để chúng ta so sánh các chuỗi thực tế? 828 00:36:50,870 --> 00:36:53,720 >> Cũng trực giác, như thế nào sẽ bạn đi về so sánh hai 829 00:36:53,720 --> 00:36:55,090 dây cho thật sự bình đẳng? 830 00:36:55,090 --> 00:36:58,920 831 00:36:58,920 --> 00:37:00,750 >> Có nghĩa là gì nếu hai chuỗi bằng nhau? 832 00:37:00,750 --> 00:37:04,330 Rõ ràng không phải là địa chỉ của họ bằng trong bộ nhớ, bởi vì đó là mức thấp 833 00:37:04,330 --> 00:37:06,590 chi tiết thực hiện cấp. 834 00:37:06,590 --> 00:37:08,360 Tất cả các nhân vật đều giống nhau. 835 00:37:08,360 --> 00:37:12,810 Vì vậy, hãy để tôi đưa ra, và cho tôi giới thiệu trong phiên bản một trong compare.c 836 00:37:12,810 --> 00:37:14,970 ở đây, vì vậy so sánh-1.c. 837 00:37:14,970 --> 00:37:19,590 >> Hãy để tôi đề nghị chúng ta vẫn có được một con trỏ được gọi là, và cửa hàng trong nó 838 00:37:19,590 --> 00:37:20,610 trả lại giá trị của get chuỗi. 839 00:37:20,610 --> 00:37:21,750 Chúng ta hãy làm điều tương tự với t. 840 00:37:21,750 --> 00:37:23,230 Vì vậy, không có code là khác nhau. 841 00:37:23,230 --> 00:37:25,420 Tôi sẽ thêm một chút hơn kiểm tra tại lỗi. 842 00:37:25,420 --> 00:37:29,390 Vì vậy, bây giờ mà chúng tôi đang sắp xếp hé lớp này trong CS50 về những gì một chuỗi 843 00:37:29,390 --> 00:37:33,520 thực sự là, chúng ta cần phải qua đường hậu môn hơn về việc bảo đảm chúng ta không nên lạm dụng 844 00:37:33,520 --> 00:37:35,330 giá trị không hợp lệ như vô giá trị. 845 00:37:35,330 --> 00:37:36,440 >> Vì vậy, tôi chỉ cần đi để kiểm tra. 846 00:37:36,440 --> 00:37:41,490 Nếu anh không vô giá trị như nhau và t không vô giá trị như nhau, có nghĩa là chúng tôi OK. 847 00:37:41,490 --> 00:37:44,460 Được chuỗi không vít lên nhận một trong những chuỗi. 848 00:37:44,460 --> 00:37:51,270 Và bạn có lẽ có thể đoán bây giờ, những gì không STR CMP có lẽ làm gì? 849 00:37:51,270 --> 00:37:52,000 Chuỗi so sánh. 850 00:37:52,000 --> 00:37:55,470 >> Vì vậy, nếu bạn đã chương trình trong java trước, điều này cũng giống như các phương pháp bằng trong 851 00:37:55,470 --> 00:37:56,490 lớp chuỗi. 852 00:37:56,490 --> 00:37:57,890 Nhưng đối với những người bạn của những người có không lập trình trước, 853 00:37:57,890 --> 00:37:59,320 đây chỉ là một chức năng c. 854 00:37:59,320 --> 00:38:02,180 Nó xảy ra cho đến trong một tập tin gọi là string.h. 855 00:38:02,180 --> 00:38:03,830 Đó là nơi mà nó được khai báo. 856 00:38:03,830 --> 00:38:05,110 >> Và chuỗi so sánh - 857 00:38:05,110 --> 00:38:07,530 Tôi thực sự quên sử dụng của nó, nhưng không bao giờ nhớ rằng. 858 00:38:07,530 --> 00:38:10,470 Nhớ lại rằng chúng tôi có thể làm người đàn ông, khuấy động so sánh. 859 00:38:10,470 --> 00:38:12,590 Và điều này sẽ mang đến những Linux lập trình bằng tay. 860 00:38:12,590 --> 00:38:14,060 Và đó là, thẳng thắn, một chút khó hiểu. 861 00:38:14,060 --> 00:38:15,270 Nhưng tôi có thể thấy ở đây là, vâng. 862 00:38:15,270 --> 00:38:17,570 Tôi phải bao gồm string.h. 863 00:38:17,570 --> 00:38:20,590 >> Và nó nói ở đây theo mô tả, "các chuỗi chức năng so sánh so sánh 864 00:38:20,590 --> 00:38:24,560 hai chuỗi S1 và S2. "Và S1 và S2 là rõ ràng là hai 865 00:38:24,560 --> 00:38:26,120 lập luận thông qua nhập 866 00:38:26,120 --> 00:38:28,650 Tôi không thực sự nhớ những gì const là, nhưng bây giờ thấy - 867 00:38:28,650 --> 00:38:31,480 và bạn có thể thấy điều này khi đã bạn đã sử dụng các trang người đàn ông nếu bạn 868 00:38:31,480 --> 00:38:32,390 có tất cả - 869 00:38:32,390 --> 00:38:36,220 mà sao char chỉ là đồng nghĩa với chuỗi. 870 00:38:36,220 --> 00:38:40,440 >> Vì vậy, nó sẽ so sánh hai dây, S1 và S2, và nó sẽ trả về một số nguyên ít hơn 871 00:38:40,440 --> 00:38:44,930 hơn hoặc bằng hoặc lớn hơn không nếu S1 được tìm thấy, tương ứng, để được 872 00:38:44,930 --> 00:38:47,450 ít hơn, hoặc kết hợp, hoặc lớn hơn S2. 873 00:38:47,450 --> 00:38:51,220 Đó chỉ là một cách rất phức tạp để nói rằng chuỗi so sánh lợi nhuận 874 00:38:51,220 --> 00:38:55,760 không nếu hai chuỗi bằng trực giác giống hệt nhau, nhân vật cho 875 00:38:55,760 --> 00:38:57,120 nhân vật cho nhân vật. 876 00:38:57,120 --> 00:38:59,970 >> Nó trả về một số âm nếu s, theo thứ tự abc, là nghĩa vụ 877 00:38:59,970 --> 00:39:01,010 đến trước t. 878 00:39:01,010 --> 00:39:05,300 Hoặc trả về một số dương nếu s là nghĩa vụ phải đến sau khi t 879 00:39:05,300 --> 00:39:06,170 theo thứ tự abc. 880 00:39:06,170 --> 00:39:08,360 Vì vậy, với chức năng này đơn giản, có thể bạn, ví dụ, sắp xếp một 881 00:39:08,360 --> 00:39:09,770 bó toàn bộ các từ ngữ? 882 00:39:09,770 --> 00:39:13,984 >> Vì vậy, trong phiên bản mới này, tôi sẽ đi trước và làm cho compare1. 883 00:39:13,984 --> 00:39:15,750 Dot dấu gạch chéo so sánh một. 884 00:39:15,750 --> 00:39:18,030 Tôi sẽ gõ vào xin chào trong tất cả các trường hợp thấp hơn. 885 00:39:18,030 --> 00:39:20,300 Tôi sẽ gõ vào xin chào trong tất cả các chữ thường một lần nữa. 886 00:39:20,300 --> 00:39:23,340 Và may mắn bây giờ nó nhận ra Tôi đã gõ cùng một điều. 887 00:39:23,340 --> 00:39:27,520 >> Trong khi đó, nếu tôi gõ vào xin chào trong thấp hơn trường hợp và Hello trong trường hợp trên và 888 00:39:27,520 --> 00:39:29,710 so sánh chúng, tôi đã gõ những thứ khác nhau. 889 00:39:29,710 --> 00:39:32,530 Bởi vì không chỉ là địa chỉ khác nhau, nhưng chúng ta đang so sánh 890 00:39:32,530 --> 00:39:35,350 nhân vật khác nhau một lần nữa và một lần nữa. 891 00:39:35,350 --> 00:39:37,320 >> Vâng chúng ta hãy đi và sửa chữa một vấn đề khác hiện nay. 892 00:39:37,320 --> 00:39:41,590 Hãy để tôi mở ra một trong những phiên bản bản sao, mà giờ đây giải thích 893 00:39:41,590 --> 00:39:42,900 vấn đề này như sau. 894 00:39:42,900 --> 00:39:45,650 Và một điều này sẽ trông một chút phức tạp hơn. 895 00:39:45,650 --> 00:39:49,320 Nhưng nếu bạn suy nghĩ về vấn đề gì, chúng tôi cần phải giải quyết, hy vọng điều này sẽ được 896 00:39:49,320 --> 00:39:51,870 rõ ràng chỉ trong một thời điểm bây giờ. 897 00:39:51,870 --> 00:39:57,280 >> Vì vậy, dòng đầu tiên này, char bắt đầu t, trong điều khoản của layman ai đó có thể đề xuất 898 00:39:57,280 --> 00:39:59,450 những dòng này ở đây nghĩa là gì? 899 00:39:59,450 --> 00:40:01,050 Char sao t, những gì là làm gì? 900 00:40:01,050 --> 00:40:06,660 901 00:40:06,660 --> 00:40:07,210 >> Tốt. 902 00:40:07,210 --> 00:40:09,500 Tạo ra một con trỏ đến một số vị trí trong bộ nhớ. 903 00:40:09,500 --> 00:40:10,930 Và cho tôi tinh chỉnh nó một chút. 904 00:40:10,930 --> 00:40:17,180 Khai báo một biến sẽ lưu trữ địa chỉ của một số char trong bộ nhớ, chỉ cần 905 00:40:17,180 --> 00:40:18,480 có một chút thích hợp hơn. 906 00:40:18,480 --> 00:40:21,210 >> OK, vì vậy bây giờ ở phía bên tay phải, tôi đã không bao giờ nhìn thấy một trong những chức năng 907 00:40:21,210 --> 00:40:22,660 trước, malloc. 908 00:40:22,660 --> 00:40:26,980 Nhưng những gì mà có thể nghĩa là gì? 909 00:40:26,980 --> 00:40:28,050 Cấp phát bộ nhớ. 910 00:40:28,050 --> 00:40:29,410 Cấp phát bộ nhớ. 911 00:40:29,410 --> 00:40:33,050 >> Vì vậy, nó quay ra, cho đến bây giờ, chúng tôi đã không thực sự có một cách mạnh mẽ của 912 00:40:33,050 --> 00:40:36,210 yêu cầu hệ điều hành, cung cấp cho tôi một số bộ nhớ. 913 00:40:36,210 --> 00:40:39,980 Thay vào đó, chúng ta có một chức năng được gọi là malloc thực hiện chính xác đó. 914 00:40:39,980 --> 00:40:42,960 Mặc dù đây là một chút của một mất tập trung ngay bây giờ, nhận thấy rằng trong 915 00:40:42,960 --> 00:40:46,200 giữa hai dấu ngoặc đơn là chỉ có được một số. 916 00:40:46,200 --> 00:40:48,510 Nơi tôi đã nhập vào câu hỏi dấu hiệu có thể là một số. 917 00:40:48,510 --> 00:40:51,020 >> Và con số này có nghĩa là, cho tôi 10 byte. 918 00:40:51,020 --> 00:40:52,320 Cho tôi 20 byte. 919 00:40:52,320 --> 00:40:53,820 Cho tôi 100 byte. 920 00:40:53,820 --> 00:40:56,500 Và malloc sẽ làm hết sức mình để yêu cầu hệ điều hành - 921 00:40:56,500 --> 00:40:57,630 Linux, trong trường hợp này - 922 00:40:57,630 --> 00:40:59,630 hey, là 100 byte của họ RAM có sẵn? 923 00:40:59,630 --> 00:41:04,320 Nếu như vậy, trả lại những byte cho tôi trả lại địa chỉ đó của 924 00:41:04,320 --> 00:41:06,610 những byte, có lẽ? 925 00:41:06,610 --> 00:41:07,610 Việc đầu tiên một. 926 00:41:07,610 --> 00:41:10,460 >> Vì vậy, ở đây - và đây là chủ yếu trong C, bất cứ lúc nào bạn 927 00:41:10,460 --> 00:41:11,680 đối phó với các địa chỉ? 928 00:41:11,680 --> 00:41:15,830 Bạn gần như luôn luôn đối phó với các địa chỉ đầu tiên như vậy, không có vấn đề lớn như thế nào 929 00:41:15,830 --> 00:41:19,490 một đoạn bộ nhớ bạn đang được giao lại, có thể nói. 930 00:41:19,490 --> 00:41:20,880 >> Vì vậy, chúng ta hãy đi sâu vào đây. 931 00:41:20,880 --> 00:41:23,940 Tôi cố gắng để phân bổ như thế nào nhiều byte, chính xác? 932 00:41:23,940 --> 00:41:24,080 Tốt. 933 00:41:24,080 --> 00:41:26,090 Chiều dài chuỗi s - hãy làm một ví dụ cụ thể. 934 00:41:26,090 --> 00:41:30,700 Nếu s là xin chào, H-E-L-L-O, là những gì chiều dài chuỗi s, rõ ràng? 935 00:41:30,700 --> 00:41:32,010 Vì vậy, năm. 936 00:41:32,010 --> 00:41:34,590 Nhưng tôi đang làm một cộng thêm 1 vào đó, tại sao? 937 00:41:34,590 --> 00:41:37,700 Tại sao tôi muốn sáu byte thay vì năm? 938 00:41:37,700 --> 00:41:38,790 Các ký tự null. 939 00:41:38,790 --> 00:41:41,210 >> Tôi không muốn rời khỏi đây vật vô giá trị đặc biệt. 940 00:41:41,210 --> 00:41:45,160 Bởi vì nếu tôi làm cho một bản sao của Xin chào và chỉ cần làm H-E-L-L-O, nhưng tôi không đặt 941 00:41:45,160 --> 00:41:50,160 rằng nhân vật đặc biệt, máy tính có thể không có, bởi cơ hội, một dấu chéo ngược 942 00:41:50,160 --> 00:41:51,730 bằng không có cho tôi. 943 00:41:51,730 --> 00:41:55,570 Và do đó, nếu tôi đang cố gắng để tìm ra chiều dài của bản sao, tôi có thể nghĩ rằng 944 00:41:55,570 --> 00:41:59,360 nó dài 20 ký tự, hoặc một triệu ký tự nếu tôi chưa bao giờ xảy ra 945 00:41:59,360 --> 00:42:01,050 đánh một dấu chéo ngược không. 946 00:42:01,050 --> 00:42:05,780 >> Vì vậy, chúng ta cần sáu byte để lưu trữ H-E-L-L-O, dấu gạch chéo ngược không. 947 00:42:05,780 --> 00:42:07,870 Và sau đó điều này chỉ là được siêu hậu môn. 948 00:42:07,870 --> 00:42:10,700 Giả sử tôi quên những gì kích thước của một char. 949 00:42:10,700 --> 00:42:12,020 Chúng tôi luôn nói đó là một byte. 950 00:42:12,020 --> 00:42:12,860 Và nó thường là. 951 00:42:12,860 --> 00:42:15,425 Về lý thuyết, nó có thể là một cái gì đó khác nhau, trên một máy Mac khác nhau hoặc một 952 00:42:15,425 --> 00:42:16,250 máy tính khác nhau. 953 00:42:16,250 --> 00:42:19,650 >> Thực ra, có nhà điều hành này gọi là sizeof rằng nếu bạn vượt qua nó 954 00:42:19,650 --> 00:42:22,680 tên của một kiểu dữ liệu - như char hoặc int, hoặc thả nổi - 955 00:42:22,680 --> 00:42:26,930 nó sẽ cho bạn biết, năng động, bao nhiêu byte một char chiếm trên này 956 00:42:26,930 --> 00:42:28,090 đặc biệt là máy tính. 957 00:42:28,090 --> 00:42:31,360 >> Vì vậy, đây là hiệu quả chỉ như nói lần 1 hoặc 958 00:42:31,360 --> 00:42:32,440 Thời gian không có gì cả. 959 00:42:32,440 --> 00:42:36,340 Nhưng tôi đang làm việc đó chỉ để được siêu hậu môn, rằng chỉ trong trường hợp một char khác 960 00:42:36,340 --> 00:42:40,610 trên máy tính so với tôi của bạn, bằng cách này toán học luôn luôn là sẽ kiểm tra. 961 00:42:40,610 --> 00:42:43,720 >> Cuối cùng, ở đây tôi kiểm tra null, mà luôn luôn là tốt thực hành - một lần nữa, 962 00:42:43,720 --> 00:42:44,920 bất cứ lúc nào chúng tôi đang làm việc với con trỏ. 963 00:42:44,920 --> 00:42:47,520 Nếu malloc là không thể cung cấp cho tôi sáu tạm biệt - đó là 964 00:42:47,520 --> 00:42:49,210 không, nhưng chỉ trong trường hợp - 965 00:42:49,210 --> 00:42:50,730 trả lại một ngay lập tức. 966 00:42:50,730 --> 00:42:53,290 Và bây giờ, đi trước và sao chép chuỗi như sau. 967 00:42:53,290 --> 00:42:57,240 Và đây là cú pháp quen thuộc, mặc dù trong một vai trò khác nhau. 968 00:42:57,240 --> 00:43:01,210 >> Tôi sẽ đi trước và có được chuỗi chiều dài của s và lưu trữ nó trong n. 969 00:43:01,210 --> 00:43:06,620 Tôi sau đó sẽ lặp từ i bằng bằng không lên đến và bao gồm cả n, 970 00:43:06,620 --> 00:43:08,410 lớn hơn hoặc bằng. 971 00:43:08,410 --> 00:43:13,540 Vì vậy mà trên mỗi lần lặp, tôi đặt nhân vật thứ i của s trong thứ i 972 00:43:13,540 --> 00:43:15,380 nhân vật của t. 973 00:43:15,380 --> 00:43:18,190 >> Vì vậy, những gì đang thực sự xảy ra bên dưới mui xe đây? 974 00:43:18,190 --> 00:43:22,140 Vâng, nếu điều này, ví dụ, là s - 975 00:43:22,140 --> 00:43:26,400 và tôi đã gõ vào từ H-E-L-L-O và có một dấu gạch chéo ngược không. 976 00:43:26,400 --> 00:43:29,020 Và một lần nữa, đây là s chỉ ở đây. 977 00:43:29,020 --> 00:43:30,830 Và ở đây bây giờ là t. 978 00:43:30,830 --> 00:43:34,860 >> Và điều này là chỉ bây giờ để một bản sao của bộ nhớ, phải không? 979 00:43:34,860 --> 00:43:37,340 Malloc đã cho tôi toàn bộ đoạn bộ nhớ. 980 00:43:37,340 --> 00:43:41,440 Tôi không biết những gì ban đầu trong bất kỳ của các địa điểm này. 981 00:43:41,440 --> 00:43:44,340 Vì vậy, tôi sẽ nghĩ về những như một bó toàn bộ các dấu hỏi. 982 00:43:44,340 --> 00:43:50,190 >> Nhưng ngay sau khi tôi bắt đầu vòng lặp từ con số không trên lên thông qua độ dài của s, t 983 00:43:50,190 --> 00:43:52,790 khung không và t khung 1 - 984 00:43:52,790 --> 00:43:55,080 và tôi sẽ đặt này ngay bây giờ trên chi phí - 985 00:43:55,080 --> 00:44:04,190 t khung không và s khung không có nghĩa là rằng tôi sẽ được sao chép 986 00:44:04,190 --> 00:44:09,875 lặp đi lặp lại h trong đây, E-L-L-O. Thêm vào đó, bởi vì tôi đã cộng 987 00:44:09,875 --> 00:44:12,370 1, dấu gạch chéo ngược không. 988 00:44:12,370 --> 00:44:19,060 >> Vì vậy, bây giờ trong trường hợp so sánh-1.c, cuối cùng, nếu tôi in ra 989 00:44:19,060 --> 00:44:24,760 vốn hóa của t, chúng ta nên thấy rằng s là không thay đổi. 990 00:44:24,760 --> 00:44:26,090 Hãy để tôi đi trước và bây giờ làm điều này. 991 00:44:26,090 --> 00:44:28,630 Vì vậy, hãy copy1. 992 00:44:28,630 --> 00:44:30,860 Dot dấu gạch chéo copy1. 993 00:44:30,860 --> 00:44:33,670 Tôi sẽ gõ vào xin chào, Enter. 994 00:44:33,670 --> 00:44:37,430 Và bây giờ nhận thấy, chỉ có bản sao đã được vốn hóa. 995 00:44:37,430 --> 00:44:40,890 Bởi vì tôi thực sự có hai khối của bộ nhớ. 996 00:44:40,890 --> 00:44:44,390 >> Thật không may, bạn có thể làm một số khá những điều xấu và khá nguy hiểm ở đây. 997 00:44:44,390 --> 00:44:49,290 Hãy để tôi kéo lên một ví dụ ở đây bây giờ, cung cấp cho chúng tôi một ví dụ về một vài 998 00:44:49,290 --> 00:44:51,540 dòng khác nhau. 999 00:44:51,540 --> 00:44:56,040 Vì vậy, chỉ bằng trực giác ở đây, dòng đầu tiên mã, sao int x, được tuyên bố 1000 00:44:56,040 --> 00:44:57,340 một biến gọi là x. 1001 00:44:57,340 --> 00:44:58,810 Và các kiểu dữ liệu là những gì của biến đó? 1002 00:44:58,810 --> 00:45:01,820 1003 00:45:01,820 --> 00:45:04,290 Kiểu dữ liệu của biến đó là những gì? 1004 00:45:04,290 --> 00:45:06,980 Đó không phải là cliffhanger. 1005 00:45:06,980 --> 00:45:08,350 >> Các kiểu dữ liệu là int sao. 1006 00:45:08,350 --> 00:45:12,600 Vì vậy, điều đó không có nghĩa là gì? x sẽ lưu trữ địa chỉ của một int. 1007 00:45:12,600 --> 00:45:13,520 Đơn giản như vậy. 1008 00:45:13,520 --> 00:45:16,220 Y sẽ lưu trữ các địa chỉ của một int. 1009 00:45:16,220 --> 00:45:18,390 Dòng thứ ba là những gì mã làm gì ở đó? 1010 00:45:18,390 --> 00:45:21,850 Nó được phân bổ bao nhiêu byte, rất có thể? 1011 00:45:21,850 --> 00:45:22,350 Bốn. 1012 00:45:22,350 --> 00:45:25,460 Vì kích thước của một int là nói chung là bốn, malloc bốn cho 1013 00:45:25,460 --> 00:45:29,950 tôi trở lại địa chỉ của một đoạn bộ nhớ, lần đầu tiên có byte là 1014 00:45:29,950 --> 00:45:32,110 được lưu trữ tại trong x. 1015 00:45:32,110 --> 00:45:34,410 >> Bây giờ chúng tôi đang di chuyển một chút nhanh chóng. 1016 00:45:34,410 --> 00:45:35,760 Sao x có nghĩa là gì? 1017 00:45:35,760 --> 00:45:38,480 1018 00:45:38,480 --> 00:45:42,590 Nó có nghĩa là đi đến địa chỉ đó và đặt những gì số đó? 1019 00:45:42,590 --> 00:45:43,870 Đưa số 42 đó. 1020 00:45:43,870 --> 00:45:47,590 Sao y có nghĩa là đi đến những gì ở y và đưa ra con số 13 đó. 1021 00:45:47,590 --> 00:45:48,600 >> Nhưng chờ một phút. 1022 00:45:48,600 --> 00:45:51,640 Là những gì trong y vào lúc này? 1023 00:45:51,640 --> 00:45:54,950 Địa chỉ những gì là y lưu trữ? 1024 00:45:54,950 --> 00:45:55,770 Chúng tôi không biết, phải không? 1025 00:45:55,770 --> 00:45:59,230 Chúng tôi chưa bao giờ một lần sử dụng sự phân công nhà điều hành liên quan đến y. 1026 00:45:59,230 --> 00:46:03,370 Vì vậy, y như tuyên bố trên dòng thứ hai của đang chỉ là một số giá trị rác, một lớn 1027 00:46:03,370 --> 00:46:04,760 dấu hỏi vậy để nói chuyện. 1028 00:46:04,760 --> 00:46:07,230 Nó có thể được chỉ ngẫu nhiên để bất cứ điều gì trong bộ nhớ, mà 1029 00:46:07,230 --> 00:46:08,340 nói chung là xấu. 1030 00:46:08,340 --> 00:46:13,540 >> Vì vậy, ngay khi chúng tôi đánh dòng đó, sao y = 13, cái gì xấu, 1031 00:46:13,540 --> 00:46:17,220 một cái gì đó rất xấu là về xảy ra với Binky. 1032 00:46:17,220 --> 00:46:25,810 Vì vậy, chúng ta hãy xem những gì sẽ kết thúc xảy ra với Binky đây trong phút này 1033 00:46:25,810 --> 00:46:26,200 hoặc để xem. 1034 00:46:26,200 --> 00:46:26,490 >> [VIDEO xem lại] 1035 00:46:26,490 --> 00:46:26,745 >> -Này, Binky. 1036 00:46:26,745 --> 00:46:27,000 Thức dậy. 1037 00:46:27,000 --> 00:46:29,296 Đó là thời gian cho con trỏ vui vẻ. 1038 00:46:29,296 --> 00:46:30,680 >> -Cái gì thế? 1039 00:46:30,680 --> 00:46:31,980 Tìm hiểu về con trỏ? 1040 00:46:31,980 --> 00:46:34,010 Oh, goodie. 1041 00:46:34,010 --> 00:46:37,220 >> -Vâng, để bắt đầu, tôi đoán chúng tôi sẽ cần một vài gợi ý. 1042 00:46:37,220 --> 00:46:37,930 >> -OK. 1043 00:46:37,930 --> 00:46:41,650 Mã này cấp phát hai con trỏ mà có thể trỏ đến số nguyên. 1044 00:46:41,650 --> 00:46:43,760 >> -OK, tốt, tôi nhìn thấy hai con trỏ. 1045 00:46:43,760 --> 00:46:45,850 Nhưng họ dường như không được trỏ đến bất cứ điều gì. 1046 00:46:45,850 --> 00:46:46,490 >> -Đúng vậy. 1047 00:46:46,490 --> 00:46:48,630 Ban đầu, con trỏ không trỏ đến bất cứ điều gì. 1048 00:46:48,630 --> 00:46:51,700 Những điều họ chỉ để được gọi là pointees, và thiết lập chúng là một 1049 00:46:51,700 --> 00:46:52,850 bước riêng biệt. 1050 00:46:52,850 --> 00:46:53,740 >> -Oh, đúng rồi. 1051 00:46:53,740 --> 00:46:54,500 Tôi biết điều đó. 1052 00:46:54,500 --> 00:46:56,270 Các pointees là riêng biệt. 1053 00:46:56,270 --> 00:46:58,553 Vì vậy, làm thế nào để bạn phân bổ một pointee? 1054 00:46:58,553 --> 00:46:59,480 >> -OK. 1055 00:46:59,480 --> 00:47:03,707 Vâng, mã này phân bổ một số nguyên mới pointee, và phần này đặt x 1056 00:47:03,707 --> 00:47:05,520 để trỏ đến nó. 1057 00:47:05,520 --> 00:47:06,760 >> -Này, trông tốt hơn. 1058 00:47:06,760 --> 00:47:08,520 Vì vậy, làm cho nó làm một cái gì đó. 1059 00:47:08,520 --> 00:47:09,530 >> -OK. 1060 00:47:09,530 --> 00:47:14,110 Tôi sẽ tới đích của con trỏ x để lưu trữ số 42 vào pointee của nó. 1061 00:47:14,110 --> 00:47:17,660 Đối với thủ thuật này, tôi sẽ cần ma thuật của tôi cây đũa phép của dereferencing. 1062 00:47:17,660 --> 00:47:20,695 >> -Bạn cây đũa thần của dereferencing? 1063 00:47:20,695 --> 00:47:22,632 Uh, đó là tuyệt vời. 1064 00:47:22,632 --> 00:47:24,620 >> -Đây là những gì mã trông như thế nào. 1065 00:47:24,620 --> 00:47:27,526 Tôi sẽ chỉ cần thiết lập số lượng, và - 1066 00:47:27,526 --> 00:47:28,250 >> -Này, nhìn xem. 1067 00:47:28,250 --> 00:47:29,680 Có nó đi. 1068 00:47:29,680 --> 00:47:34,520 Vì vậy, làm một tới đích trên x sau mũi tên để truy cập pointee của nó. 1069 00:47:34,520 --> 00:47:36,690 Trong trường hợp này, để lưu trữ 42 trong đó. 1070 00:47:36,690 --> 00:47:40,890 Này, hãy thử sử dụng nó để lưu trữ các số 13 thông qua con trỏ khác, y. 1071 00:47:40,890 --> 00:47:42,125 >> -OK. 1072 00:47:42,125 --> 00:47:46,810 Tôi sẽ chỉ đi qua đây để y và được con số 13 thiết lập. 1073 00:47:46,810 --> 00:47:50,890 Và sau đó lấy cây đũa phép của dereferencing và chỉ - 1074 00:47:50,890 --> 00:47:52,430 whoa! 1075 00:47:52,430 --> 00:47:53,030 >> -Oh, hey. 1076 00:47:53,030 --> 00:47:54,610 Mà không làm việc. 1077 00:47:54,610 --> 00:47:58,200 Nói, Binky, tôi không nghĩ rằng dereferencing y là một ý tưởng tốt, 1078 00:47:58,200 --> 00:48:01,370 vì lập pointee là một bước riêng biệt. 1079 00:48:01,370 --> 00:48:03,460 Và tôi không nghĩ rằng chúng tôi đã làm nó. 1080 00:48:03,460 --> 00:48:03,810 >> -Hmm. 1081 00:48:03,810 --> 00:48:05,160 Tốt điểm. 1082 00:48:05,160 --> 00:48:07,410 >> -Vâng, chúng tôi phân bổ y con trỏ. 1083 00:48:07,410 --> 00:48:10,045 Nhưng chúng tôi không bao giờ đặt nó vào trỏ đến một pointee. 1084 00:48:10,045 --> 00:48:10,490 >> -Hmm. 1085 00:48:10,490 --> 00:48:12,170 Rất tinh ý. 1086 00:48:12,170 --> 00:48:13,790 >> -Này, bạn đang tìm kiếm tốt có, Binky. 1087 00:48:13,790 --> 00:48:16,920 Bạn có thể sửa chữa nó để y điểm đến pointee giống như x? 1088 00:48:16,920 --> 00:48:17,810 >> -Chắc chắn. 1089 00:48:17,810 --> 00:48:20,300 Tôi sẽ sử dụng cây đũa thần của tôi giao con trỏ. 1090 00:48:20,300 --> 00:48:22,240 >> -Đó có phải là sẽ là một vấn đề như trước đây? 1091 00:48:22,240 --> 00:48:22,665 >> -Không. 1092 00:48:22,665 --> 00:48:24,300 Điều này không chạm vào pointees. 1093 00:48:24,300 --> 00:48:27,880 Nó chỉ thay đổi một con trỏ trỏ để những điều tương tự như nhau. 1094 00:48:27,880 --> 00:48:28,970 >> -Ồ, tôi nhìn thấy. 1095 00:48:28,970 --> 00:48:31,730 Bây giờ y chỉ vào cùng một vị trí như x. 1096 00:48:31,730 --> 00:48:32,450 Vì vậy, chờ đợi. 1097 00:48:32,450 --> 00:48:33,490 Bây giờ y là cố định. 1098 00:48:33,490 --> 00:48:34,630 Nó có một pointee. 1099 00:48:34,630 --> 00:48:36,520 Vì vậy, bạn có thể thử các cây đũa phép của dereferencing lại 1100 00:48:36,520 --> 00:48:39,200 để gửi 13 hơn. 1101 00:48:39,200 --> 00:48:39,840 >> -OK. 1102 00:48:39,840 --> 00:48:41,570 Ở đây đi. 1103 00:48:41,570 --> 00:48:42,870 >> -Này, nhìn vào đó. 1104 00:48:42,870 --> 00:48:44,320 Bây giờ dereferencing công trình trên y. 1105 00:48:44,320 --> 00:48:47,020 Và bởi vì con trỏ được chia sẻ rằng một pointee, họ 1106 00:48:47,020 --> 00:48:48,585 cả hai thấy 13. 1107 00:48:48,585 --> 00:48:49,040 >> -Vâng. 1108 00:48:49,040 --> 00:48:49,670 Chia sẻ. 1109 00:48:49,670 --> 00:48:50,380 Bất cứ điều gì. 1110 00:48:50,380 --> 00:48:52,290 Vì vậy, chúng ta sẽ đổi vị trí bây giờ? 1111 00:48:52,290 --> 00:48:52,970 >> -Oh, nhìn. 1112 00:48:52,970 --> 00:48:54,150 Chúng ta hết thời gian. 1113 00:48:54,150 --> 00:48:55,200 >> -Nhưng - 1114 00:48:55,200 --> 00:48:57,060 >> -Chỉ cần nhớ ba quy định con trỏ. 1115 00:48:57,060 --> 00:49:00,100 Thứ nhất, cấu trúc cơ bản là bạn có một con trỏ. 1116 00:49:00,100 --> 00:49:02,170 Và nó chỉ qua một pointee. 1117 00:49:02,170 --> 00:49:04,160 Nhưng con trỏ và pointee là riêng biệt. 1118 00:49:04,160 --> 00:49:06,460 Và các lỗi phổ biến là thiết lập một con trỏ, nhưng đến 1119 00:49:06,460 --> 00:49:08,540 quên để cho một pointee. 1120 00:49:08,540 --> 00:49:12,460 >> Số hai, dereferencing con trỏ bắt đầu tại con trỏ và sau của nó 1121 00:49:12,460 --> 00:49:14,570 mũi tên lên trên để truy cập pointee của nó. 1122 00:49:14,570 --> 00:49:18,640 Như chúng ta đều biết, điều này chỉ hoạt động nếu có là một pointee, mà được trở lại 1123 00:49:18,640 --> 00:49:19,790 cai trị số một. 1124 00:49:19,790 --> 00:49:23,670 >> Số ba, giao con trỏ có một con trỏ và thay đổi nó để trỏ đến 1125 00:49:23,670 --> 00:49:25,850 các pointee giống như một con trỏ. 1126 00:49:25,850 --> 00:49:27,840 Vì vậy, sau khi chuyển nhượng, hai con trỏ sẽ 1127 00:49:27,840 --> 00:49:29,430 trỏ đến pointee cùng. 1128 00:49:29,430 --> 00:49:31,600 Đôi khi đó được gọi là chia sẻ. 1129 00:49:31,600 --> 00:49:33,430 Và đó là tất cả để có nó, thực sự. 1130 00:49:33,430 --> 00:49:33,840 Bye bye bây giờ. 1131 00:49:33,840 --> 00:49:34,300 >> [END xem video] 1132 00:49:34,300 --> 00:49:36,940 >> DAVID Malan: Vì vậy, hơn trên con trỏ, hơn trên Binky tuần tới. 1133 00:49:36,940 --> 00:49:38,190 Chúng ta sẽ thấy bạn vào thứ hai. 1134 00:49:38,190 --> 00:49:42,187