[MUSIC CHƠI] DAVID J. Malan: Điều này giống như Hội thảo sinh viên năm nhất ngày hôm nay. ĐƯỢC. Vì vậy, rất mưa ra. Điều này có xu hướng xảy ra vào ngày thứ Tư, nhưng tất cả các cơ hội hơn cho câu hỏi ngày hôm nay. Vì vậy, hãy bắt đầu thực sự với bộ phim chỉ trong một khoảnh khắc. Nhưng chúng ta sẽ bắt đầu grandly như mọi khi. Đây là CS50, và điều này là kết thúc của tuần 4. Vì vậy, nếu bạn đã từng xem TV hoặc một trong đó phim có một số chuyên gia máy tính và cảnh sát, hay FBI, hoặc một số cơ quan đang cố gắng để bắt một số kẻ thù, tốt, bạn đã có lẽ nghe những biểu "tăng cường" nhờ đó mà kỹ thuật nào đó mà kỳ diệu phóng to vô hạn xa để nhìn thấy những tên tội phạm minh nhân dân hoặc số tấm giấy phép ngay cả trong ánh sáng lung linh của một gương hoặc các tia sáng lóe lên trong mắt của một ai đó. Vì vậy, thực sự, chúng ta hãy nhìn vào một vài cảnh như vậy từ Hollywood. [VIDEO PLAYBACK] -Ok, Bây giờ chúng ta có được một cái nhìn tốt ở bạn. -Giữ lấy nó. Chạy lại đó. -Đợi một lát. Đi sang phải. -Có, Đóng băng đó. -Toàn màn hình. -Ok, Đóng băng đó. -Tighten Lên trên đó, bạn sẽ? -Vector Ở trên đó chàng bằng bánh xe trở lại. -Zoom Ở ngay trên chỗ này. -Với Quyền thiết bị, hình ảnh có thể được mở rộng và sắc nét. -Cái gì thế? -Nó Là một chương trình nâng cao. -Cần Bạn rõ ràng là bất kỳ? -Tôi không biết. Chúng ta hãy nâng cao nó. -Enhance Phần A6. -Tôi Tăng cường các chi tiết, và- Tôi nghĩ rằng có đủ để tăng cường, phát hành nó để màn hình của tôi. -Tôi Tăng cường sự phản chiếu trong mắt cô. -Let Đang chạy này thông qua video nâng cao. -Edgar, Bạn có thể nâng cao này? -Treo lên. -I've Được làm việc trên sự phản ánh này. Phản ánh -Someone của. -Reflection. -Có Là sự phản chiếu của gương mặt của người đàn ông. -Các Phản ánh. -Có Một sự phản ánh. -Zoom Ở trên gương. -Bạn Có thể thấy một sự phản ánh. -Có Bạn nâng cao hình ảnh từ đây? -Có Bạn tăng cường anh phải ở đây? -Có Bạn nâng cao nó? Bạn có thể nâng cao nó? Chúng tôi -Có nâng cao này? -Có Bạn nâng cao nó? -Hold Trên một giây, tôi sẽ tăng cường. -Zoom Ở trên cửa. -Times 10. -Thu phóng. -Chuyển đến. -Xem Thêm. -Wait, Dừng lại. -Dừng lại. -Pause Nó. Xoay 75 độ chúng tôi xung quanh dọc, xin vui lòng. -Dừng lại. Quay trở lại phần về cánh cửa, một lần nữa. -Got Một enhancer hình ảnh có thể bitmap? -Hey, Có lẽ chúng ta có thể sử dụng các Pradeep Phương pháp Sen nhìn thấy vào cửa sổ. Phần mềm -Đây là nhà nước của nghệ thuật. -Các Eigenvalue là tắt. -Với Quyền sự kết hợp của algorithm-- Loại bỏ lấy của -Ông các thuật toán để cấp độ tiếp theo, và tôi có thể sử dụng chúng để tăng cường bức ảnh này. -Lock Trên và mở rộng các trục z. -Enhance. -Enhance. -Enhance. -Freeze Và tăng cường. [END PLAYBACK] DAVID J. Malan: Tất cả các bên phải, vì vậy tất cả những người đang thực sự từ. Họ chỉ cần kết hợp với nhau trong một cách đó không thực sự hợp lý. Và, trên thực tế, các khóa học CS50 và thích nó có xu hướng làm hỏng rất nhiều TV và phim ảnh cho bạn. Bởi vì khi những chuyên gia máy tính đang tuôn ra những điều khoản và nói thứ ưa thích như vector riêng, và trục z, và bất kỳ số khác thực sự về kỹ thuật nhiều hơn, họ đang thực sự chỉ xâu chuỗi từ với nhau tất cả các quá thường xuyên. Là một trong những niềm hy vọng của chúng tôi là, như một tác dụng phụ của các khóa học lấy như thế này, sẽ nhiều người trong thế giới thực sự có thể cân nhắc trong và chỉ bao giờ nên hơi ảnh hưởng đến chất lượng và độ chính xác của các bộ phim? Trong thực tế, chúng ta hãy nhìn vào thực tế. Vì vậy, đây là hình ảnh của nhân viên Mary, một nghiên cứu sinh giảng dạy của chúng tôi. Và giả sử cô ấy là nghi ngờ của một cái gì đó. Chưa hết, có một tia một số mảnh bằng chứng trong mắt cô, hoặc trong ánh phản chiếu của kính đeo mắt của cô. Vâng, nếu chúng ta làm đúng như những bộ phim đề xuất, trong đó chúng tôi phóng to và "nâng cao", này là bao nhiêu thông tin là trong khuôn mặt của Mary khi chụp ảnh với độ phân giải gốc. Và, trên thực tế, bạn có thể nhìn thấy những dấu chấm. Và đây là những gì được gọi là điểm ảnh, P-I-X-E-L-S, mà chỉ là một hình vuông thường đó là một dấu chấm đó soạn một hình ảnh. Và trở lại trong ngày, và thực sự thậm chí ngày hôm nay với một số TV LED hiện nay hoặc LCD TV, nếu bạn đã có một trong phòng hay ở nhà, nếu bạn đi lên siêu gần nó, và đặc biệt nếu đó là một TV hơi cũ, bạn có thể có lẽ thậm chí nhìn thấy những dấu chấm và đó là những gì soạn một hình ảnh. Và không có thêm thông tin hơn này. Chúng ta có thể "nâng cao", trong ý nghĩa của làm mịn những điều trên và loại Suy luận loại, loại gì màu sắc nên được bên cạnh mắt của Mary vì vậy mà nó không thực sự như vậy pixelated. Nhưng nếu tôi tiếp tục phóng to, có là kẻ xấu trong mắt cô. Giống như đó là tất cả các thông tin chúng tôi có. Bạn không thể tạo thông tin trong không có gì. Chỉ có duy nhất một hữu hạn số bit có. Vì vậy, trong vấn đề Set 4, nơi bạn có một cơ hội chơi với loại này của thế giới. Trong Problem Set 4, bạn sẽ khám phá thế giới đồ họa, và pháp y, và thực sự viết code mà phục hồi hình ảnh bị mất. Bạn sẽ viết code mà thao tác hình ảnh hiện tại và cuối cùng hiểu được những gì xảy ra dưới mui xe. Và, nó quay ra, nó thực sự không phải tất cả những gì phức tạp. Ví dụ, nếu chúng ta muốn đại diện cho một khuôn mặt cười ở đâu với các điểm ảnh màu đen, hoặc những chấm đen, tốt, chúng tôi chỉ đơn giản là có thể đại diện họ là thực sự là một bitmap. Và nếu bạn đã từng nghe nói rằng biểu bitmap, có lẽ nó bây giờ bắt đầu để thực hiện một rất ít ý nghĩa hơn ngày hôm nay. Chúng ta đã biết những gì một chút là. Đó là 0 hoặc 1. Và một bản đồ chỉ là một cái gì đó giống như một mảnh giấy cung cấp cho bạn hướng dẫn và có có thể là một mạng lưới các x và y tọa độ. Vì vậy, đây là một bitmap. Đó là một bản đồ của các bit theo đó một 1 là rõ ràng sẽ đại diện cho một điểm ảnh màu trắng, và một 0 sẽ đại diện cho một điểm ảnh màu đen. Nhưng chúng tôi chắc chắn có thể lật nó xung quanh. Nó không thực sự quan trọng như vậy miễn là chúng tôi nhất quán. Và ở đây là làm thế nào, trong binary-- bên trong bộ nhớ của máy tính, hoặc thậm chí bên trong của một tập tin trên đĩa cứng của bạn drive-- bạn có thể lưu trữ đơn giản nhất của hình ảnh khuôn mặt cười. Nhưng chúng ta là gì, tất nhiên, thiếu trong hình ảnh này? Màu sắc, phải không? Đây là một bước tiếp theo rõ ràng hoặc nâng cao để cải thiện điều này với màu sắc. Vì vậy, tiếc với chỉ một bit, 0 hoặc 1, chúng ta có thể đại diện cho màu sắc. Đó có thể là màu đỏ, hoặc màu xanh, hoặc màu đen, hoặc màu trắng, hoặc màu xanh lá cây, hay màu hồng, hoặc bất kỳ cặp màu sắc. Nhưng để đơn giản, chúng tôi sẽ chỉ là giả màu đen và trắng. Vì vậy, những gì chúng ta cần làm một cách hợp lý nếu chúng ta muốn thực hiện màu trong hình ảnh? Những gì chúng ta phải làm gì? Cũng giống như nếu các yếu tố hạn chế ở đây là với một chút, bạn chỉ có thể đại diện cho hai quốc gia, 0 hoặc 1, màu trắng hoặc đen, làm những gì bạn muốn làm gì? Đung gửi dữ liệu. DAVID J. Malan: More bit, vâng nhiều dữ liệu hơn, nhiều bit. Và, thực sự, đó là chính xác như thế nào hình ảnh màu sắc được đại diện. Thay vì sử dụng một chút, một 0 hoặc 1 cho mỗi pixel, mỗi dấu chấm, bạn chỉ cần sử dụng nhiều. Có thể sử dụng 8, có thể, thường sử dụng 24, và quả thật, trong Problem Set 4, bạn sẽ chơi với một tập tin định dạng mà sử dụng 24 bit thường. Nhưng hầu hết các bạn có thể quen thuộc với hình ảnh JPEG. Nếu bạn đã từng quan ảnh trên điện thoại của bạn, hoặc tải lên hoặc nhìn thấy một cái gì đó trên Facebook, Flickr hoặc, bất kỳ số các trang web hình ảnh dựa trên, bạn đã có thể nhìn thấy một hình ảnh JPEG trước. Và hóa ra, đây là tập tin định dạng chúng ta sẽ sử dụng trong PSet 4, nhờ đó mà bạn đang đi để phải khôi phục hình ảnh mà tôi đã vô tình bị xóa từ một hỏng thẻ nhớ trong máy ảnh, nếu bạn sẽ. Và nó chỉ ra rằng mặc dù JPEG là sophisticated-- khá nó phức tạp hơn nhiều hơn so với các chấm màu đen và trắng chúng ta đã thấy một chút thời gian trước đây, bởi vì có các thuật toán thực sự ưa thích mà được sử dụng để nén ảnh JPEG, vì vậy mà bạn có thể có một thực sự tốt đẹp, chất lượng hình ảnh nhưng sử dụng tương đối ít bit. Và chúng tôi sẽ trở lại nén trước khi dài. Nó chỉ ra rằng người đầu tiên ba byte trong một image-- JPEG không có vấn đề gì bạn đã chụp một bức ảnh of-- là các giá trị 255, 216, 255. Nói cách khác, nếu bạn chỉ thấy rằng mô hình của các bit, đại diện ở đây là ba byte, hoặc 24 bit tổng số, với xác suất cao, bạn có thể suy ra rằng bạn đang nhìn nó lần đầu tiên ba này byte của một JPEG. Và đây là những gì được biết đến như chữ ký của một JPEG. Rất nhiều định dạng tập tin ra có xu hướng bắt đầu với một số mô hình của 0 và số 1, do đó, Windows, và Mac OS, và iOS, và Android biết loại tập tin mà họ là, ngoài các tập tin được gọi là mở rộng mà rất nhiều các tập tin có. Nếu bạn đã .jpg, đó là một đầu mối để các máy tính. Vì vậy, chúng ta hãy nhìn vào điều này bây giờ một chút về mặt kỹ thuật. Chúng tôi biết các số thập phân hệ thống là 0 đến 9. Chúng tôi biết nhị phân 0 và 1. Và nếu bạn nghĩ lại PSet 0, chúng tôi đã có bạn vật lộn với, cho một chút, một cái gì đó gọi là hệ thập lục phân, nơi bạn có 16 chữ số, thay vì 10 hay thay vì 2. Và những con số, theo quy ước, là 0 đến 9, và một thông qua f, trong đó đại diện cho những gì f số thập phân, chỉ là một sự tỉnh táo nhanh kiểm tra? Vì vậy, 15. Và một phải đại diện cho 10, chỉ bằng cách bản chất của sự sắp đặt mà tôi đã cho. Nó chỉ là một ước tùy ý, nhưng nó khá chuẩn. Vì vậy, nếu chúng ta nhìn vào mô hình này ba bytes-- hãy chỉ bắt đầu nhìn vào nó trong một cách phù hợp với cách các nhà khoa học máy tính nói chung nhìn và suy nghĩ về các tập tin. Bạn chắc chắn có thể suy nghĩ về file trong số 0, và số 1, và số thập phân, nhưng trong thực tế, chúng ta có xu hướng sử dụng hệ nhị phân hoặc thường hơn hexadecimal-- trở lại từ PSet 0. Vì vậy, hãy để tôi đề nghị 255, 216, và 255 chỉ là những mô hình của 0 và số 1. Và bạn có thể kiểm tra điều này nếu bạn muốn làm toán từ tuần 0. Nhưng, bây giờ, chỉ là giả định rằng điều này là thực sự chính xác. Tôi chỉ viết lại ba chữ số thập phân số là ba giá trị nhị phân. Bây giờ những gì tôi sẽ làm là chỉ cần thêm một số không gian màu trắng, chỉ vì lợi ích của khả năng đọc. Và thông báo, tôi chỉ cần đi để di chuyển những thứ ngoài. Vì vậy, trước, sau, trước, sau. Tôi đang làm gì thú vị khác hơn là chỉ truyền bá những điều trên để rằng thông báo mỗi bộ tám bit tại là hai bộ bốn bit. Điều này rất hữu ích vì hệ thập lục phân đặc biệt thời trang bởi vì mỗi chữ số thập lục phân từ 0 đến f, hay cụ thể hơn là từ 0 đến 15, có thể được biểu với chính xác bốn bit. Nói cách khác, trong hệ thập lục phân, nếu bạn muốn đại diện cho một 0, nó chỉ là 0000, bốn số không. Và nếu bạn muốn đại diện cho 15, đó là 1111, mà là bốn bit. Và nếu bạn làm toán, nếu đây là nơi những người thân, đây là nơi 16s, đó là sẽ cung cấp cho you-- thay vì đó sẽ đối với: xin lỗi, trong hệ nhị phân, đó là sẽ cung cấp cho bạn 15, những nơi, nơi twos, bốn chân và Tám nơi. Vì vậy, hãy để tôi đề nghị rằng thiết lập của bốn bit bên trái là những gì chúng ta sẽ gọi f. Đó là số lớn nhất bạn có thể đại diện với bốn bit. Và chúng ta đã biết từ hệ thập lục phân, f là chữ số lớn nhất trong hệ thập lục phân. Chúng tôi đã có f khác có, hai nhiều hơn đó. Và bây giờ, chỉ cần mang về đức tin mà tôi đã thực hiện quyền toán và rằng nửa trái của những bit, 1101, là những điều tương tự như d trong hệ thập lục phân. Và tay phải, năm 1000, chỉ có 8 là. Và ai mà dễ thấy, phải không? 8 represents-- là đúng bên dưới mà nơi Tám. Vì vậy, chúng tôi có một trong các cột Tám và không có gì trong bốn chân, twos hoặc những người thân. Vì vậy, doanh nghiệp thông thường hơn, con người có xu hướng viết chữ số thập lục phân như thế này, bạn chỉ cần đánh bại chúng với nhau, và sau đó bạn có tiền tố họ với 0x. Nó có nghĩa là không có gì khác hơn một đầu mối trực quan đến một human-- ở đây có một value-- hexadecimal vì nó có thể không nếu không được rõ ràng. Mà là để nói, cuối cùng, mà các mô hình của các số không và những người thân, hoặc mô hình của hệ thập lục phân chữ số tương đương mà bạn sẽ bắt đầu tìm kiếm Vấn đề ở Set 4 là this-- và vấn đề Set 4 spec sẽ đi bộ bạn thông qua này trong detail-- hơn nhưng nhận ra là loại phức tạp như điều này có thể tìm ở cái nhìn đầu tiên, bạn sẽ bắt đầu thấy điều này rất nhiều. Và trên thực tế, ngay cả trong GDB, các debugger chúng tôi giới thiệu hôm thứ Hai Dan và giới thiệu trong PSet 3, được đi để thường xuyên cho bạn thấy giá trị thập lục phân chỉ bởi vì họ có xu hướng được nhiều hơn thông thường hơn so với số thập phân hoặc nhị phân trong thế giới của máy tính. Bây giờ chúng ta hãy đặt này vào bối cảnh. Nhiều người trong số bạn có thể nhớ những điều này hình ảnh ở đây, mà đến từ những gì? Vista, vì vậy thậm chí còn sớm hơn rằng, Windows XP đã ra mắt này. Vì vậy, đây là một cảnh quan tuyệt đẹp. Và trên thực tế, nếu bạn poke quanh online-- Tôi nghĩ rằng đó là một bài viết Wikipedia, trong đó một người rất ngạc nhiên đi ra ngoài tìm thấy vị trí này trong thế giới thiết lập của mình hoặc máy ảnh của mình trong chính xác place-- đúng và điều này hôm nay trông like-- nhưng nó chính xác các thiết lập tương tự. Hình ảnh này, mặc dù là trong một tập tin định dạng được gọi bitmap, b-m-p. Và chúng ta sẽ có một siêu Nhìn lướt qua những gì có nghĩa là. Nhưng bitmap chỉ là một cách khác nhau hình ảnh đại diện vẫn còn sử dụng các điểm ảnh trong 0 và số 1, cuối cùng. Nhưng ở cái nhìn nhanh chóng, nó có một chữ ký thú vị hơn lúc bắt đầu của tập tin. Nó không chỉ là ba byte, chứ không có một bó toàn bộ các mẫu byte đã được xác định trước ý nghĩa. Ví dụ, ở đâu đó trong đầu tiên vài byte của một hình ảnh bitmap là có được kích thước của hình ảnh, chiều rộng của hình ảnh, chiều cao của hình ảnh, vì vậy siêu dữ liệu hữu ích, nếu bạn sẽ. Thông tin hữu ích mà Photoshop hay chương trình bất kỳ đồ họa bạn đang sử dụng thực sự có thể quan tâm. Vì vậy, nhiều hơn về điều này trong Vấn đề đặt 4, nhưng điều này chỉ là để nói rằng cuối ngày tất cả các định dạng tập tin mà bạn đã sử dụng cho các tập tin Microsoft Word years--, File số, các tập tin Excel, bất kỳ số định dạng file rằng có thể có một số mở rộng tập tin được biết đến chỉ là 0 và số 1 bên dưới mui xe. Và con người đã quyết định những gì các công ước là, những gì các mẫu của 0 và số 1 đại diện cho một file Word so với một tập tin Excel, so với bất kỳ số lượng các định dạng tập tin khác. Vì vậy, trong PSet 4, bạn sẽ có một cơ hội để chơi với điều đó. Nhưng những gì nó có nghĩa là phải có một cấu trúc. Đây thực sự là một segue đẹp hiện nay vào C, mà chỉ có một cặp vợ chồng Các tính năng bổ sung mà chúng tôi đã không nhìn nào. Đó là một ngôn ngữ khá nhỏ và là một trong các tính năng tốt đẹp về C là một cấu trúc. Ví dụ, nếu bạn muốn represent-- hãy nói rằng bạn muốn có một biến đại diện cho một học sinh trong một số chương trình. Có lẽ bạn đã viết một khóa học Chương trình đăng ký, hoặc mua sắm lõi công cụ, hoặc một cái gì đó như thế. Mẩu dữ liệu liên quan là gì cho một học sinh mà đến với tâm? Giống như một học sinh đại diện với những giá trị nào? Yeah? Bạn có một tên như là một học sinh. Không một sinh viên điển hình có gì khác? Đung [Không nghe thấy] DAVID J. Malan: Vì vậy, xin lỗi. Đung Age. DAVID J. Malan: Một tuổi hoặc sinh nhật tương đương, yep. Những gì khác? Đung số ID? DAVID J. Malan: Vì vậy, một số ID, có thể một số điện thoại, có thể là một ký túc xá, hoặc ngôi nhà, hoặc cao đẳng, hoặc một cái gì đó như thế. Bất kỳ số lượng các mảnh dữ liệu đó bạn có thể có trong danh sách liên lạc của bạn là những gì có thể xác định một học sinh. Vì vậy, nếu chúng ta muốn làm điều này, trong code, chúng ta có thể làm một cái gì đó đơn giản như thế này. Chúng tôi có thể có một chương trình để có hãy nói, int main (void). Và nếu tôi muốn đại diện cho một sinh viên, tôi có thể có, ví dụ, một chuỗi gọi tên cho học sinh đó, một chuỗi gọi là ký túc xá cho học sinh đó, có lẽ một int được gọi là ID cho học sinh đó. Và bởi vì tôi đang sử dụng chuỗi, tôi cần phải quay trở lại và đưa lên CS50.h. Có lẽ tôi sẽ cần stdio.h. Vì vậy, hãy để tôi làm những kiểu đánh phủ đầu và tôi sẽ gọi student.c này cho bây giờ và tiết kiệm này. Và bây giờ tôi có thể làm điều gì đó với các biến này. Và chúng tôi chỉ cần đi để viết đó là một nhận xét trong mã giả, bởi vì nó không phải là thú vị những gì chúng ta làm cho bây giờ. OK, vì vậy đây là một chương trình mà bằng cách nào đó sẽ lưu giữ một học sinh. Tôi muốn làm gì nếu tôi muốn để lưu trữ hai sinh viên? Vì vậy, bản năng đầu tiên của tôi là đi được tất cả các quyền, chờ một phút, nếu tôi có một sinh viên khác tại sao không phải tôi chỉ cần làm tên chuỗi 2, chuỗi ký túc xá 2, int id2. Và chúng tôi đã làm biến mất xuống đường này trước khi và là những gì chúng tôi giải pháp để những gì có vẻ là loại một bản sao dán hackish công việc ở đây? Đung Một mảng. DAVID J. Malan: Yeah, chúng ta có thể sử dụng một mảng. Quyền này rất nhanh chóng trở nên khó sử dụng. Bạn phải sắp xếp các ý bắt đầu đặt tên tất cả các biến. Và bạn, những con người, cần phải giữ theo dõi mà tương ứng với OK name2 với dorm2 tương ứng với id2. Nó chỉ trở thành một mớ hỗn độn. Vì vậy, nó dễ dàng hơn rất nhiều, nhớ lại từ một vài tuần trước đây, chỉ cần phải gọi tên chuỗi và có thể cung cấp cho chúng ta ba của những người. Và sau đó có lẽ chúng ta có ký túc xá chuỗi và có ba của những người, hoặc với một hằng số, int id và có ba trong số những người. Nhưng ngay cả bây giờ điều này cảm thấy một chút cẩu thả, phải. Chúng ta đang nói về các học sinh và chưa Tôi đang thực sự ở vào mức độ thấp chi tiết thực hiện. Học sinh là một cái tên và một ký túc xá và ID. Tại sao tôi không thể chỉ khai báo một biến gọi học sinh và gọi nó là. Và nếu tôi muốn học sinh khác, tại sao tôi không chỉ gọi nó là t. Hoặc nếu tôi muốn toàn bộ một bó sinh viên, tại sao tôi không thể chỉ nói rằng tôi có một lớp học toàn bộ sinh viên, và đó là ba trong số họ. Nói cách khác, tại sao tôi không thể đến với kiểu dữ liệu của mình, gọi Sinh viên, trong số đó là một tên, là một ID, là một ký túc xá, là bất kỳ số lượng các lĩnh vực khác. Và hóa ra bạn có thể làm chính xác điều đó. Vì vậy, C có tính năng này được gọi là cấu trúc. Đó là một tính năng ngôn ngữ cho phép chúng ta thực hiện chính xác này. Tôi sẽ đi trước và mở ra structs.h nơi chúng ta sẽ thấy sau đây định nghĩa của một học sinh. Hóa ra - và điều này thậm chí còn đơn giản hơn so với một liên quan đến một ID một phút trước. Nếu bạn muốn đi lên với kiểu dữ liệu tự chế của bạn, và ngoài ra để int, và char và nổi và tất cả những người khác đang tồn tại, bạn có thể làm như vậy bằng cách theo nghĩa đen viết typedef struct, sau đó một số dấu ngoặc, bên trong của bạn danh sách các biến mà bạn muốn kết hợp với dữ liệu tùy chỉnh mới này gõ như một cái tên và một ký túc xá, và sau đó sau khi các dấu ngoặc nhọn bạn đặt tên cho các kiểu dữ liệu mới. Vì vậy, ví dụ, học sinh. Và những gì là tốt đẹp về điều này bây giờ là nếu chúng ta nhìn vào các mã tương ứng, quy ước, đầu tiên của tất cả, là đặt này trong một tập tin gọi là một cái gì đó dot h, một tập tin tiêu đề, mà chúng tôi có không bắt đầu sử dụng bản thân quá nhiều. Nhưng chúng ta sẽ bắt đầu sử dụng khá một chút bây giờ. Và những gì chúng ta có thể làm với điều này, cuối cùng, trong vài dòng mã được khai báo chính xác đó kiểu dữ liệu, một học sinh. Và bây giờ chúng ta hãy sử dụng nó. Tôi sẽ để bây giờ đi vào một tập tin gọi là structs1.c. Và chúng ta hãy nhìn vào một vài đặc điểm ở đây. Vì vậy, các công cụ lên ở đây là chủ yếu là quen thuộc, và chúng tôi sẽ trở về với những gì không phải là quen thuộc chỉ trong một khoảnh khắc. Điều này tất nhiên là bao gồm cả của riêng tôi tập tin tiêu đề, mà là mới là tốt, trừ PSet 3 nơi, thu hồi, chúng tôi có helpers.h. Vì vậy, bạn có thể nhớ lại helpers.h #include. Tại sao mặc dù tôi sử dụng dấu ngoặc kép thay vì dấu ngoặc góc cạnh? Khi nào tôi lựa chọn giữa chúng? Hầu như lúc nào tôi dường sử dụng dấu ngoặc góc cạnh. Và sau đó, tất cả của một đột ngột trên dòng sáu Tôi đang sử dụng dấu ngoặc kép. Tại sao điều đó có thể được? Yeah? Đung [Không nghe thấy] DAVID J. Malan: Đó là một thực tế, những gì? Đung Đó là trong IDE của bạn. DAVID J. Malan: Yeah, đó là trong IDE thực tế của tôi. Và chúng ta không dừng lại ở hình IDE, vì đó chỉ là một công cụ mà tôi đang sử dụng. Đó là trong hiện tại của tôi thư mục, cụ thể. Vì vậy structs.h là tập tin riêng của tôi không được cài đặt trong các IDE, trong hệ điều hành riêng của mình, thay vì đó là trong thư mục hiện tại của tôi. Vì vậy, các quy ước là nếu bạn muốn để bao gồm các tập tin tiêu đề của riêng bạn, bạn chỉ cần sử dụng dấu ngoặc kép. Những gì chúng ta gọi điều này trong dòng 8, nói chung? Đây là những gì? một cái gì đó #define. Điều này thể hiện các hằng số, phải không? Nếu bạn muốn có một giá trị trong chương trình của bạn mà bạn sử dụng toàn bộ bó lần, đó là tốt ước tính đến yếu tố đó ra, khai báo nó, với các biểu tượng băm xác định, sau đó, theo quy ước, trong tất cả các chữ hoa word-- mặc dù nó không phải thực sự cần thiết, nhưng đó là ước nhân để tận dụng các hằng số để họ nhảy ra tại bạn visually-- không gian và sau đó các giá trị mà bạn muốn được tương đương với tên của hằng số. Không có dấu chấm phẩy, nhưng bạn chỉ theo mô hình mà có. Vì vậy, những gì tôi làm trong mã thực tế này. Vì vậy, chúng ta hãy nhìn vào chương trình chính ở đây. Trong dòng 12 vì tôi đã bao gồm structs.h, Bây giờ tôi có kỳ diệu tại của tôi xử lý một kiểu dữ liệu mới. Tôi không chỉ có quyền truy cập vào int, và char, và float, và chuỗi, và màu xanh và những người khác. Bây giờ tôi có quyền truy cập vào một kiểu dữ liệu học sinh. Vì vậy, trong dòng 12, tôi đang kết hợp hai ideas-- một kiểu dữ liệu tùy chỉnh và hai, sử dụng một mảng. Và như vậy trong chương trình này nếu Tôi muốn thực sự hỗ trợ Ba học sinh khác nhau trong chương trình của tôi, tôi chỉ có thể nói cho tôi một biến gọi là sinh viên, mỗi trong số đó là học sinh loại, trong đó là kiểu dữ liệu tùy chỉnh của tôi. Và, đặc biệt, cho tôi ba của những người trong mảng của tôi. Vì vậy, bây giờ chúng ta làm gì trong chương trình này? Dưới đây chỉ là một vòng lặp cho iterating 0-3, bởi vì đó là những gì giá trị của sinh viên là. Tôi chỉ nhắc người dùng cho tôi tên của học sinh. Và sau đó trong dòng 17, chúng tôi có một đường dây chủ yếu là quen thuộc. Chúng tôi có người bạn cũ của chúng tôi GetString bên phải. Và mảnh gì về cú pháp là dường như mới, nếu bạn đã không bao giờ được lập trình trong C trước, và chưa bao giờ sử dụng các cấu trúc? Yeah? Đung Các .name. DAVID J. Malan: Các .name. Nhưng điều này không phải là quá nhiều của một bước nhảy vọt, bởi vì bây giờ sinh viên khung I cung cấp cho bạn các sinh viên thứ i. Và nếu bạn muốn bổ nhào bên trong của cấu trúc đó, bạn chỉ cần sử dụng một thời gian duy nhất và sau đó tên của các biến bên trong, hoặc các tài sản bên trong đó bạn muốn để có được quyền truy cập vào. Tương tự như vậy rồi, nếu tôi sau đó nhắc nhở người người sử dụng, cho tôi ký túc xá của học sinh, bạn có thể lưu trữ tương tự như vậy mà chuỗi trong các ký túc xá bên trong biến các cấu trúc sinh viên. Và bây giờ mọi thứ có được một chút ưa thích. Và điều này là sẽ xem xét tại có lẽ rất nhiều khá sớm. Nhưng bạn sẽ thấy điều này rất nhiều trong PSet 4, vì vậy chúng ta hãy chỉ nhìn lướt qua nó bây giờ. Nó chỉ ra rằng trong dòng 23 thông qua 38, điều gì làm bạn nghĩ rằng tôi có lẽ đang làm gì? Tôi đã được loại bỏ cho ngày hôm nay, nhưng các phiên bản của mã trực tuyến cho tài liệu tham khảo có tất cả ý kiến. Tôi dường như những gì phải làm? Đung Lưu tập tin với tất cả các thông tin mà người dùng nhập. DAVID J. Malan: Yeah, chính xác, đây là một cách mới rằng chúng ta đang nhìn thấy hai, một tính năng của C, nhờ đó mà tôi có thể tạo ra các tập tin riêng của tôi. Như vậy đến nay, hầu hết các chương trình bạn đã viết là quốc tịch. Ngay sau khi hoàn thành công việc chạy, đó là nó. Không có bộ nhớ hay hồi tưởng về nó. Không có tập tin đã lưu. Nhưng nếu bạn muốn tiết kiệm đầu vào mà có xảy ra, giống như trong một trò chơi hoặc một chương trình như thế này, hóa ra chúng ta có thể làm như vậy. Và bạn sẽ thấy chi tiết này trong PSet 4 và Mục. Nhưng dòng này 23 cơ bản tạo ra một tập tin gọi là students.csv. Và bạn có thể đã nhìn thấy điều này trước khi. Thậm chí nếu bạn đã không bao giờ học CS trước, CSV là biến bằng dấu phẩy. Nó giống như một con người rất nghèo phiên bản của một tập tin Excel, có nghĩa là nó có thể được mở ra trong Excel và trong số Apple, và nó có các hàng và cột. Nhưng đó không phải là độc quyền định dạng như Microsoft hay Apple. Nó chỉ là dấu phẩy tách giá trị mà chúng ta sẽ thấy trong một thời điểm. Và chỉ mất một đoán. Trong dòng 23, ở rất kết thúc, số thứ hai của tôi với chức năng mới này được gọi là f mở cho tập tin mở là w. Điều gì có thể biểu thị w? Yeah? Đung Nó cho phép bạn ghi vào tập tin? DAVID J. Malan: Nó cho phép bạn viết vào tập tin. Vì vậy, có một vài biến thể rằng chúng ta có thể cắm ở đây. Nhưng nếu bạn chỉ muốn đọc các tập tin, đó là nhìn vào nó và đọc nó vào bộ nhớ, bạn chỉ cần sử dụng quote unquote "r". Nếu bạn muốn ghi vào file, bạn sử dụng quote unquote "w". Hiện cũng đang nối thêm và một vài thứ khác nếu bạn muốn thay đổi các tập tin hiện có. Bây giờ chúng ta sẽ tiếp tục nhìn thấy này điều, sau đó chúng tôi sẽ trở lại với dòng 24. NULL, nó quay ra, là một giá trị đặc biệt có thể được trả về bởi các chức năng nhất định nếu một cái gì đó đã đi wrong-- nếu các tập tin không tồn tại, nếu bạn đã chạy ra khỏi bộ nhớ, hoặc một loạt các lỗi khác. Nhưng hiện nay, chúng ta hãy chỉ cho rằng điều này là kiểm tra lỗi chỉ thông thường. Ở đây trong dòng 26, tôi lặp 0-3 trên tất cả các học sinh của tôi. Và đây là loại loại của một chức năng mới, fprintf, nhưng chỉ mất một đoán. Nếu printf là chỉ in một chuỗi định dạng, những gì fprintf lẽ nghĩa là gì? Đung In vào một tập tin. DAVID J. Malan: In một định dạng chuỗi vào một tập tin. Đó là những gì thêm f phương tiện là tập tin. Và các số mới đầu tiên đã được các biến đại diện cho tập tin của bạn. Sau đó, chúng tôi chỉ có một định dạng string giống như printf. Và mặc dù đây Cú pháp là mới, điều này chỉ có nghĩa là cắm vào tên của học sinh, plug-in các ký túc xá sinh viên, và sau đó với fclose, đóng file. Và sau đó lastly-- này là mới và chúng tôi sẽ trở lại vấn đề này trước long-- tôi đang giải phóng học sinh vì lý do đã xảy ra lên trên đó. Nhưng chúng tôi sẽ trở lại với trước khi long-- đó là vì cách GetString là thực sự làm việc dưới mui xe. Vì vậy, chúng ta hãy có một cái nhìn nhanh chóng ở đây. Nếu tôi gõ ls trong thư mục của tôi, nhận thấy rằng tôi không có một tập tin gọi là students.csv, chỉ cần không có, không tồn tại. Vì vậy, nếu bây giờ tôi biên dịch chương trình này, làm cho cấu trúc-1,. / struct-1, và tôi sẽ đi trước và gõ vào Andi, người sống ở Berkeley tại Yale. Chúng ta sẽ phải Rob người sống ở Thayer những ngày này. Và chúng ta hãy đến với nơi là, tôi nghĩ rằng, Maria là trong Mather, nếu tôi nhớ lại một cách chính xác. Vì vậy, không có gì có thể xảy ra. Nhưng nếu tôi gõ ls bây giờ, có students.csv. Chúng ta hãy đi trước và mở students.csv. Đây lại là một rất định dạng tập tin nhẹ. Nhưng tôi đã đơn giản chỉ thông qua một quy ước mà tôi có hai hàng và cột ở đây. Cột đầu tiên là tên đầu tiên của người dân. Cột thứ hai là học sinh của ký túc xá, hoặc cao đẳng, hoặc nhà, hoặc có điều gì. Và bây giờ tôi đã lưu này vĩnh viễn trong một tập tin. Vì vậy, nó không phải là tất cả những gì thú vị. Nhưng đây chỉ là một bước đá bây giờ để có thể tồn tại thông tin vĩnh viễn. Vì vậy, chúng ta hãy xem bây giờ những gì chúng ta càng có thể làm gì với những điều này và các tính năng khác. Nhưng trước tiên, bất kỳ câu hỏi? Đó là rất nhiều, và đó là nhanh. Nhưng bạn sẽ thấy rất nhiều hơn trong PSet 4, là tốt. Yeah? Đung Có cách nào để tiếp tục bổ sung thêm tên cho tập tin đó? DAVID J. Malan: Câu hỏi rất hay. Có cách nào để tiếp tục thêm tên cho tập tin đó? Vâng. Và, trên thực tế, nếu bạn kết thúc up mở lại tập tin, bạn sẽ sử dụng trích dẫn unquote "a" cho phụ thêm, mà sẽ chỉ cần thêm một dòng mới, một dòng mới một lần nữa và một lần nữa, chính xác. Câu hỏi hay. Các câu hỏi khác? Yeah? Đung Nếu bạn chạy chương trình một lần nữa ngay bây giờ, nó sẽ tiếp tục bổ sung tên vào nộp hoặc nó sẽ mở ra một tập tin mới? DAVID J. Malan: Ah, tốt câu hỏi. Nếu bạn chạy lại chương trình ngay Hiện tại, có thể gõ vào tên mới, nó sẽ thêm vào tập tin hoặc ghi đè lên các tập tin? Sau này, bởi vì tôi là không sử dụng chế độ phụ thêm. Và bởi vì tôi chỉ là một cách mù quáng mở tập tin để viết, nó chỉ cần đi để ghi đè lên các tập tin. Vì vậy, tôi thực sự cần phải làm là nối thêm, nếu tôi muốn thực sự có kỳ hạn dài cơ sở dữ liệu. Bây giờ CSV là hữu ích, thẳng thắn, thậm chí cho như nếu bạn writing-- và cuối cùng chúng ta sẽ thấy điều này sau đó trong học kỳ khi chúng ta sử dụng tệp CSV cho các mục đích khác. Nếu bạn muốn lưu trữ tất cả mọi người đã đăng ký cho một số sự kiện, hoặc đăng ký cho học sinh của bạn nhóm, hoặc một cái gì đó như thế, lưu trữ dữ liệu trong các loại các định dạng là siêu thuận tiện. Bởi vì theo nghĩa đen, nếu tôi đã tải tập tin này. Tôi có thể double-- và chúng ta hãy thực sự cố gắng này nếu tôi có Excel hoặc số trên đây. Tôi sẽ phải nhấp chuột hoặc kiểm soát vào file của tôi. Lỗi chính. Right-click hoặc control-click vào tập tin của tôi. Thôi nào, con chuột của tôi là không hợp tác. Download-- tôi sẽ tải về tất cả các tập tin ở đây để chỉ để tôi có thể lấy một này. Và chúng ta hãy xem nếu công trình này students.csv-- lần đầu tiên Tôi đã kích hoạt. Bây giờ họ muốn xem địa chỉ liên lạc của tôi. Bây giờ, tôi cần phải đăng ký. Xem cách dễ dàng là để sử dụng tệp CSV? Có, giữ cho nó được cập nhật. OK, bây giờ chúng tôi đã sẵn sàng cho các lớp học. OK, oh, có gì mới? OK, gần gũi. Đó là huyền diệu. OK, bây giờ chúng ta phải cập nhật. Và bây giờ, nó đã quên những gì nộp ban đầu tôi đã mở, nhưng những gì a-- có chúng tôi đi. OK, vì vậy bây giờ chúng ta có một tập tin Excel. Cam on. OK, vì vậy những gì tôi đã làm là phần dễ dàng. Tất nhiên tôi có thể đã được cài đặt sẵn Excel, hoặc số, hoặc bất cứ chương trình. Nhưng điều này là tốt đẹp, bởi vì bây giờ tôi có thể thao tác các dữ liệu trong một định dạng chuẩn. Bối cảnh như vậy bây giờ chúng ta hãy chuyển đến nơi chúng tôi rời khỏi thời gian qua, mà là để bắt đầu cất cánh bánh xe đào tạo. Nhưng trước tiên, bạn đã làm không thấy ăn trưa trước đây một lần nữa xảy ra ở đây tại Fire và Ice ở Cambridge, Sitar ở New Haven. Đăng ký trên trang web CS50s càng sớm càng tốt để tham gia các sinh viên và nhân viên CS50. Vì vậy, chúng tôi đã luyện tập off vào thứ hai như follows-- chuỗi đã được khai báo trong Thư viện CS50s một thời gian. Và nó là tốt đẹp, bởi vì nó cho phép chúng ta nói về các biến như là Nói cách đầy đủ và câu và nhiều hơn nữa. Nhưng hóa ra chuỗi không tồn tại. Đó chỉ là một từ đồng nghĩa, hoặc một bí danh, mà chúng ta đã tạo ra cái gì đó thực sự là nhiều hơn một chút kỹ thuật được gọi là một char *. Và quả thực, chúng ta đã thấy một ví dụ của một chương trình vào thứ Hai điều đó đã không cư xử khá như chúng ta mong đợi. Đây là tập tin, so sánh-0. Và nhớ lại rằng so sánh-0, nếu Tôi biên dịch lại chương trình thứ hai của và chạy so sánh-0 và gõ vào mẹ trong chữ thường, chữ thường và mẹ trong một lần nữa. Chương trình khẳng định tôi gõ những điều khác nhau, mặc dù mẹ, tất cả trong chữ thường, giống hệt cách trực quan. Vì vậy, những gì đã là câu trả lời ngắn cho lý do tại sao máy tính nghĩ hai dây là khác nhau? Yeah? Đung [Không nghe thấy] DAVID J. Malan: Đúng vậy. Vì vậy, mẹ, lần đầu tiên Tôi gõ vào, đang được lưu trữ ở đâu trong máy tính của tôi bộ nhớ, nhưng ở một vị trí khác nhau hơn lần thứ hai tôi gõ vào mẹ. Bây giờ nó chắc chắn có thể được tối ưu hóa. Các máy tính có thể được thông minh và nhận ra hai chuỗi này, hey, chúng giống hệt nhau. Hãy để tôi không dư thừa lưu trữ nó. Nhưng máy tính không làm điều đó tối ưu hóa, trừ khi bạn nói với họ để. Vì vậy, theo mặc định, họ đang chỉ cần đi để kết thúc ở hai nơi khác nhau trong bộ nhớ. Và do đó, để được rõ ràng hơn, khi chúng tôi so sánh hai chuỗi, lần đầu tiên được gọi là s, thứ hai được gọi là t, cụ thể những gì đã được tôi so sánh ở đây trên dòng 13? Yeah. Đung Đó là nơi trong bộ nhớ rằng biến sẽ trỏ đến. DAVID J. Malan: Chính xác, tôi đã so sánh các vị trí trong bộ nhớ rằng những biến trỏ đến. Vì vậy, đặc biệt, nếu mẹ đã ở byte số 1 và 2, và 3, và 4-- vì nhớ các dấu gạch chéo ngược 0 cần phải được tất cả các con đường ở cuối. Và ví dụ khác của mẹ, m-o-m, là tại địa chỉ 10, 11, 12, và 13. Tôi đã so sánh 1, địa chỉ đó, vị trí đó trong bộ nhớ, so với 10, đó là rõ ràng là không giống nhau. 1 không phải là 10. Vì vậy, đây là tốt đẹp trong đó nó khá đơn giản. Nhưng đó là vấn đề trong chừng mực chúng tôi dường như không thể so sánh chuỗi. Vì vậy fundamentally-- và ở mức thấp này, nếu bạn muốn thực hiện một chương trình để so sánh hai từ riêng biệt mà các người dùng đã gõ trong cho chất lượng, làm họ xếp hàng cho char char, chỉ trong điều kiện chung, những gì chúng ta cần làm, rõ ràng? Nó không đủ chỉ để nhìn vào hai địa chỉ. Những gì chúng ta cần phải làm gì? Yeah? Đung Lặp qua chuỗi [không nghe được]. DAVID J. Malan: Vâng, chúng ta hãy lặp thông qua các chuỗi. Hãy sử dụng một vòng lặp, vòng lặp while, hoặc bất cứ điều gì bạn thấy thoải mái nhất. Và nếu chúng ta đã có hai dây một nơi nào đó trong bộ nhớ, chúng ta hãy nhìn vào mỗi ký tự đầu tiên, sau đó mỗi thứ hai là nhân vật, sau đó thứ ba, và thứ tư, và thứ năm, cho đến khi chúng ta nhấn những gì giá trị trọng điểm đặc biệt? Đung [Không nghe thấy] DAVID J. Malan: Yeah, dấu chéo ngược bằng không, lúc này ở một trong hai chuỗi chúng ta có thể quyết định đó là nó. Chúng tôi đã kết hợp tất cả các nhân vật duy nhất? Nếu không, trả về false. Nếu vậy, trở lại đúng. Và đó là chính xác những gì phiên bản này của chương trình so sánh-1.c nào. Nó giống hệt với những gì chúng tôi nhìn thứ hai ngoại trừ việc tôi đã gạt bỏ những string-- từ dù mà không có tất cả các chức năng impact-- Tôi đang làm bây giờ là loại bỏ một số bánh xe đào tạo trực quan, nhưng nhìn thấy rõ ràng rằng s và t là các địa chỉ. Và đó là những gì các ngôi sao, các dấu hoa thị, đại diện là một địa chỉ, nếu không được biết về mặt kỹ thuật như một con trỏ. Vì vậy, khi tôi tuyên bố s trên dòng 9 và nói char * s, điều đó không có nghĩa là cung cấp cho tôi một chuỗi. Điều đó có nghĩa là cung cấp cho tôi một biến mà mục đích trong cuộc sống là để lưu trữ một địa chỉ. Bởi vì tôi sắp đặt địa chỉ của một chuỗi thành nó. Và quả thực, GetString, để được rõ ràng, không trả về một chuỗi. Nó không trả lại mẹ dấu gạch chéo ngược bằng không, mỗi se. Những gì hiện GetString đặc biệt và chính xác trở lại? Đung [Không nghe thấy] DAVID J. Malan: Một địa chỉ, các địa chỉ của các nhân vật đầu tiên trong một số chuỗi nó đã nhận được. Và bây giờ chúng ta đang nhìn thấy một từ đặc biệt nữa. Và, tôi đã đề cập đến điều này trước đó. Điều này là có được ước tốt rằng chúng ta sẽ thấy một lần nữa và một lần nữa bây giờ. Tôi đang kiểm tra để đảm bảo rằng s không phải là null và t không phải là null. Bởi vì dựa trên tôi thực sự đề cập đến trước đó nhanh chóng, những gì có thể có nghĩa là nếu GetString trả về không một địa chỉ nhưng N-U-L-L, mà là một lần nữa, một số giá trị đặc biệt không? Đung Lỗi. DAVID J. Malan: Đó là một lỗi. Có gì đó không đúng. Và những gì thường có thể xảy ra, đặc biệt là với strings-- mà có thể là chiều dài chưa biết trong advance-- có thể các máy tính ' ra khỏi bộ nhớ, có thể bạn gõ vào một ví dụ từ dài hoặc câu hoặc dán một bài luận như vậy rất lớn có chỉ là không đủ bộ nhớ. Và như vậy GetString không thể trở về địa chỉ của toàn bộ điều, vì vậy nó chỉ trả về không có gì. Và nó nói một lỗi đã xảy ra bằng cách trả về giá trị NULL đặc biệt. Đó là địa chỉ không, vì vậy để nói chuyện. Bây giờ nó quay ra C đi kèm với một chức năng mà không lặp lại điều đó. Chúng tôi không cần phải thực hiện điều này với một vòng lặp hoặc một vòng lặp trong khi chính chúng ta. Chúng tôi có thể sử dụng một chức năng, gọi một cách ngắn gọn, khuấy động comp, hay chuỗi so sánh, mà mục đích trong cuộc sống là để làm chính xác điều đó. Bạn cung cấp cho nó hai con trỏ, hai địa chỉ, và nó sẽ đi đến những địa chỉ và sau đó so sánh thư cho thư cho thư cho chất lượng, chỉ dừng lại khi những gì là sự thật? Khi trực giác nên khuấy động comp ngừng iterating, chỉ để được rõ ràng? Khi nó chạm một dấu gạch chéo ngược 0 trong hoặc chuỗi, tại thời điểm đó nó có thể quyết định có mọi thứ phù hợp, hoặc đã có được một sự khác biệt? Vì vậy, nếu chúng ta chạy này và thử Game về vốn hóa của chúng tôi, do đó hãy so sánh-1, ./compare-1, và gõ mẹ trong chữ thường cả hai lần. Bây giờ nó là điều tương tự. Và nếu tôi làm điều đó một lần nữa với chữ thường và chữ hoa thì có lẽ. Bây giờ nó thực sự phân biệt giữa trên và chữ thường. Vì vậy, không phải tất cả những khó khăn hay huyền diệu, nhưng nó bây giờ giải thích những gì đang xảy ra bên dưới mui xe. Vì vậy, những gì chúng ta càng có thể trích xuất từ loại này của bài học? Vì vậy, chúng ta hãy nhìn vào điều này. Tôi sẽ đi trước và viết chương trình nhanh chóng ở đây gọi là bản sao-0. Và bây giờ chúng ta hãy đi trước và thực sự chúng ta hãy làm this-- với bản sao-0, hãy nhìn vào những gì tôi đã có ở đây. Lần đầu tiên tôi nói cho người dùng, nói điều gì đó. Sau đó, tôi nhận được một chuỗi và tôi cất nó trong s. Sau đó, tôi kiểm tra xem s bằng bằng NULL, chỉ trả lại 1. Vì vậy, đây là chỉ kiểm tra lỗi tiêu chuẩn. Không có gì thú vị đã xảy ra. Và trên thực tế, nếu chúng ta thoát khỏi những lỗi kiểm tra, điều này có vẻ như tuần 1 mã tại thời điểm này. Nhưng tôi đã bắt đầu để có được một chút tốt hơn về điều đó. Bây giờ ở dòng 16, một tuần trước đây, có lẽ ngày thậm chí một vài hoặc vài phút trước, bạn có thể nói dòng 16 là tạo ra một biến gọi là t và sao chép là vào nó. Và đó là một cách hoàn hảo takeaway hợp lý. Nhưng chính xác hơn bây giờ. Điều gì đang xảy ra ở dòng 16? Những gì là nhận được sao chép từ phải sang trái? Yeah? Đung là t nhận được một địa chỉ của s? DAVID J. Malan: Chính xác, t là nhận được địa chỉ của s. Vì vậy, để được rõ ràng bây giờ, nếu tôi đi lại cho rằng ví dụ trước đó và tôi vẽ ra những điều tôi đã nhập vào. Và những gì tôi đã gõ in-- đây, và ở đây là những gì tôi đã nhập vào một nơi nào đó trong bộ nhớ, mẹ và sau đó là một dấu gạch chéo ngược 0 mà được thêm vào cho tôi. Những gì tôi được lưu trữ ở đây, nhớ lại, này là ở vị trí 1, 2, 3, 4, đây là những gì hiện đang trong s. Vì vậy, nếu trên dòng 16, tôi nói cho tôi một biến gọi là t và lưu trữ trong lúc giá trị của s, những gì được lưu trữ ở đây sẽ không phải mẹ nhưng thay vì chỉ là số 1. Vì vậy, nếu chúng ta nhìn về phía trước trong chương trình này bây giờ, điều gì sẽ xảy ra? Vì vậy, nhận thấy rằng có chức năng này có lẽ bạn đã sử dụng điều này một số thời gian trước đây cho Caesar, hoặc Vigenere, hoặc có thể không ở tất cả. Tôi khẳng định với printf của tôi, tôi đi đến tận các bản sao t. Đầu tiên trong dòng 19, sự tỉnh táo nhanh kiểm tra, kiểm tra strlen chiều dài của t. Bởi vì tôi không muốn cố gắng tận dụng một cái gì đó nếu không có chuỗi đó. Nếu người dùng chỉ cần nhấn Enter, không có gì để tận dụng là. Vì vậy, tôi không muốn làm dòng 21. Vì vậy, dòng 21 được tận mà thư, rõ ràng, trong t? Đung m? DAVID J. Malan: Dường như đó là sao chép mà một trong những? Đung m. DAVID J. Malan: Uh, m. OK, vì vậy m đầu tiên, vì thông báo rằng tôi đi qua để toupper, mà nếu bạn đã bao giờ nhìn thấy nó nó chỉ là một chức năng để tận dụng như là đầu vào của nó. t khung bằng không có nghĩa là cung cấp cho cho tôi những nhân vật không của t. Và do đó, làm thế nào thực hiện điều này thay đổi hình ảnh, để được rõ ràng? Những gì cần phải được viết lại hoặc thay đổi Đối với s và t và mẹ với không gạch chéo ngược. Đung [Không nghe thấy] DAVID J. Malan: Yeah, vì vậy điều này một cách đơn giản ở đây nhu cầu để có được thay đổi nhằm: khắc phục this-- cần phải được thay đổi thành một m vốn. Nhưng bây giờ, nhìn sau này trong chương trình, nếu tôi in ra s và t là tôi làm sạch ở đây, xem những gì sẽ xảy ra in ra s và t. Vì vậy, hãy copy-0, ./copy-0. Hãy để tôi đi trước và gõ trong mẹ trong tất cả các chữ thường. Lưu ý cả hai bản gốc và bản sao này được vốn hóa. Tại sao? Vâng, s và t đều trỏ đến, nếu bạn sẽ, các đoạn cùng của bộ nhớ. Và thẳng thắn mà nói, đây là nhận được thực sự uninteresting-- thực tế mà chúng ta đang sử dụng địa chỉ không ở đây. Ý tôi là, tôi không thực sự quan tâm nơi những thứ có trong bộ nhớ. Xin lỗi tôi xóa một chút quá nhiều. Nhưng tôi không thực sự quan tâm nơi mà mọi thứ trong bộ nhớ. Và như vậy, thực sự những gì lập trình viên có xu hướng nghĩ về là khi bạn nói về địa chỉ, hoặc một con trỏ, những người quan tâm nó ở đâu trong bộ nhớ. Tôi không quan tâm nếu nó ở byte một hoặc một tỷ. Tôi chỉ quan tâm đến việc này biến là có hiệu quả chỉ vào đó đoạn bộ nhớ. Và như vậy, từ nay về sau, chứ không phải phân minh qua địa chỉ bộ nhớ tùy ý, chúng ta hãy chỉ cần bắt đầu để vẽ con trỏ như con trỏ, như mũi tên. Vì vậy, những gì s và t thực sự là, Theo chương trình này, vì thế tôi tạo ra t, nó chỉ là hai biến số riêng biệt chỉ vào đoạn cùng của bộ nhớ. Và chúng tôi không quan tâm họ đang ở đâu. Vì vậy, chúng ta có thể tóm tắt đi chi tiết đó. Vì vậy, làm thế nào để sửa lỗi này? Nếu tôi muốn viết một phiên bản của các bản sao chương trình thực bản sao chuỗi và chỉ có tận bản sao, chỉ bằng trực giác, những gì đã nhận được một Thành phần cho giải pháp của chúng tôi? Đung [Không nghe thấy] DAVID J. Malan: Chúng tôi cần một điều gì? Đung Chunk của bộ nhớ. DAVID J. Malan: Chúng ta cần một đoạn bộ nhớ, phải không? Chúng tôi không biết làm thế nào để làm được chưa, nhất thiết. Nhưng tôi loại cần này xảy ra như vậy rằng mẹ gốc trong trường hợp thấp hơn kết thúc trong đó đoạn thêm bộ nhớ. Và sau đó khi tôi thay đổi các bản sao, tôi không muốn thay đổi bản này tại đây. Tôi thay vào đó muốn thay đổi chỉ này bản sao để các ban đầu là không thay đổi. Vì vậy, chúng ta hãy xem làm thế nào chúng ta có thể làm điều này. Trong copy-1, đã và bị tước bình luận, nhưng là nhận xét trực tuyến. Chúng tôi thay vì làm những following-- dòng giống hệt nhau, làm cho tôi một chuỗi và gọi nó là. Nhưng bây giờ chúng ta hãy nhìn vào một trong nhất của chúng tôi phức tạp nhưng cuối cùng của sự phức tạp cho một lúc, dòng 16 không chính xác này. Vì vậy, nếu bạn thoải mái với hình ảnh chúng tôi chỉ drew-- cho tôi một đoạn mới của bộ nhớ, sao chép tất cả mọi thứ vào nó, chúng ta hãy xem làm thế nào chúng tôi dịch đó để mã. Vì vậy, dòng 16, ở phía bên tay trái, char * t mang lại cho tôi hộp này trên đây. Đó là tất cả nó. Ở phía bên tay phải, m alloc, hoặc malloc, là cấp phát bộ nhớ, siêu ưa thích, một cách khó hiểu của chỉ nói cho tôi một đoạn bộ nhớ. Chúng ta cần bao nhiêu bộ nhớ? Vâng, là loại một biểu hiện lớn. Nhưng chúng ta hãy xem những gì nó nói ở đây. Vì vậy, tất nhiên, là cung cấp cho tôi chiều dài chuỗi s. Vì vậy, mẹ nó nên được những gì? Vì vậy, chỉ cần ba, phải không? mẹ là ba ký tự. Bạn không đếm dấu gạch chéo ngược bằng không khi bạn nói về độ dài của một chuỗi nó thực sự có thể nhìn thấy các chữ cái của con người. Vì vậy, mẹ, vì vậy điều này mang lại cho tôi 3. Nhưng chờ một phút, tôi bây giờ thêm 1. Tại sao tôi thực sự muốn phân bổ 4 byte và không phải chỉ 3? Yeah? Đung Đối với các giá trị trọng điểm? DAVID J. Malan: Chính xác, cho rằng giá trị trọng điểm. Đối với các dấu gạch chéo ngược bằng không, Tôi cần tổng số 4 byte. Vì vậy, tôi cần chiều dài của chuỗi cộng thêm 1. Và sau đó chỉ cần cho measure-- tốt mặc dù trên hệ thống này, nó luôn luôn có được 1-- tôi nói nhân này bằng kích thước của một char. Hóa ra là sizeof toán tử trong C chỉ cho bạn biết số byte đó là cần thiết cho một kiểu dữ liệu nhất định. Nó không làm việc cho các mảng, thường, đôi khi nó làm. Nhưng trong trường hợp chung, không có. Nhưng nó sẽ cho tôi biết bao nhiêu byte một char là, mà hóa ra luôn luôn là 1. Vì vậy, điều này giống như cách nhân bằng 1. Vì vậy, siêu khó hiểu nhìn dòng mã. Nhưng tất cả những gì nó làm là cung cấp cho tôi một đoạn bộ nhớ. Nhưng nó có vẻ được sao chép bất cứ điều gì vào bộ nhớ? Chưa được. Và vì vậy những gì tôi làm trên dòng 22, và 23, 24, 25, tốt, tôi chỉ đơn giản là làm điều này. Và đây là loại công cụ học cũ bây giờ. Điều này giống như PSet 2, nơi bạn chỉ cần di chuyển những thứ xung quanh trong bộ nhớ, hay đúng hơn trong chuỗi. Vì vậy, tôi lặp từ 0 đến chiều dài của chuỗi s. Và tôi đang sao chép các ký tự thứ i trong s thành nhân vật thứ i trong t. Và bởi vì tôi, các lập trình viên, thực hiện chắc chắn để phân bổ chính xác như nhiều byte khi tôi cần, nó hoàn hảo one-to-one mối quan hệ. Và tôi sao chép mẹ trong chữ thường sang mới. Và rồi cuối cùng, tôi làm dòng này. Và vì vậy hiệu quả duy nhất là để tận t này đây. Vì thế rất nhiều để hấp thụ, nhưng nếu bạn chỉ cần xem xét đâu là sự thật trên dưới mui xe chỉ là di chuyển những byte xung quanh, tất cả những gì là cần thiết để giải quyết vấn đề này là chỉ để cung cấp cho chúng tôi đoạn này của bộ nhớ. Bây giờ có nguy cơ áp đảo, hãy để tôi chỉ một ví dụ khác đó là gần như giống hệt nhau, trừ trường hợp này dòng mã. Vì vậy, đây là phiên bản của hacker của chương trình này, nếu bạn muốn. Nhưng chúng ta hãy chỉ chắt lọc nó vào những gì đang xảy ra. Dòng 24 từng là t này khung i được s khung i. Bây giờ, tôi sẽ thay đổi này để ngôi sao t nhiều bí ẩn hơn cộng 1 bằng s sao cộng thêm 1. Vì vậy, những gì đang xảy ra và tại sao Chúng ta có một nhân vật sao? Chúng tôi đã nhìn thấy các ngôi sao trước, và nó đang được sử dụng khác nhau ở đây. Trước đây chúng ta đã thấy char *, bây giờ tôi đang nhìn thấy một ngôi sao ngay từ đầu, và đó là OK. Bởi vì thực ra chúng loại có thể suy ra các chỉ từ những người đầu tiên nguyên tắc những gì đang xảy ra. Vì vậy, chỉ để được rõ ràng, là những gì s? Tuần trước, đó là một chuỗi. Điều đó không đủ nữa. Là những gì s, cụ thể? Đung [Không nghe thấy] DAVID J. Malan: Đó là một con trỏ. Đó là địa chỉ của nhân vật đầu tiên chúng ta gõ vào. OK, t là gì? Đung [Không nghe thấy] DAVID J. Malan: Các địa chỉ của byte đầu tiên trong t, mà đoạn bộ nhớ phân bổ lại. Vì vậy, nó chỉ ra rằng khi chúng ta lặp từ 0 trên lên đến chuỗi length-- đầu tiên của tất cả, i bắt đầu giảm ở mức 0, bởi vì các trường học cũ này cho điều loop. Vì vậy, chỉ vì đơn giản, chúng ta hãy giả định rằng các dòng mã đầu tiên thực sự chỉ này, phải. Nếu tôi là số không, thêm zero một cái gì đó có lẽ sẽ không có hiệu lực. Vì vậy, câu nói này là gì? Nó chỉ ra rằng ngôi sao điều hành trong bối cảnh này là tới đích điều hành, mà chỉ là một cách nói đi đến địa chỉ sau đây. Vì vậy, nếu s là địa chỉ đầu tiên nhân vật trong đoạn này của bộ nhớ, * s phương tiện đi đến đó. Và bởi vì chúng tôi đã rút ra hình ảnh theo cách này, bạn có thể áp dụng theo mô hình về tinh thần. Nếu đây là s, và bạn nói * s, * s loại giống như máng và thang, nếu bạn nhớ những trò chơi từ thời thơ ấu, cũng giống như làm theo mũi tên đó và đi đến địa chỉ. * t là điều tương tự. Vì vậy, bắt đầu ở đây, đi đến đoạn của nó. Tôi không thể chỉ vẽ trên màn hình này theo cách đó. * t có nghĩa là để đi đây. Và sau đó, vòng lặp cho chỉ là nói di chuyển nhân vật này ở đây, di chuyển nhân vật này ở đây, di chuyển nhân vật này ở đây. Nhưng làm thế nào để tôi làm incrementation đó? Tôi cần phải lùi lại những gì tôi chỉ cần xóa. Đây là nói chung là những gì được gọi là con trỏ số học, mà nghĩa toán học có địa chỉ. Nếu, trong này cho vòng lặp, Tôi cứ incrementing i, và s là một địa chỉ và t là một địa chỉ, nếu tôi chỉ giữ thêm 1, mà chỉ có nghĩa là tiếp tục di chuyển về phía trước, và chuyển tiếp, và chuyển tiếp trong bộ nhớ. Nó giống như Oxford Street, đường phố mà tòa nhà CS là trên. Các tòa nhà CS là tại 33 đường Oxford. Vì vậy, nếu bạn đã làm 33 Oxford Street cộng với 1, mang lại cho bạn đến 34 Oxford Đường phố, sau đó 35 Oxford Street, sau đó 36 Oxford Street, bất cứ điều gì những người tòa nhà thực sự là - nếu chúng tồn tại. Và như vậy, đó là tất cả chúng ta đang làm ở đây với con trỏ số học. Vì vậy, nó là một cách thật phức tạp thể hiện chính mình. Nhưng tất cả những gì đang xảy ra bên dưới mui xe chỉ là những địa chỉ sau đây, như sau một bản đồ, nếu bạn muốn, hoặc mũi tên như sau chúng tôi đã rút ra trên màn hình. OK, rất nhiều để tiêu hóa. Bất kỳ câu hỏi về cú pháp, khái niệm, con trỏ, malloc, hoặc tương tự. Vâng, ở đây đầu tiên. Đung Vì vậy, nơi mà nói * t bằng toupper * t, là sẽ tận tất cả các chữ cái hoặc just-- DAVID J. Malan: Ah, Câu hỏi thực sự tốt. Vì vậy, trong dòng này ở đây, 31, Điều này sẽ tận các chữ cái đầu tiên hoặc tất cả các chữ cái. Vì vậy, hãy trả lời rằng bằng cách đi trở lại nguyên tắc đầu tiên. Và nguyên tắc đầu tiên ở đây tôi muốn nói chỉ cần đi đến các định nghĩa cơ bản về những gì liên quan. Vì vậy toupper là một chức năng mà tận một char. Đó là tất cả. * t có nghĩa là đi đến first-- đi đến các địa chỉ trong t. Vì vậy, trong hình, nếu đây là đoạn bộ nhớ chúng ta giao malloc, và đây là t, t * có nghĩa là đi đây. Trong khi đó, bạn đang đi qua giá trị đó, chữ thường m để toupper, bạn đang nhận lại vốn M, có thì bạn đưa nó? Bạn đang đặt nó trong cùng một vị trí. Và như vậy bởi đó logic của những định nghĩa cơ bản nó chỉ tận dụng các chữ cái đầu tiên trừ khi bạn lặp với i hay cho vòng lặp hoặc một vòng lặp trong khi, nó không phải đi để làm bất cứ điều gì nhiều hơn bạn yêu cầu nó. Câu hỏi hay. Yeah? Đung Tại sao bạn sử dụng tới đích của phương pháp hơn các mảng? DAVID J. Malan: Ah, tốt câu hỏi. Tại sao bạn sẽ sử dụng tới đích Phương pháp thay vì phương pháp mảng? Không có lý do đặc biệt, phải trung thực. Và, trên thực tế, cho đây loại ví dụ, phải, Tôi chỉ cãi nhau làm cho chương trình phức tạp hơn, nhiều mắt được lắp kính trên, người được kiểm tra ra bởi vì điều này có vẻ siêu phức tạp, nhưng mặc dù nó đang làm điều tương tự. Và như vậy, thẳng thắn mà nói, đây là một giải pháp không cần thiết trực quan phức tạp cho vấn đề. Nó vẫn là thiết kế tốt, năm trong số năm cho thiết kế, cho dù đó là trong khung kí hiệu hoặc các ký hiệu con trỏ. But-- đặc biệt là khi chúng tôi nhận được sau này trong khóa học vào PSet 5 khi chúng ta thực hiện từ điển mà đó Tôi đã đề cập đến một vài times-- chúng ta sẽ thực sự quan tâm đến địa chỉ bộ nhớ cấp thấp rằng chúng ta thực sự hiểu những gì đang xảy ra. Nhưng, bây giờ, nó chỉ ra rằng điều này dòng mã ngoặc vuông ở đây không thực sự tồn tại. Họ là những gì được gọi là cú pháp đường, mà chỉ là một cách kì lạ mát nói ra trình biên dịch chuyển đổi dấu ngoặc vuông để được mà biểu thức toán học. Vì vậy, nó là một quy ước của con người để có thể chỉ cần viết các dấu ngoặc rất dễ sử dụng. Nhưng những gì các trình biên dịch, kêu vang, đang thực sự làm bất cứ lúc nào bạn viết những gì nổi bật trong dòng 24, dưới mui xe nó thực sự chuyển đổi nó vào đây. Nó chỉ thêm vui như một con người đọc và viết mã như dòng 24. Nhưng cuối cùng những bánh xe đào tạo quá đi tắt khi thoải mái của chính mình trở nên mạnh hơn. Tất cả các quyền, vì vậy sau đó nhớ lại rằng đây là loại vấn đề lớn nhất chúng tôi chạy vào. Và đó là những gì đã gây ra toàn bộ này chuyện chết tiệt về con trỏ, và địa chỉ, và những thứ sao chép. Đó là bởi vì chúng ta vấp ngu ngốc, ngu ngốc vấn đề này, theo đó Tôi thực hiện logically-- với Lauren lên đây trên các bản demo và nước cam trong milk-- một cách hoàn hảo Chức năng thuật toán chính xác để trao đổi hai biến ' giá trị, nhưng điều damn không có bất cứ dai dẳng, hoặc lâu dài, ảnh hưởng đến mã của tôi. Tại sao lại thế? Tóm lại, tại sao điều này thực hiện hoán đổi logic đúng, nhưng không có tác động trên các biến được truyền cho nó, như x và y cho chính? Các ý chính của vấn đề này là gì? Yeah? Đung Bởi vì biến làm bản sao của biến trong các đường chuyền thông qua chức năng. DAVID J. Malan: Chính xác, khi bạn vượt qua biến thành một chức năng, hay tranh luận vào một chức năng, họ thông qua bản sao, mà có nghĩa là bạn có được một giống hệt nhau tìm kiếm mô hình của các bit cho cả x và y, ở đây gọi là a và b. Và bạn có thể làm bất cứ điều gì bạn muốn với những bản sao, nhưng họ sẽ không có ảnh hưởng đến chức năng gọi điện thoại. Và, trên thực tế, chúng ta đã vẽ rằng hình ảnh trên màn hình, thu hồi thời gian qua, theo đó nếu bạn thực sự suy nghĩ về những gì xảy ra bên dưới nếu hood-- đây là bộ nhớ của máy tính, và xuống ở đây là các đoạn bộ nhớ đang được sử dụng cho chính, đây là đoạn bộ nhớ đang được sử dụng để trao đổi, và có nên ngay cả khi chính hai biến x, y, trao đổi có thể có giống hệt nhau tìm giá trị, cả hai đều là 1 và 2, nhưng chúng hoàn toàn khối khác nhau của bộ nhớ. Vì vậy, chúng ta cần một giải pháp này. Và thẳng thắn mà nói, có vẻ như chúng ta bây giờ có một giải pháp cho vấn đề này, phải. Nếu bây giờ chúng ta có khả năng thao tác bằng những cách các địa chỉ và, loại máng và thang phong cách, làm theo các mũi tên và đi bất cứ đâu chúng ta muốn trong bộ nhớ, chúng ta không thể giải quyết vấn đề này bằng cách đi từ chính để trao đổi không phải là giá trị mà ta muốn trao đổi, nhưng chỉ bằng trực giác những gì chúng ta có thể vượt qua để đổi thay? [Interposing GIỌNG NÓI] DAVID J. Malan: Tại sao chúng ta không chỉ vượt qua nó địa chỉ, đúng không? Tại sao chúng ta không đưa ra trao đổi một bản đồ kho báu, nếu bạn muốn, dẫn nó vào giá trị thực tế x và y. Hãy trao đổi, thực sự thay đổi các bit nguyên gốc hơn chỉ cần đi qua các bản sao của các bit. Và như vậy, trên thực tế, đó là những gì sẽ là giải pháp. Phiên bản này ở đây là rõ ràng xấu và thiếu sót. Và bây giờ, ở cái nhìn đầu tiên, nó chỉ trông như chúng tôi đã thêm một loạt các ngôi sao ngẫu nhiên và vượt qua ngón tay của chúng rằng nó sẽ biên dịch. Nhưng, bây giờ nó sẽ biên dịch. Nhưng chúng ta hãy xem những gì những điều có ý nghĩa. Và, thật không may, các tác giả của C đã có thể chọn biểu tượng khác để thực hiện điều này một chút rõ ràng hơn, nhưng các nhà điều hành sao có ý nghĩa khác nhau trong hai bối cảnh khác nhau. Và chúng tôi đã nhìn thấy cả hai, nhưng chúng ta hãy phân biệt. Vì vậy, ở đầu có, khi tôi đã thay đổi và b từ là int trong xấu Phiên bản để int sao, a, b, trước đó, là số nguyên. A và b là gì bây giờ trong tốt, phiên bản màu xanh lá cây? Họ là các địa chỉ. Địa chỉ của những gì, để được rõ ràng? Địa chỉ của các số nguyên. Vì vậy, thực tế là tôi nói phương tiện int sao đây là địa chỉ của một số nguyên, cụ thể. Vì vậy, hiện nay thông báo trong các dòng mã, một cái gì đó khác đã thay đổi quá. tmp vẫn như nhau, vì nó chỉ là các số nguyên tạm thời, không có phép thuật bộ nhớ đó. Tuy nhiên, một doanh nghiệp cần một ngôi sao. Và, trên thực tế, mỗi đề cập khác của a và b, nhận thấy rằng tất cả những gì thay đổi từ màu đỏ sang màu xanh lá cây là tôi đang đặt trước từ những biến với các ngôi sao. Bởi vì tôi không muốn sao chép một và b. Bởi vì nếu tôi chỉ cần sao chép a, b và swap a và b, những gì tôi thực sự hoán đổi? Chỉ cần địa chỉ, tôi muốn trao đổi những gì ở những địa chỉ. Tôi muốn đi đến đó. Và do đó, các nhà điều hành sao bên trong các chức năng của tôi, không bên trong danh sách tham số, có nghĩa là bạn đi đến những địa chỉ và thực sự thay đổi những giá trị. Vì vậy, những gì hiện các hình ảnh bây giờ nhìn như thay thế. Vâng, nếu thay vào đó tôi đi qua trong cho a và b không 1 và 2-- Tôi thực sự cần phải thêm một định nghĩa khác ở đây. Vì vậy, giả sử rằng đoạn này bộ nhớ là ở vị trí 10. Đây là vị trí 11, nhưng điều này là một chút của một đơn giản hóa, Bây giờ tôi có hai lựa chọn để tôi vượt qua x và y hoặc để tôi vượt qua địa chỉ của họ? Nếu tôi vượt qua địa chỉ của họ như thế này, tôi chỉ bây giờ cần phải thực hiện trao đổi mỗi mã xanh để khi nó thấy một và khi nó xem sự b, nó không chỉ sao chép một và b và di chuyển sữa và nước cam. Sữa và nước cam ẩn dụ bây giờ bị phá vỡ, bởi vì đó là chén các bản đồ lỏng và không. Chúng tôi thay vì cần phải đi để giải quyết 10 và chúng tôi cần phải đi đến quyết 11, và sau đó thực hiện rằng logic trao đổi. Vì vậy, logic là như nhau, nhưng chúng ta cần một cách hơi khác nhau truy xuất các biến. Và như vậy cuối cùng, những gì Chương trình có để trông giống như là này. Trong swap.c nghĩa đen sao chép và dán các phiên bản màu xanh lá cây. Nhưng tôi cần phải thực hiện một sự thay đổi. Nó không đủ chỉ để thay đổi swap. Những dòng khác của mã tôi cần phải thay đổi? Yeah? Đung đâu phải mất các đối số. DAVID J. Malan: ở đâu nó cần đối số của nó. Vì vậy, nếu tôi di chuyển đến chính, tôi không thể chỉ qua trong x và y, và, tôi hứa, người cuối cùng mảnh của cú pháp mới ngày hôm nay. Tôi cần phải vượt qua trong không x và y nhưng địa chỉ của x và y. Và hóa ra, biểu tượng mà các tác giả của C đã chọn là nếu bạn sử dụng một dấu ở đây, không phải để bị nhầm lẫn với các ký hiệu phép toán, nếu bạn sử dụng một dấu ở đây và một dấu ở đây, con số này ra cho bạn, địa chỉ của x là gì, có lẽ đó là 10, những gì là địa chỉ của y, có lẽ nó 11, và vượt qua những người thay thế. Vì vậy, rất nhiều để hấp thụ tất cả cùng một lúc. Nhưng chúng ta hãy nhìn thấy bây giờ nhanh chóng trong bốn phút còn lại của chúng tôi nơi mà mọi thứ có thể đi xiên. Và như một sang một bên, thực sự Tôi chụp bức ảnh này, TF chụp bức ảnh này một hoặc hai năm trước. Vì vậy, đây là góc sau của Eliot ăn Hall. Con trỏ có lẽ là khó khăn nhất đề tài mà chúng ta trải trong CS50. Vì vậy, nếu bạn lo lắng các loại dốc là như thể nó là nhiều hơn một cây gậy hockey như thế này, nhận ra chúng ta đang loại gần một đỉnh cao trong về sự phức tạp niệm. Và tôi đưa lên này hình ảnh, bởi vì tôi thề Trời, vào mùa thu năm 1996, khi tôi mất CS50 với giáo viên giảng dạy của tôi, Nishat Mehta, ông bảo tôi ngồi xuống trong góc của Eliot D. Hội trường trong bữa ăn trưa, hoặc ăn tối, hoặc một cái gì đó để thử để giúp tôi hiểu con trỏ. Và đây là nơi mà tôi đã tuần sau nó đã được giới thiệu trong bài giảng khi Cuối cùng tôi đã hiểu con trỏ. Và tôi hy vọng rằng điều này sẽ nhấp nay sớm hơn cho bạn. Nhưng nhận ra điều này hoàn toàn trong những chủ đề phức tạp hơn chúng tôi đã giới. Nhưng đó là một trong những mạnh nhất. Và khi bạn nhận được nó, nó thực sự tất cả chỉ cần đi để cuối cùng đi với nhau. Vì vậy, yên tâm nó không cần cho tất cả chìm trong ngày hôm nay. Vì vậy, đây là chương trình cuối cùng chúng ta sẽ xem xét. Và chúng ta sẽ kết thúc với một nhanh chóng ba phút của claymation được thực hiện bởi người bạn của chúng tôi, Nick Parlante. Dưới đây là một chương trình, mà trên đỉnh hai dòng khai báo một biến x và y. Cả hai đều là các địa chỉ các số nguyên, AKA con trỏ. Sau đó chúng tôi phân bổ đủ bộ nhớ để lưu trữ một int và lưu trữ địa chỉ trong đó bộ nhớ trong x. Vì vậy, nó thậm chí còn đơn giản hơn so với ví dụ trước. Hãy cho tôi bốn byte của bộ nhớ, đó là kích thước của một int, và đưa địa chỉ đó trong x. Dòng này ở đây có nghĩa đi đến các địa chỉ trong x và đưa ý nghĩa của cuộc sống, số 42 đó. Nhưng dòng này làm tôi lo lắng. Sao y có nghĩa là đi đến các địa chỉ trong y, và đưa số không may mắn 13 đó. Tại sao là nó nguy hiểm, vào thời điểm này trong story-- mặc dù nói nhanh trong vài phút suy yếu của chúng tôi here-- lý do tại sao nó là xấu cho tôi để nói, đi đến các địa chỉ trong y? Đung Bạn có không [không nghe được]. DAVID J. Malan: Tôi có không đặt bất cứ điều gì trong y. Vì vậy, giá trị của y là gì, vào thời điểm này trong câu chuyện? Chúng tôi không có ý tưởng. Đó là một số giá trị rác và cũng không Binky biết. Nếu chúng ta có thể kết thúc vào ghi chú này. [VIDEO PLAYBACK] -Hey, Binky, thức dậy. Đó là thời gian cho con trỏ của niềm vui. -Cái gì thế? Tìm hiểu về con trỏ? Oh, hay qúa. -Well, Để bắt đầu, tôi đoán chúng tôi sẽ cần một vài con trỏ. -ĐƯỢC. Mã này phân bổ hai con trỏ mà có thể trỏ đến số nguyên. -Ok, Tôi cũng xem hai con trỏ, nhưng họ dường như không được trỏ đến bất cứ điều gì. -Đúng thế. Ban đầu con trỏ không trỏ đến bất cứ điều gì. Những điều chúng trỏ tới là gọi pointees và cài đặt chúng lên là một bước riêng biệt. -Oh, Phải, phải. Tôi biết rằng. Các pointees là riêng biệt. Vì vậy, làm thế nào để bạn phân bổ một pointee? -Ok, Tốt mã này giao đất một pointee nguyên mới, và điều này bộ phần x để trỏ đến nó. -Hey, Mà có vẻ tốt hơn. Vì vậy, làm cho nó làm một cái gì đó. -Ok, Tôi sẽ tới đích của con trỏ x để lưu trữ số 42 thành pointee của nó. Đối với thủ thuật này, tôi sẽ cần tôi cây đũa thần của dereferencing. -Website Của cây đũa thần của dereferencing? Uh, rằng, đó là tuyệt vời. -Đây Là những gì mã trông như thế nào. Tôi sẽ chỉ cần thiết lập số và- [POP SOUND] -Hey, Tìm ở đó nó đi. 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ó. Trong trường hợp này, để lưu trữ 42 trong đó. Hey, hãy thử sử dụng nó để lưu trữ số 13 thông qua con trỏ khác, y. -ĐƯỢC. Tôi sẽ chỉ đi qua đây để y, và có được số 13 thiết lập. Và sau đó lấy cây đũa phép của dereferencing và just-- [BUZZER SOUND] -Oh, Hey mà không làm việc. Nói, uh, Binky, tôi không nghĩ dereferencing y là một ý tưởng tốt, bởi vì thiết lập lên pointee là một bước riêng biệt. Và tôi không nghĩ rằng chúng tôi đã làm nó. -Hmm, Điểm tốt. -Vâng, Chúng tôi phân bổ các con trỏ, y, nhưng chúng tôi không bao giờ cho nó trỏ đến một pointee. -Hmm, Rất tinh ý. -Hey, Bạn đang tìm kiếm tốt có, Binky. Bạn có thể sửa chữa nó sao cho các điểm y đến pointee giống như x. -Sure, Tôi sử dụng cây đũa thần của tôi của giao con trỏ. -là Rằng sẽ là một vấn đề, như trước đây? -Không, Điều này không chạm vào pointees. Nó chỉ thay đổi một con trỏ để trỏ đến cùng thing-- [Popping SOUND] --as khác. -À tôi hiểu rồi. Bây giờ y điểm đến cùng một nơi như x. Vì vậy, chờ đợi, bây giờ y là cố định. Nó có một pointee. Vì vậy, bạn có thể thử các cây đũa phép của dereferencing một lần nữa để gửi 13 hơn. -Oh, OK, ở đây đi. -Hey, Nhìn vào đó. Bây giờ dereferencing công trình trên y. Và bởi vì các con trỏ được chia sẻ rằng một pointee, cả hai đều 13 xem. -Vâng, Chia sẻ, uh, bất cứ điều gì. Vì vậy, chúng ta sẽ chuyển đổi địa điểm bây giờ? -Oh, Nhìn chúng tôi ra khỏi thời gian. -Nhưng-- -Cũng Nhớ các quy tắc ba con trỏ. Số 1, cấu trúc cơ bản là bạn có một con trỏ, và nó chỉ qua một pointee. Nhưng các con trỏ và pointee là riêng biệt. Và những lỗi thường gặp là để thiết lập một con trỏ nhưng để quên để cho nó một pointee. Số 2, con trỏ dereferencing bắt đầu từ con trỏ và sau mũi tên của nó trên để truy cập pointee của nó. Như chúng ta đều biết, điều này chỉ hoạt động nếu có là một pointee, trong đó loại được trở lại để loại trừ số 1. Số 3, con trỏ chuyển nhượng mất một con trỏ và thay đổi nó để trỏ đến cùng pointee như một con trỏ. Vì vậy, sau khi chuyển nhượng, hai con trỏ sẽ trỏ đến pointee cùng, đôi khi đó được gọi là chia sẻ. Và đó là tất cả để có nó, thực sự. Bye-bye bây giờ. [END PLAYBACK] DAVID J. Malan: Đó là nó cho CS50. Nhờ giáo sư Nick Parlante. Chúng tôi sẽ gặp bạn vào tuần tới. [ELECTRONIC MUSIC CHƠI]