JASON Hirschhorn: Chào mừng A5, tất cả mọi người. Chúng tôi có một tuần thú vị phía trước chúng ta, chủ yếu là bởi vì có rất nhiều mới phải đối mặt trong căn phòng này. Thật là tuyệt vời. Rất nhiều bạn đến đây do tai nạn, mà thậm chí còn tốt hơn. Vì vậy, hy vọng bạn sẽ tiếp tục tham gia với chúng tôi. Tuần này chúng ta sẽ dành phần lớn các phần chuẩn bị cho các bài kiểm tra. Vì vậy, mỗi chương trình nghị sự của chúng tôi, chúng ta sẽ nói chuyện một chút về nguồn lực cho các lớp học, mà còn cho các bài kiểm tra, và sau đó, một lần nữa, dành phần lớn các lớp nói chuyện về các câu hỏi. Một khi chúng ta đang thực hiện trả lời của bạn câu hỏi, hoặc nếu câu hỏi của bạn tự nhiên dẫn chúng ta đến một số mã hóa, tôi có vấn đề mẫu từ kỳ thi giữa kỳ qua đó chúng ta sẽ mã trực tiếp trong phần cùng đó cũng mang lại một số khác chủ đề tốt để trang trải. Vì vậy, đầu tiên, như chúng tôi đã trải qua cho quá khứ vài tuần để nhắc nhở bạn guys, có một tấn các nguồn tài nguyên có sẵn cho khóa học này. Nhiều người trong số họ sẽ là vô cùng hữu ích cho bạn khi tiếp tục học tập cho bài kiểm tra 0, bởi vì đó là buổi chiều thứ ba. Vì vậy, tất cả các bạn đã nghiên cứu một chút. Có bài giảng và nguồn mã mà bạn nên chắc chắn kiểm tra. Xem quần short. Kiểm tra study.cs50.net. Và sau đó, được liệt kê dưới đây, một số các nguồn lực khác. Một lần nữa, bài kiểm tra 0 là ngày mai lúc 1 giờ. Nếu bạn đã không làm như vậy, hãy kiểm tra ra về đố 0 tài liệu trên trang chủ của trình để tìm ra nơi bạn đang dùng các bài kiểm tra. Các bài kiểm tra bắt đầu từ 1:10 và kết thúc 70 phút thi đấu sau đó. Vì vậy, nếu bạn xuất hiện sau khi 1:10, bạn sẽ nhận được nhiều phút hơn hơn 70 để có những bài kiểm tra. Vì vậy, hãy chắc chắn rằng bạn có thời gian. Nếu bạn là một sinh viên mở rộng hoặc có một số cân nhắc thử nghiệm khác, nó có thể không phải lúc 1 giờ ngày mai. Nhưng một lần nữa, kiểm tra về Câu hỏi 0 tài liệu để chắc chắn rằng bạn biết khi nào bạn đang dùng các bài kiểm tra. Tôi đã viết 75 phút thi đấu ở đây. Tôi nghĩ rằng đó là đúng, không 70. Nó bao gồm tất cả các vật liệu từ một tuần 0 bài giảng tuần trước vào ngày thứ Tư. Và một lần nữa, cho đề thi này, mỗi đó tài liệu, bạn nhận được một hai mặt và 8 1/2 của 11 tờ giấy mà bạn nhận được để sử dụng như ghi chú trong các bài kiểm tra. Nhiều người, nếu không phải hầu hết mọi người, có thấy rằng cách hữu ích nhất để học tập cho các bài kiểm tra là làm cho một tờ nghiên cứu, một một sider, của riêng mình. Vì vậy, nhìn vào những người trong quá khứ, nếu bạn đã nhìn thấy những người trong quá khứ. Tiếp cận với bạn bè để xem những gì họ đang đặt vào họ. Nhưng bàn tay xuống, cách tốt nhất bạn có thể nghiên cứu là phải đi qua tất cả mọi thứ và bớt nó xuống đến những gì nên hay không thuộc về mà tờ giấy, bởi vì đó chỉ là một thực sự cách hữu ích cho bạn để đảm bảo bạn đang trải qua tất cả mọi thứ và đã quen với nó. Hầu hết mọi người, chúng ta thấy, mặc dù họ có các tờ giấy ngồi ngay cạnh họ trên các bài kiểm tra, không bật với nó, bởi vì, một lần nữa, rằng rất quá trình đi qua các thông tin đã giúp họ tìm hiểu nó. Không ai có bất kỳ câu hỏi về bài kiểm tra 0? Có tất cả mọi người - Tôi sẽ không làm một chương trình của bàn tay. Không sao đâu. Tôi đã đi hỏi người bắt đầu học. Nhưng tôi không muốn làm cho bạn tất cả không nâng cao tay của bạn. Vì vậy, như tôi đã nói - có, Avi, đi trước. AVI: Điều gì sẽ là một điều hữu ích để đưa vào một máy nhắn tin? HỌC SINH: Đó là vào bạn. JASON Hirschhorn: Bạn nhận được sử dụng bản án của bạn. Những điều hữu ích để đưa vào một máy nhắn tin, nếu bạn đang nhầm lẫn về O lớn thời gian chạy của các loại hình tìm kiếm và các loại, đặt trên đó trong một biểu đồ tiện dụng dandy. Bằng cách đó, nếu bạn được yêu cầu đó trên bài kiểm tra, bạn không cần phải cố gắng và con số nó ra hoặc lý do thông qua thời gian chạy. Bạn chỉ có thể sao chép nó xuống. Nếu bạn nhìn vào các câu đố trong quá khứ, rất nhiều lần, có đang chạy các câu hỏi thời gian. Vì vậy, đó sẽ là một ví dụ về một tốt điều để đưa vào một máy nhắn tin của bạn. Những thứ khác tốt để đưa vào, nếu bạn nhầm lẫn về cách khai báo một chức năng hoặc những gì các phần khác nhau của khai báo hàm là, viết mà trên đó, một phiên bản chung và sau đó có thể là một ví dụ. Nếu bạn đang nhầm lẫn về con trỏ, một sơ đồ như thế nào con trỏ làm việc là có thể thực sự hữu ích. Nếu bạn đang nhầm lẫn về đệ quy, một mẫu hàm đệ quy trên có cũng có thể chứng minh được thực sự hữu ích. Điều đó cung cấp cho bạn một số ý tưởng? AVI: Bạn cần phải hiểu toàn bộ quá trình biên dịch, như làm thế nào mà tất cả các công trình? JASON Hirschhorn: Tất cả mọi thứ đó đã được bảo hiểm có thể hiển thị trên các bài kiểm tra. Câu hỏi - nhưng một lần nữa, một số điều sẽ trọng nhiều hơn những người khác. Một số điều đã đưa ra một lần nữa và một lần nữa trong lớp học, trong bài giảng, và phần. Những thứ khác có không đi lên mà thường xuyên. Chúng tôi đã nói chuyện rất nhiều về # bao gồm và -L một cái gì đó và những gì những người có nghĩa là trong quá trình biên dịch. Chúng tôi đã nói chuyện rất nhiều về GDB, bám, những lá cờ khác nhau mà chúng ta sử dụng khi chúng tôi biên dịch một cái gì đó, và những gì make15, ví dụ, thực sự nghĩa và thực sự. Chúng tôi đã không nói chuyện nhiều về từng bước trong quá trình biên dịch. Chúng ta vẫn nói về nó. Vì vậy, nó vẫn còn một cái gì đó mà bạn nên quen thuộc với. Nhưng một lần nữa, chúng tôi sẽ không thể - điều mà đi lên thường xuyên hơn trong lớp có nhiều khả năng để đi lên hơn thường xuyên và có nhiều hơn trọng vào các bài kiểm tra. Mát mẻ. Thắc mắc khác về bài kiểm tra 0? OK, vì vậy tôi đặt một danh sách các chủ đề trên diễn đàn. Tôi đã đi qua các giáo trình. Tôi đã đi qua phần xét từ đêm qua và những hình ảnh và đưa ra với một danh sách không đầy đủ các chủ đề mà chúng tôi đã được cho đến nay trong CS50 và những thứ mà có thể xuất hiện trên các bài kiểm tra. Vì vậy, tôi sẽ không đi qua mỗi một đơn của các. Rằng sẽ mất nhiều hơn thời gian hơn, chúng tôi có bây giờ. Nhưng tôi đặt này lên đây để hy vọng chạy bộ bộ nhớ của bạn như những điều mà có thể hoặc có thể không quen thuộc với bạn. Và tôi rất muốn dành phần lớn phần trả lời câu hỏi của bạn về các chủ đề, chủ đề mà không được ở đây. Chúng ta có thể viết mã giả. Chúng ta có thể viết mã thực để đảm bảo rằng bạn - Tôi có thể trả lời câu hỏi của bạn và giúp tất cả mọi người về cơ bản hiểu một rất nhiều các chủ đề này, do đó bạn sẽ cảm thấy chuẩn bị sẵn sàng và thoải mái đi vào các bài kiểm tra vào ngày mai. Vì vậy, đọc trên danh sách. Bạn hy vọng đã đến phần với một số câu hỏi là tốt. Khi bạn đã sẵn sàng, nâng cao tay của bạn và chúng tôi sẽ bắt đầu. Giữ trong tâm trí, những câu hỏi mà bạn có, không có câu hỏi ngu ngốc. Chúng tôi nghe nói rất nhiều. Và những câu hỏi mà bạn có, tôi sẵn sàng đặt cược, nhiều người khác cả ngồi đây và xem trực tuyến có là tốt. Vì vậy, bạn chỉ có thể giúp mọi người bằng cách hỏi câu hỏi. Marcus. MARCUS: Giữa các ngăn xếp và đống, là có một được cấp phát trước tỉ lệ bộ nhớ được định nghĩa như này là dành cho chồng hoặc cho đống? Hay như thế nào mà làm việc, chính xác? JASON Hirschhorn: Great câu hỏi. Tôi sẽ trở lại theo dõi một chút. Làm tất cả mọi người - hãy trung thực ở đây. Tôi biết tôi yêu cầu bạn tăng của bạn tay trước mặt đồng nghiệp của bạn. Tuy nhiên, có những người cảm thấy không thoải mái với stack và heap và muốn đi qua đó và những gì những nghĩa là gì? Nâng cao tay của bạn nếu - OK. Cảm ơn bạn. Vì vậy, chúng ta sẽ đi qua các ngăn xếp và đống thực sự nhanh chóng và sau đó di chuyển vào trả lời câu hỏi của bạn. Vì vậy, nếu chúng ta rút ra một hộp để đại diện cho bộ nhớ trên máy tính của bạn, một số là những gì những điều mà đi trong hộp này? Chính. Một chức năng chính. Trường hợp không chính đi đâu? HỌC SINH: [nghe được]. JASON Hirschhorn: Vì vậy, chúng tôi sẽ đưa chính xuống đây. Những gì khác đi trong hộp này? HỌC SINH: Các chức năng mà bạn gọi. JASON Hirschhorn: Các chức năng mà chúng ta gọi. Và nơi nào họ đi đâu? HỌC SINH: Trong ngăn xếp. JASON Hirschhorn: Họ đi trong ngăn xếp. Vì vậy, chúng ta sẽ gọi đây điều xuống đây stack. Và lên hàng đầu, chúng tôi có đống. Vì vậy, bộ nhớ không phải là một hộp như thế này. Nhưng nó thực sự là khá tương tự. Nó sẽ có rất nhiều hộp hơn trở lên, tùy thuộc vào độ lớn của bạn máy tính là lớn như thế nào hoặc bộ nhớ của bạn. Tại quote-unquote "đáy" là stack. Và có nhiều điều mà đi trên stack. Và những người phụ thuộc vào các chức năng bạn có trong mã của bạn. Bạn luôn luôn có một chức năng trong bạn mã được gọi là chính, do đó, luôn luôn là một ở dưới đây trong ngăn xếp dành cho chính. Các phần trong ngăn xếp được gọi là khung stack. Khi bạn gọi chức năng khác, nói chính gọi một chức năng tìm kiếm nhị phân, chúng tôi đặt khung khác trên stack. Cụ thể hơn, chúng ta sẽ hiến tặng một phần bộ nhớ trên của chúng tôi máy tính để lưu trữ nhị phân tìm kiếm của địa phương biến và để chạy nhị phân đang tìm kiếm. Vì vậy, chúng ta gọi là tìm kiếm nhị phân. Trong đoạn này của bộ nhớ, chúng ta sẽ để lưu trữ các biến cục bộ của nó. Chúng tôi sẽ lưu trữ các cuộc gọi printf của nó. Bất cứ điều gì xảy ra, chức năng đó là sẽ được lưu trữ ở đó. Tìm kiếm nhị phân sẽ được thực thi. Nó sẽ hoàn thành thực hiện. Từ trong C là những gì mà biểu thị rằng một chức năng nên hoàn thành thực hiện của nó? HỌC SINH: Return. JASON Hirschhorn: Trở về. Vì vậy, bất cứ khi nào bạn nhìn thấy một tuyên bố trở lại, kết thúc chức năng khi nó cập đó. Vì vậy, tìm kiếm nhị phân sẽ đạt trở lại của nó. Điều này một phần của bộ nhớ sẽ cơ bản được giải tỏa. Và chính sẽ quay trở lại để thực hiện. Vì vậy, chính sẽ tạm dừng bất cứ nơi nào là, cuộc gọi tìm kiếm nhị phân, có được một số giá trị trả về, và tiếp tục thực hiện. Stack frame này sẽ biến mất. Nếu chúng ta gọi một hàm đệ quy, mà là một chức năng mà tự gọi mình hơn và hơn, chúng tôi có thể nhận được - nói rằng chúng ta đã tìm kiếm nhị phân đệ quy. Chúng tôi có thể nhận được nhị phân tìm kiếm phiên bản một, tìm kiếm nhị phân hai, tìm kiếm nhị phân ba, tìm kiếm nhị phân bốn, tìm kiếm nhị phân năm. Và sau đó tìm kiếm này thức nhị phân năm sẽ lên trường hợp cơ sở, và ngăn xếp khung sẽ quay trở lại và tiếp tục đóng cửa cho đến khi chúng tôi trở lại với chính. Chúng ta có thể đi qua đệ quy trong một chút. Nhưng tất cả điều này là để nói, nếu bạn gọi nhiều chức năng cùng một lúc, sẽ có nhiều chồng khung trên stack. Đống, mặt khác, tăng ở đây, không phải là cho các chức năng, không cho các biến địa phương. Nó cho động được phân bổ biến. Vì vậy, đây là những biến có thể được khởi tạo trong cả hai chính hoặc một chức năng mà các cuộc gọi chính. Bất cứ nơi nào trong mã của bạn, họ có thể được khởi tạo. Và để khởi tạo một động biến được phân bổ. Chức năng gì trong C để chúng ta sử dụng không? HỌC SINH: malloc. JASON Hirschhorn: malloc. Bạn gọi malloc. Bạn có được một không gian bộ nhớ. Và không gian bộ nhớ là trên heap. Và không gian bộ nhớ vẫn đó cho đến khi bạn gọi miễn phí. Vì vậy, biến động được phân bổ trong đống sẽ tồn tại cho đến khi bạn muốn họ tồn tại, và họ sẽ không đi cho đến khi bạn rõ ràng nói với họ ra đi. Bạn có thể tạo ra chúng trong một chức năng. Của chức năng ngăn xếp khung sẽ biến mất. Nhưng biến mà sẽ vẫn tồn tại trong đống cho đến khi nó được giải phóng, có khả năng bởi các chức năng đó được gọi là tìm kiếm nhị phân hoặc bất cứ điều gì. Vì vậy, những biến đống ở đó cho miễn là bạn muốn họ ở lại đó. Và họ được đặt ở đây. Và sau đó là một tiếp theo được đặt ở đó. Họ tiếp tục nhận được điền vào, và họ ở lại đó cho đến khi bạn gọi miễn phí. Và về cơ bản, heap và stack, nhận được câu hỏi của Marcus, phát triển với nhau. Và nếu họ chạy vào nhau, bạn đã sử dụng hết tất cả các bộ nhớ trong của bạn máy tính, và chương trình của bạn sẽ bỏ thuốc lá bởi vì bạn không có bất kỳ bộ nhớ hơn còn lại để sử dụng. Ở giữa chúng, có điều có khả năng khác. Nhưng đối với phạm vi của khóa học này, bạn không cần phải lo lắng về điều đó. Vì vậy, đó là câu trả lời câu hỏi của bạn. Đừng lo lắng về cái đó. Nhưng đó là câu trả lời dài. Tất cả các bạn cần biết là heap và stack sẽ - người ta bắt đầu ở phía dưới. Ngăn xếp không. Đống trên đó. Họ sẽ gần hơn với nhau. Và nếu họ chạm vào, đó là một vấn đề. Bạn chạy ra khỏi bộ nhớ. Nhưng cũng có thể, ngoài việc biết nơi họ, những gì được lưu trữ trong cả hai ngăn xếp và đống. Curtis. CURTIS: Khi va chạm, là một chồng tràn? JASON Hirschhorn: Khi va chạm, đó không phải là một chồng tràn. Một tràn stack là một khu vực khác nhau chúng ta có thể đi qua nếu bạn muốn. OK, chúng tôi sẽ trở lại trong một chút. HỌC SINH: từ gọi là gì khi họ đánh nhau, ngăn xếp và heap? JASON Hirschhorn: Hiện tại, đừng lo lắng về. Chỉ biết - Tôi sẽ trả lời câu hỏi sau giờ học. Nếu họ chạy vào nhau, bạn chạy ra khỏi bộ nhớ, bởi vì không có nhiều không gian đó. HỌC SINH: Xin lỗi, một lỗi seg là gì? JASON Hirschhorn: Một bộ phận lỗi có thể được gọi là cho - nó phụ thuộc lý do tại sao gọi là lỗi của seg. Đôi khi, tràn stack của bạn, nó sẽ nói seg lỗi như lỗi. HỌC SINH: Còn dereferencing một biến null? Là một lỗi seg? JASON Hirschhorn: dereferencing một con trỏ null - OK, vì vậy nếu bạn có một con trỏ mà bạn thiết lập bằng vô giá trị, con trỏ, thu hồi, địa chỉ bộ nhớ lưu trữ như giá trị của họ. Và một con trỏ null là chủ yếu lưu trữ 0, 0-th giải quyết trong biến đó. Vì vậy, 0x, 0, 0, 0, 0, vân vân. Địa chỉ 0-thứ trong bộ nhớ đó không phải là trong hình ảnh của chúng tôi, mà trên đó nơi nào đó, đó là dành riêng cho máy tính. Chúng tôi không được phép chạm vào nó. Vì vậy, khi chương trình của bạn đang thực hiện, nếu một cái gì đó đang cố gắng để đi vào bộ nhớ địa chỉ 0, nó biết rằng đó là một giá trị rỗng. Nó không biết gì cần phải có. Vì vậy, nếu bạn cố gắng và sử dụng một cái gì đó có và điều trị như thế có hay cố gắng để đi đến vị trí đó, bạn sẽ nhận được một lỗi seg hoặc một lỗi. Điều đó trả lời câu hỏi của bạn? Và bây giờ chúng tôi sẽ quay trở lại để ngăn xếp tràn. Những điều trong ngăn xếp, như các bạn có được thấy trước, trong - chúng ta hãy vẽ một gần lên một khung stack. Tất cả mọi người có thể nhìn thấy không? Vì vậy, chúng tôi có khung ngăn xếp của chúng tôi. Chúng tôi đang tiết kiệm một mảng như là một địa phương biến trong chức năng này. Vì vậy, nói mảng của chúng tôi có năm điểm. Tất cả năm của những người sẽ được lưu trữ trong đó stack frame. Nếu chúng ta bắt đầu viết ngoài giới hạn của mảng này - vì vậy nếu chúng ta bắt đầu viết vào, chúng ta hãy nói rằng đó là 0. Đó là những năm chỉ số của mảng của chúng tôi. Nếu chúng ta bắt đầu viết vào chỉ số 5, chúng tôi không có khi chúng ta có một mảng có kích thước 5, chúng tôi bắt đầu viết vào chỉ số 6, 7, 8, 9, chúng tôi có thể nhận được một Stack Lỗi tràn. Nói chung nó không phải là - có thể bạn sẽ gặp rắc rối nếu bạn đi trên một. Nhưng nói chung, bạn sẽ nhận được vào hầu hết các rắc rối nếu bạn đi qua bởi rất nhiều và bạn đi xa hơn mà bạn viết trên địa chỉ trở lại đó chức năng, mà nằm ở dưới cùng của khung stack. Bởi vì, phải không? Bạn - trong - xin lỗi. Không "bởi vì ngay." Trong khung ngăn xếp, bạn có biến địa phương của bạn. Ở dưới cùng của ngăn xếp khung là địa chỉ trở lại. Đó là nơi mà các chức năng đi khi nó kết thúc. Và nếu bạn ghi đè lên trở lại mà địa chỉ, sau đó khi stack frame này, khi bạn đang đi qua các ngăn xếp khung và thực hiện mỗi dòng, bạn sẽ đi đến địa chỉ mới của bạn trở lại đó là viết có thay vì một thực tế. Và đó là cách chúng tôi đã nhìn thấy một số lỗ hổng bảo mật có thể xảy ra với máy tính. Vì vậy, chồng tràn, trong ngắn hạn, là khi bạn ghi đè lên một phần trong ngăn xếp bạn đang nghĩ để sử dụng, các địa phương biến bạn đang nghĩ để sử dụng, và đặc biệt là khi bạn bắt đầu ghi đè lên điều quan trọng như địa chỉ trở về. Và đó là nơi bạn sẽ nhận được một lỗi. Hoặc thậm chí bạn có thể bắt đầu thậm chí bằng văn bản vào - nói tìm kiếm nhị phân là ngay trên chính. Nếu bạn ghi đè lên rất nhiều, bạn có thể viết vào chính. Nhưng nói chung, bạn nhận được một lỗi trước sau đó, bởi vì máy tính biết bạn đang làm một cái gì đó bạn không nên làm. Yeah. HỌC SINH: sự khác biệt là gì giữa một chồng tràn và một lỗi tràn bộ đệm? JASON Hirschhorn: đệm tràn là một loại chung chung hơn của những gì tôi vừa mô tả. HỌC SINH: Vì vậy, một chồng tràn là một ví dụ về một lỗi tràn bộ đệm. JASON Hirschhorn: Chính xác. Đây là một mảng chúng ta có thể nghĩ như một đệm, một không gian cho những thứ để đi in Đây là một chồng tràn bộ đệm. Chúng ta có thể có một lỗi tràn bộ đệm heap. Nếu có một bộ đệm, mà thường có là một mảng heap, và chúng tôi ghi đè lên những giới hạn, sau đó chúng tôi sẽ có một lỗi tràn bộ đệm heap. Và vượt ra ngoài phạm vi của khóa học này, họ phát hiện một chút khác nhau. Trình biên dịch có đặc biệt cách phát hiện mỗi. Nhưng một lỗi tràn bộ đệm là một chung chung hơn loại những gì tôi mô tả, đó là một chồng tràn bộ đệm. Sao mà trả lời câu hỏi của bạn? Ngọt ngào. Có bất kỳ câu hỏi liên quan khác vào stack hoặc heap? Yeah. HỌC SINH: Tôi biết bạn phải dây miễn phí bởi vì họ đang ở trong đống và bạn không muốn bị rò rỉ bộ nhớ. Nhưng bạn có để giải phóng các biến toàn cầu và các công cụ như vậy? Hoặc là họ tự động giải phóng? JASON Hirschhorn: Câu hỏi. Vì vậy, trong CS50.H, chúng tôi tạo ra điều này cho bạn gọi là một chuỗi. Một chuỗi thực sự là gì? HỌC SINH: sao Char. JASON Hirschhorn: Một ngôi sao char, một con trỏ cho một nhân vật, một con trỏ tới một loạt các ký tự. Đó là những gì các chuỗi. Vì vậy, chúng ta cần phải giải phóng nó, bởi vì getString, mà chúng tôi sử dụng rất nhiều - tên chuỗi bằng getString - mà mallocs cho chúng tôi một số bộ nhớ trên heap và sau đó trả về một con trỏ đến ký tự đầu tiên đó chuỗi, một ngôi sao char. Vì vậy, bề ngoài, nếu bạn đã không được văn bản miễn phí trên bất kỳ dây của bạn mà bạn đã gọi là cho đến nay, bạn có bị rò rỉ một số bộ nhớ. Tất nhiên chúng tôi đã không nói chuyện về nó, vì vậy không ai nhận trong khó khăn để làm việc đó. Nhưng đi về phía trước, có. Khi bạn gọi getString, bạn mallocing một số không gian trên heap. Và nếu bạn không gọi miễn phí sau đó chuỗi, bạn có một rò rỉ bộ nhớ. Mà trả lời câu hỏi của bạn? Vâng HỌC SINH: Vì vậy, để làm được điều đó, chúng ta sử dụng miễn phí ngay trước khi trở lại? Như, trong phạm vi, tôi đoán nếu chúng ta nói, như, int chính, trong phạm vi của mã đó là trong những dấu ngoặc nhọn, ngay trước - bạn biết nơi bạn muốn thường được đặt trở lại. Bạn có đặt miễn phí trước đó? JASON Hirschhorn: Vì vậy, bạn có thể đặt miễn phí bất cứ nơi nào bạn muốn đặt miễn phí. Bởi vì chúng được phân phối tự động biến, bởi vì họ có thể sống ngoài phạm vi của một đặc biệt chức năng, nếu bạn gọi malloc trong một chức năng riêng biệt, ví dụ, getString, bạn có thể gọi miễn phí trong chính. Bạn không cần phải gọi nó trong các chức năng cụ thể nơi malloc được gọi. Nhưng bạn cần phải gọi nó trước khi trở về chính. Và nó thực sự phụ thuộc. Nó phụ thuộc vào lý do tại sao bạn malloced mà không gian ở nơi đầu tiên. Một số người sẽ gọi giải phóng khá nhanh chóng. Một số người sẽ không gọi miễn phí cho đến khi kết thúc chương trình của họ. Và họ sẽ đi qua và tất cả mọi thứ miễn phí. Nó phụ thuộc vào lý do tại sao bạn gọi malloc. HỌC SINH: Và bạn sẽ nói gì nếu bạn sử dụng được gọi là getString? Bạn muốn nói gì miễn phí? JASON Hirschhorn: Vì vậy, cú pháp miễn phí chỉ đơn giản là miễn phí, dấu ngoặc mở, đóng Dấu ngoặc đơn, và tên của con trỏ. Vì vậy, nếu bạn viết tên chuỗi bình đẳng getString, bạn đặt tên ở đây. Đó là tên của con trỏ. Và nó biết để giải phóng bộ nhớ. HỌC SINH: Vì vậy, khi nó giải phóng bộ nhớ rằng, con trỏ vẫn còn chỉ tới nơi trong bộ nhớ? Hoặc là con trỏ cũng làm trống của địa chỉ mà nó trỏ tới. JASON Hirschhorn: Chúng ta nên cố gắng đó. Chúng ta nên mã đó. Chúng ta hãy trở lại khi chúng tôi nhận được mã hóa, và chúng ta hãy mã đó. Và nếu bạn muốn tìm ra câu trả lời vào đó, bạn cũng có thể mã trong khi chờ đợi. Nhưng đó là một câu hỏi lớn. HỌC SINH: Có thể một cái gì đó miễn phí quá sớm? Vì vậy, bạn vẫn cần nó cho chương trình của bạn, và bạn giải phóng không gian bộ nhớ? JASON Hirschhorn: Có. Có thể, nếu bạn miễn phí một cái gì đó và sau đó bạn sử dụng nó một lần nữa, bạn sẽ chạy vào một lỗi. Nhưng đó là vào bạn, bởi vì bạn giải phóng một cái gì đó và sau đó gọi nó sau này. Vì vậy, đó là sai lầm của một lập trình viên. Nhưng có. Bạn có thể viết đó. Bất kỳ câu hỏi thêm về - Vâng. HỌC SINH: Vì vậy, nếu bạn có nghĩa vụ phải chỉ giải phóng nó nói chung trước khi chương trình kết thúc, không có nghĩa nếu chương trình kết thúc và bạn không giải phóng nó, bộ nhớ vẫn được giao? JASON Hirschhorn: Nếu chương trình của bạn kết thúc và bạn quên để giải phóng một cái gì đó, sau đó bộ nhớ đã được phân bổ trong suốt tuổi thọ của chương trình của bạn. Khi chương trình của bạn đóng cửa hoàn toàn, bộ nhớ được không ở lại đó mãi mãi. Máy tính là đủ thông minh để biết khi chương trình đóng lại, nó nên loại bỏ tất cả các bộ nhớ được kết hợp với chương trình đó. Tuy nhiên, có những công cụ bạn có thể chạy trên một chương trình để phát hiện nếu, khi chương trình kết thúc, bạn quên để giải phóng một số bộ nhớ. Và cho vấn đề tiếp theo của bạn thiết lập nơi bạn sẽ được sử dụng malloc và sử dụng con trỏ, bạn sẽ được chạy này chương trình trên chương trình của bạn để xem, khi lợi nhuận chính, bạn đã có một số thứ còn sót lại unfreed. Vì vậy, họ sẽ không ở lại malloced mãi mãi trong máy tính của bạn. Đó sẽ là lãng phí, bởi vì rất nhanh chóng, máy tính sẽ chạy ra khỏi bộ nhớ. Nhưng nếu họ chạy đến khi kết thúc của bạn chương trình và họ không giải phóng và của bạn chương trình thoát, đó vẫn là một vấn đề rằng công cụ này sẽ giúp bạn giải quyết. HỌC SINH: Có phải đó là Valgrind? JASON Hirschhorn: Đó là gọi là Valgrind. Và bạn sẽ có - HỌC SINH: Nhưng chúng ta không cần phải biết rằng đối với các bài kiểm tra, mặc dù? Ý tôi là, nó đã được nói về một chút trong bài giảng. JASON Hirschhorn: Vì vậy, Valgrind là tên của công cụ đó. Hiểu biết những gì nó làm là đủ cho các bài kiểm tra. Nhưng bạn đã không sử dụng nó chưa về bạn vấn đề thiết lập bởi vì chúng tôi đã không có một vấn đề thiết lập đó đã bị xử lý một cách rõ ràng với malloc hoặc bạn sử dụng malloc. Vì vậy, bạn đã không sử dụng Valgrind được nêu ra. Nhưng bạn sẽ sử dụng nó sớm hơn hơn là sau này. HỌC SINH: Bạn có thể lặp lại những gì Valgrind là? JASON Hirschhorn: Xin lỗi? HỌC SINH: Bạn có thể lặp lại những gì mục đích của Valgring là? JASON Hirschhorn: Valgrind là tên - như GDB giúp bạn gỡ lỗi chương trình của bạn, Valgrind giúp bạn tìm ra nếu mọi thứ đã không được trả tự do khi chương trình của bạn đóng cửa. Vì vậy, bạn sẽ chạy nó trên chương trình của bạn. Và chương trình của bạn thoát ra, và nó sẽ nói chương trình của bạn được gọi là malloc này nhiều lần này nhiều byte, và bạn chỉ được gọi miễn phí này nhiều lần. Và do đó bạn để lại những nhiều byte mà không được giải thoát. Hoặc nó sẽ nói rằng bạn đã giải thoát tất cả mọi thứ. Tốt công việc. HỌC SINH: OK. Và nó được gọi là Valgring? JASON Hirschhorn: V-A-L-G-R-I-N-D. HỌC SINH: Một câu hỏi về con trỏ. Vì vậy, nói rằng bạn đã sao n x bằng một cái gì đó. Mà bằng, bất cứ điều gì bạn đang đặt có, đó là những gì đang được đặt bên trong những gì x được trỏ đến, hoặc con trỏ của x? JASON Hirschhorn: Có thể bạn nhắc lại câu hỏi? Chúng ta có thể rút ra nó trong khi bạn nói không? HỌC SINH: Trong các bài kiểm tra, trên thực tế, một trong những bạn gửi cho chúng tôi, nó giống như, char sao sự thật bằng đá CS50, phải không? Vì vậy, không có nghĩa là có đá CS50 là những gì sự thật là chỉ tới? JASON Hirschhorn: Vì vậy, bạn đang nói về một ngôi sao char trong một chuỗi, làm thế nào mà làm việc? Yeah. OK. Chúng ta hãy vẽ này ở đây. [Phụ Conversation] JASON Hirschhorn: Vì vậy, biến này là có được kiểu char sao. Làm thế nào lớn là một biến kiểu char sao? Bao nhiêu byte? SINH VIÊN: Bốn. JASON Hirschhorn: Đó là bốn byte. Bao nhiêu quyền là một biến kiểu int sao? SINH VIÊN: Bốn. JASON Hirschhorn: Bốn byte. Nếu đó là một con trỏ, sau đó nó luôn luôn là bốn byte, bởi vì con trỏ, họ giá trị là một địa chỉ bộ nhớ. Và địa chỉ bộ nhớ trên CS50 thiết bị dài bốn byte. Vì vậy, khi chúng ta gọi là getString, hoặc khi chúng ta nói, stringname bằng, và sau đó trong dấu ngoặc kép đặt một chuỗi, chúng tôi đang đặt - tốt, đó là một chút khác nhau. Chúng tôi sẽ làm getString làm ví dụ. Hoặc char sao một cái gì đó bằng chuỗi. Xin lỗi, cho tôi ví dụ bạn đọc? HỌC SINH: char thật sao bằng "Đá CS50" trong dấu ngoặc kép. JASON Hirschhorn: Vì vậy, ngôi sao này, điều này chúng tôi sẽ gọi biến này x cho chúng tôi mục đích chung. Chúng tôi đã tạo một biến gọi là x. Đó là kiểu char sao. Nó là một con trỏ đến một loạt của các nhân vật. Vì vậy, ở đây - Vì vậy, đây là cách điều này sẽ làm việc trong bộ nhớ. Điều này sẽ lưu trữ một địa chỉ bộ nhớ. Nó sẽ lưu trữ các địa chỉ bộ nhớ của ký tự đầu tiên trong mảng. Và sau đó khi bạn tiếp con trỏ, bạn sẽ có ký tự đầu tiên. Và nếu bạn đang đọc điều này như một chuỗi, máy tính của bạn là thông minh đủ để biết, đọc toàn bộ điều này cho đến khi nó được đến một phản ứng dữ dội 0. Nhưng nếu bạn đang đọc nó một ký tự tại một thời gian, vì vậy bạn lặp lại thông qua chuỗi này, sau đó bạn sẽ chỉ cần đọc một nhân vật tại một thời gian cho đến khi bạn nhận được để dấu gạch chéo ngược 0. Điều đó có thể không trả lời của bạn câu hỏi, mặc dù. HỌC SINH: Vâng, nhưng bạn phải không malloced không gian nào cho con trỏ đó. JASON Hirschhorn: Vì vậy, tôi không khá chắc chắn chính xác những gì bạn đang tìm kiếm, bởi vì tôi đã không làm bài kiểm tra đó. Lẽ ra phải là một hữu ích tài nguyên từ TF khác. Nếu bạn đang tạo một chuỗi trên chồng hoặc là một biến địa phương, nó sẽ chỉ là mảng phí hơn nói chung là một ngôi sao char trỏ đến một chuỗi. Nhưng tôi không biết. Đó có thể là một con trỏ đến một chuỗi trên stack là tốt. Yeah. HỌC SINH: Tôi biết rằng bạn cần phải cấp phát bộ nhớ nếu con trỏ việc khai báo trong chức năng khác. Bạn cần phải làm điều tương tự nếu nó bị tuyên bố bên trong chính, bạn đang sử dụng nó bên trong chính? JASON Hirschhorn: Vì vậy, có. Bạn có thể khai báo một con trỏ đến bất kỳ địa chỉ bộ nhớ trong bộ nhớ. Nó có thể là địa chỉ bộ nhớ của một địa phương biến, mặc dù đôi khi, người không khai báo địa chỉ bộ nhớ để biến địa phương vì họ đi lập tức một khi hàm trả về, mà là lý do tại sao chúng ta thường malloc điều. Nhưng có, bạn có thể khai báo một con trỏ để một biến địa phương. Nó chỉ nói chung không được thực hiện. Nhưng tôi có thể có một cái nhìn ở đó điều cụ thể sau giờ học. Yeah. HỌC SINH: Tôi nghĩ rằng đây là loại của những gì được yêu cầu. Nó không có vẻ kỳ lạ được khởi tạo một con trỏ không phải là một địa chỉ, nhưng như những gì có vẻ như một giá trị. Nó có vẻ như CS50 là những gì bên trong điều được chỉ ra và không phải là địa chỉ thực tế, phải không? JASON Hirschhorn: Vì vậy, đó là không phải là trường hợp, mặc dù. Đó không phải là những gì đang xảy ra. Khi bạn khai báo một ngôi sao char, đó là một địa chỉ bộ nhớ. Con trỏ là tất cả các địa chỉ bộ nhớ chỉ vào cái gì khác. Rằng cái gì khác có thể là trên ngăn xếp, nhưng hầu như luôn luôn là trên heap trong cách chúng ta sẽ thấy nó được sử dụng. Nhưng stringname bằng hai trích dẫn "GetString," chúng ta có thể thấy rằng chúng tôi có thể xem xét thông qua đó và mã đó. getString chuỗi không được lưu trong rằng biến, hoặc bất cứ chuỗi tên là không được lưu trong đó biến, bởi vì đó không phải là cách con trỏ làm việc. Điều đó có ý nghĩa? HỌC SINH: Vâng. JASON Hirschhorn: OK. Hy vọng rằng, đó không phải là gây nhầm lẫn với bất cứ ai. Nhưng nếu nó là, chúng ta có thể nhìn vào nó một lần nữa trong một chút, bởi vì chúng tôi thực sự đi mã cái gì đó sẽ hy vọng làm việc với chuỗi và giúp bạn cảm thấy thoải mái hơn với họ. Bất kỳ câu hỏi khác liên quan đến các chủ đề hoặc các chủ đề khác Tôi sẽ đưa trở lại? Và - ngay bây giờ. Có, Alden. ALDEN: Vì vậy, đây là hoàn toàn không liên quan, nhưng chúng ta có thể chỉ cần đi qua thực sự một cách nhanh chóng những gì chúng ta cần biết về sự khác biệt giữa 32 và 64-bit máy? JASON Hirschhorn: Có. Vì vậy, 32 bit là bao nhiêu byte? ALDEN: Đó là bốn byte. JASON Hirschhorn: Đó là bốn byte. Và 64 bit là bao nhiêu byte? HỌC SINH: Tám. JASON Hirschhorn: Tám byte. Vì vậy, một lần nữa, tám bit là một byte. Thiết bị của bạn là CS50 một máy 32-bit. Vì vậy, địa chỉ bộ nhớ dài bốn byte. Có 2 đến 32 địa chỉ bộ nhớ. 0-2 đến 32 trừ đi 1. Và tôi không tích cực, nhưng đó là có lẽ là phạm vi những gì bạn cần biết một máy 32-bit, bộ nhớ rằng địa chỉ là, một lần nữa, dài bốn byte, và đó là số tiền tối đa địa chỉ bộ nhớ. Ngoài ra, các kiểu dữ liệu - này có thể là một cái gì đó như đó cũng là đáng chú ý. Kích thước của một kiểu dữ liệu phụ thuộc vào máy bạn đang làm việc với. Vì vậy, một char, một nhân vật duy nhất, là làm thế nào nhiều byte trên thiết bị CS50 của chúng tôi? Một byte. Và nó thực sự là một byte như cũng trên một máy 64-bit. Và hầu hết các loại dữ liệu cùng một số của byte trên cả hai máy. Nhưng một số loại dữ liệu sẽ khác nhau trên cả hai máy. Vì vậy, đó sẽ là khả năng các Điều duy nhất bạn cần biết. Nhưng ngay cả điều đó, tôi nghĩ rằng, vượt quá giới hạn - Tôi gần như tích cực, nếu bạn nhìn lại tại các câu đố cũ, nó nói, giả sử cho mã hóa các vấn đề bạn đang sử dụng một máy 32-bit. Nhưng có, để đi cùng với năm trường hợp bạn đang quan tâm, có các kiểu dữ liệu đó là như nhau kích thước trên tất cả các máy. Nếu bạn đã nhìn thấy một cái gì đó như uint32_t, bạn có thể hoặc có thể không đã thấy rằng. Đó là một kiểu dữ liệu. Đó là nói, là 32 bit không có vấn đề những gì máy tính này trên. Vì vậy, khi mọi người đang viết di động mã, họ có thể sẽ không sử dụng số nguyên. Thay vào đó họ sẽ sử dụng các dữ liệu khác loại mà họ biết sẽ là như nhau kích thước trên mỗi máy tính duy nhất. Madhu. Madhu: Tôi có một câu hỏi về quá trình biên dịch. Vì vậy, nếu bạn đang viết một chương trình sử dụng một thư viện như CS50 hoặc một cái gì đó như thế, tôi biết rằng thư viện đã đến, tại một số điểm, được biên soạn và liên kết nhập Nhưng bao nhiêu đó xảy ra trong quá trình việc biên soạn chương trình của bạn? Một phần những gì của quá trình thư viện xảy ra khi bạn biên soạn chương trình riêng của bạn? JASON Hirschhorn: Vì vậy, hãy đi qua nói chung các bước của quá trình này. Bạn ghi file c của bạn.. Trong tập tin c của bạn., Bạn # bao gồm của bạn thư viện tiêu đề, ví dụ, cs50.h. Những gì hiện có bao gồm sắc nét dòng làm gì để chương trình của bạn? Akchar. AKCHAR: Nó cho biết thêm các nguyên mẫu của các chức năng từ tiêu đề các tập tin trong thư viện. JASON Hirschhorn: Chính xác. Nó cho biết thêm những nguyên mẫu chức năng mã của bạn. Vì vậy, khi mã của bạn đang được biên soạn trong giai đoạn đầu, trình biên dịch biết rằng các chức năng này thực sự tồn tại, và một nơi nào đó họ đã được xác định. Các tập tin. H không bao gồm định nghĩa cho các chức năng này hoặc làm thế nào họ thực sự làm việc. Cs50.h chỉ bao gồm cái gì mà nói getString là một điều thực sự mà có thể xảy ra. Và standardio.h nói printf là một điều thực sự có thể xảy ra. Vì vậy, tiêu đề ngôn ngữ c của bạn với điều này. tập tin được biến thành một số mã máy có thể đọc được, mà cuối cùng được chuyển thành nhị phân mã, 0 và 1. Và đó là mã cuối cùng được thực hiện. -L dòng CS50 - ví dụ, khi bạn đang viết Clang - và sau đó bạn có-l CS50, bạn gõ mà in Và bạn thấy điều đó. Khi bạn viết thực hiện, bạn sẽ thấy dòng lên đây. Và chúng ta sẽ thấy rằng trong một giây khi chúng tôi mã hoặc sau này khi chúng tôi mã. Nhưng điều đó-l dòng CS50 làm điều gì đó một chút khác biệt so với # include cs50.h. Không dòng-l CS50 làm những gì? Avi? AVI: Tôi muốn nói rằng nó liên kết thư viện với chức năng gọi, như o tập tin.. JASON Hirschhorn: Vì vậy, rất gần, nếu không tại chỗ trên. -L CS50 có các tập tin nhị phân và kết hợp nó với tập tin nhị phân của bạn. Vì vậy, cs50.h, không có điểm trong chuyển cs50.h từ ngôn ngữ C để nhị phân mỗi lần duy nhất nó đang được sử dụng. Đó sẽ là ngớ ngẩn, bởi vì đó sẽ lãng phí rất nhiều thời gian. Vì vậy, nó đã được biên dịch và trở thành một thực thi. Và bây giờ nó sẽ được sáp nhập với các tập tin của bạn ở cuối. Vì vậy, những của 1 và 0 sẽ kết hợp với những người thân của bạn và 0 ở cuối. Vì vậy, bây giờ bạn sẽ thực sự có thực tế 1 và 0 của xác định cách thức getString, Ví dụ, công trình, hoặc làm thế nào printf, Ví dụ, các công trình. Và cho biết thêm thông tin, có một trình biên dịch ngắn Nate cho rằng bạn nên kiểm tra mà đi thông qua các bước sau. Nhưng - Vâng. HỌC SINH: Họ luôn luôn trong o tập tin. khi họ đang ở trong hình thức thư viện, sẵn sàng để được sáp nhập, liên kết - như họ đang ở trong mã nhị phân? JASON Hirschhorn: OK. Những gì - HỌC SINH: Đó có phải là luôn luôn như vậy cho các thư viện khi bạn liên kết họ? JASON Hirschhorn: Có. Do đó các tập tin, mà sẽ được là. S mã máy, mà cũng sẽ có khó hiểu cho bạn. Bạn không cần phải lo lắng về những người. Nhưng nói chung, yeah, họ sẽ được. o tập tin sẵn sàng để đi. HỌC SINH: Vì vậy, khi bạn gửi đến một thư viện, bạn chỉ tàu h. và o.? Bạn không tàu c hay. S.. JASON Hirschhorn: Vì vậy, - và điều này là trong ngắn hạn này là tốt, nếu thông tin này có vẻ là đến một ít một cách nhanh chóng. Nhưng ngắn trên các trình biên dịch các cuộc đàm phán về điều này là tốt. Khi bạn gửi một thư viện, nếu bạn tàu h., tập tin tiêu đề, những nguyên mẫu chức năng, và 1 và 0, đó là tất cả các bạn cần phải cung cấp. Bạn không cần phải cung cấp như thế nào chức năng hoạt động, các tập tin c.. Vì điểm trừu tượng, hoặc chỉ API, điểm tại SPL này, thư viện di động Stanford, đó là để bạn có thể không lo lắng về việc làm thế nào mới GRect hoạt động, hoặc làm thế nào di chuyển các công trình, hoặc làm thế nào thêm các công trình. Tất cả các bạn cần biết là add mà là một chức năng mà bạn có thể sử dụng, và nó thực hiện điều này. Vì vậy, bạn thực sự không cần phải biết làm thế nào nó được viết bằng C. Bạn chỉ cần biết, đây là các chức năng, những gì họ làm, và đây là của 1 và 0 khi bạn thực sự muốn sử dụng chúng. Mát mẻ. Bất kỳ câu hỏi thêm về các trình biên dịch hoặc các chủ đề khác trên diễn đàn? HỌC SINH: Tôi có một câu hỏi thực hiện chức năng đệ quy. Một câu hỏi về đệ quy. Tôi có cảm giác rằng sẽ đi lên. Vì vậy, hãy nhanh chóng đi qua đệ quy với một cụ thể Ví dụ, một chức năng thừa. Bởi vì đây là một ví dụ thường đi kèm hoặc được sử dụng để minh họa cho đệ quy. Vì vậy, "4!" được đọc như 4 thừa. Và những gì 4 thừa nghĩa là gì? Điều đó làm những gì? Làm thế nào để bạn tính toán 4 thừa? 4 lần 3 lần 2 lần 1. Vì vậy, một cách khác để viết 4 thừa là viết này. 4 lần 3 thừa. Vì 3 nhân tố là 3 lần 2 lần 1. Vì vậy, 4 lần 3 thừa là 4 lần 3 lần 2 lần 1. Đây là lý do tại sao thừa là một tuyệt vời ứng cử viên cho đệ quy, bởi vì nó rõ ràng là có cái gì đó xảy ra hơn và hơn và hơn trên một số lượng nhỏ hơn những thứ cho đến khi bạn đạt được kết thúc. Khi bạn đạt đến 1, 1 thừa là 1. Bạn không thể đi xa hơn nhiều. 0 thừa cũng được định nghĩa là 1. Vì vậy, khi bạn nhận được 1 hoặc 0, bạn lúc kết thúc, và bạn có thể bắt đầu đi trở lại. Vì vậy, nếu chúng ta muốn viết một đệ quy chức năng để tính toán một thừa, chúng ta sẽ viết một số giả cho rằng bây giờ. Trước khi chúng tôi viết rằng giả - Tôi sẽ cung cấp cho các bạn một vài phút để viết mã giả hoặc chỉ nghĩ về nó - có hai điều mỗi hàm đệ quy cần. Hai điều này là gì? JACK: Nó phải gọi chính nó. JASON Hirschhorn: Noah? Oh, Jack. Đi trước. JACK: Nó phải gọi chính nó. JASON Hirschhorn: Vì vậy, một đệ quy chức năng cần có một cuộc gọi đệ quy, một gọi đến chính nó. Đó là một. Và điều khác là những gì? JACK: Một trường hợp cơ sở. JASON Hirschhorn: Một trường hợp cơ sở. Một trường hợp cơ sở là, đây là khi chúng tôi dừng lại. Vì vậy, chức năng của bạn được gọi là. Trường hợp cơ sở đến trước. Bạn muốn biết nếu bạn đang ở cuối. Và nếu bạn không phải ở cuối, bạn thực hiện cuộc gọi đệ quy của bạn. Và bạn đi qua chức năng này một lần nữa, kiểm tra trường hợp cơ sở của bạn một lần nữa. Nếu bạn không phải cuối cùng, bạn thực hiện một cuộc gọi đệ quy, vân vân, vân vân. Đó là lý do tại sao chức năng đệ quy luôn luôn cần những trường hợp cơ sở và những cuộc gọi đệ quy. Nếu bạn không có một cuộc gọi đệ quy, nó sẽ không có một hàm đệ quy. Nếu bạn không có một trường hợp cơ sở, bạn sẽ đi mãi mãi và sẽ không có kết thúc. Và trường hợp cơ sở luôn luôn đến trước, bởi vì bạn sẽ luôn luôn muốn kiểm tra nếu bạn đang ở cuối đầu tiên. Vì vậy, trước khi chúng tôi làm một số giả, tại sao bạn không dành một phút để suy nghĩ về như thế nào một chức năng thừa đệ quy sẽ được viết? Ngoài ra, như nhiều như bạn đang làm, bằng văn bản nó ra trên một tờ giấy là những gì bạn sẽ phải làm trên các bài kiểm tra vào ngày mai. Như vậy có lẽ tốt thực hành để làm cho chắc chắn rằng mã bạn đang viết xuống trên tờ giấy - hoặc bạn có thể làm điều đó. Bạn biết nơi mà các dấu chấm phẩy là. Bạn có nhớ cú pháp. Bởi vì bạn không thể có một trình biên dịch cho bạn thực hiện một lỗi. Ngoài ra, dọc theo các dòng, vào ngày mai, khi bạn đã mã hóa các vấn đề, nếu bạn đang vội vã tìm kiếm thời gian, hoặc nếu bạn rất nhầm lẫn như thế nào bạn đang nghĩa vụ phải viết điều đặc biệt trong c, nó sẽ behoove bạn viết mã giả hoặc viết ý kiến ​​trong là tốt. Bởi vì có tín dụng một phần cho một rất nhiều các câu hỏi trong bài kiểm tra. Vì vậy, bạn có thể vội vàng, hoặc bạn chỉ có thể bị nhầm lẫn. Viết trong bình luận hoặc mã giả thường cách mà bạn có thể nhận được tín dụng một phần. Vì vậy, không để lại một cái gì đó trống trên các bài kiểm tra. Không có hình phạt đối với đưa mọi thứ in Trong thực tế, việc đưa mã giả hoặc ý kiến ​​sẽ giúp các học sinh lớp tìm ra nếu bạn thực sự biết những gì bạn đang nói về, và có lẽ giải thưởng bạn một số tín dụng một phần cho điều đó. Cũng theo con đường này, viết rõ ràng. Nếu chúng ta có thể không thực sự những gì bạn đang viết, chúng tôi sẽ không gọi cho bạn vào lúc nửa đêm vào ngày mai để con số ra những gì bạn đã viết. Chúng ta chỉ cần đi để cất cánh điểm. Viết rõ ràng vì vậy chúng tôi có thể nghe thấy, hay đúng hơn, chúng ta có thể đọc những gì bạn viết. Và nếu nó nói hai câu, không viết một đoạn văn. Thực hiện theo các hướng dẫn. Viết rõ ràng. Và viết những ý kiến ​​hay giả cho câu hỏi mà có thể giải thưởng tín dụng một phần. OK, chúng ta hãy đi đến factorial. Vì vậy, chúng ta có một chức năng thừa. Nếu tôi được thực sự viết điều này trong C, những gì tôi cần phải đặt trước tên các chức năng? Kiểu trả về, trong đó, điều này trường hợp, chúng tôi sẽ cung cấp cho nó int. Và sau đó bên trong dấu ngoặc nhọn, là những gì diễn ra bên trong các dấu ngoặc nhọn cho một chức năng? SINH VIÊN: Đối số loại. JASON Hirschhorn: đối số của nó. Vì vậy, có thể sẽ thừa có một cuộc tranh luận. Nó sẽ có thể chỉ mất một đối số. Và chúng tôi sẽ nói nó sẽ mất một số nguyên được gọi là x. Và một lần nữa, khi viết nguyên mẫu của một chức năng hoặc bằng văn bản chức năng trong mã của bạn trước khi xác định nó, bạn viết các kiểu dữ liệu và tên của rằng biến cho chỉ có chức năng đó. Vì vậy, bạn có thể vượt qua một số số vào này chức năng, nó sẽ được gọi là x trong nội bộ. Chúng tôi có chức năng thừa của chúng tôi. Chúng ta cần hai điều, một trường hợp cơ sở và một cuộc gọi đệ quy. Trường hợp cơ sở cho thừa là gì? Ai đó đã viết nó ra và những người không có nói chưa, các cơ sở là những gì trường hợp thừa? HỌC SINH: Nếu n là ít hơn 2, trả lại 1. JASON Hirschhorn: Nếu n là ít hơn 2, trả lại 1. Tôi thích điều đó, bởi vì đó chăm sóc của 0 và 1. Vì vậy, chúng tôi sẽ làm x <2, trả lại 1. Nếu chúng ta có được thông qua 0, nếu chúng ta có được thông qua 1, chức năng này sẽ ngay lập tức trở về 1. Nếu chúng ta có được thông qua một số số lượng lớn hơn hoặc bằng 2, chúng ta sẽ có cuộc gọi đệ quy của chúng tôi. Và vì vậy làm thế nào là đi làm à? Có thể ai đó làm việc này người đã không nói chuyện nhưng cho tôi gọi đệ quy cho chức năng này trong giả? Nếu chúng ta có được thông qua trong một số x và nó lớn hơn 2, những gì Chúng ta muốn làm gì? Chúng tôi cũng đã một ví dụ bằng văn bản về bên đó có thể cung cấp cho bạn một gợi ý. HỌC SINH: Gọi x lần thừa của x trừ đi 1? JASON Hirschhorn: Chính xác ngay. Chúng tôi sẽ trở lại x lần giai thừa của x trừ đi 1. Và rằng, mặc dù tôi đã viết lên, về cơ bản, những gì bạn nói bằng tiếng Anh, chức năng thừa này sẽ được gọi một lần nữa. Nó sẽ thực hiện trên x trừ đi 1. Nó sẽ trở lại với một số nguyên, và sau đó nó sẽ nhân hai với nhau, và giá trị đó sẽ được quay trở lại bất cứ điều gì được gọi là này chức năng thừa, mà sức mạnh là một ví dụ của chức năng thừa này. Vì vậy, đó là một ví dụ của một đệ quy chức năng, rất hàm đệ quy đơn giản. Nhưng hầu hết trong số họ sẽ được như thế này. Nếu bạn muốn một đệ quy tốt thách thức cho các bài kiểm tra, thử mã hóa tìm kiếm nhị phân đệ quy. Bởi vì nếu bạn đã tìm kiếm nhị phân cho vấn đề thiết lập ba, có thể bạn đã làm nó lặp đi lặp lại trong một vòng lặp while. Nhưng nó cũng có thể được viết đệ quy. Bạn sẽ cần phải viết riêng của bạn chức năng riêng biệt mà phải mất một số đối số dòng lệnh khác nhau - hay không đối số dòng lệnh, một số khác nhau đối số chỉ thường xuyên. Nhưng bạn có thể viết tìm kiếm nhị phân đệ quy là tốt. HỌC SINH: Vì vậy, bạn có thể cũng đã viết, thay vì x trừ đi 1, bạn có thể cũng đã viết x trừ trừ, hoặc bạn có thể có bằng văn bản trừ trừ đi x. Bạn chỉ có thể giải thích lý do tại sao thực sự nhanh chóng những sẽ là những thứ khác nhau, giống như những gì là sự khác biệt giữa x trừ trừ và trừ trừ đi x? JASON Hirschhorn: Không, tôi không sẽ đi vào đó. Nhưng tôi sẽ nói chuyện với bạn về nó sau lớp. x trừ trừ trừ trừ đi x giảm giá trị x 1. Nhưng họ làm điều đó một chút khác nhau. Nhưng tôi không muốn đi vào đó. Câu hỏi khác về đệ quy hoặc chức năng này? Đó không phải là thực sự thậm chí giả. Đó là về cơ bản các mã trong C bạn sẽ viết cho việc này. OK, bất kỳ câu hỏi khác về các chủ đề ở đây? Yeah. HỌC SINH: Tôi có một tóm tắt nhanh chóng của điểm và độ chính xác nổi. JASON Hirschhorn: Nổi điểm và độ chính xác. Có thể ai đó thực sự nhanh chóng cho tôi một tóm tắt của dấu chấm động và độ chính xác? Tất cả các bạn phải làm điều này cho bạn vấn đề thiết lập, vì vậy bạn tất cả quen thuộc với nó. Hoặc có thể không phải tất cả các bạn. Bất cứ ai? Hãy cho tôi một điểm bắt đầu. Dấu chấm động và chính xác. Vấn đề là gì? Vâng. Victoria? Vanessa: Vanessa. JASON Hirschhorn: Vanessa. Xin lôi. Vanessa: Chỉ có một số hữu hạn số có thể biểu diễn bởi vì bạn đang ở trên một trong của chúng tôi trường hợp, một hệ thống 32-bit. Vì vậy, bạn hẳn sẽ có những làm cho một số con số. JASON Hirschhorn: Vì vậy, đó là chính xác. Chỉ có một số tiền nhất định con số đó có thể được đại diện. Nếu bạn nhân hai con số rất lớn, nó có thể tràn số tiền không gian bạn có để đại diện cho một số nguyên. Đó là lý do tại sao đôi khi chúng ta sử dụng một lâu dài thay vì một int. Có không gian hơn. Có thể chứa một số lượng lớn. Dấu chấm động chính xác đã làm với đó, nhưng cũng đã làm với các thực tế là số thập phân là không luôn luôn đại diện. Xin lôi. Hãy để tôi đưa trở lại này lên. Số thập phân 1.0 không phải là luôn luôn đại diện như bạn mong đợi, 1,000000000. Đôi khi nó được biểu diễn như là 1,000000001 hoặc 0,999999999. Nó có thể được thậm chí 89 ném ở đâu đó. Vì vậy, những con số thập phân không đại diện chính xác như bạn sẽ mong đợi họ được đại diện. Vì vậy, trong vấn đề thiết lập - là nó hai - vấn đề thiết lập hai, nơi mà chúng tôi xử lý số dấu chấm động, khi chúng tôi muốn họ đại diện cho chính xác những gì chúng tôi muốn họ đại diện, số lượng của đồng xu, hoặc số xu, chúng ta nhân chúng bằng 100. Chúng tôi làm tròn chúng. Và sau đó chúng tôi cắt đứt tất cả mọi thứ đằng sau dấu thập phân. Đó là để đảm bảo rằng họ sẽ thực sự bằng chính xác những gì chúng tôi muốn họ bằng. Bởi vì khi bạn có một cái gì đó một nổi và biến nó thành một int, bạn cắt đứt tất cả mọi thứ bên phải của các điểm thập phân. Bởi vì có một số điểm nổi không chính xác, có thể là 100.000 biểu diễn như là 99,999999999. Và nếu bạn chỉ cần cắt đứt tất cả mọi thứ để quyền ngay lập tức, bạn sẽ có được số lượng sai. Yeah. HỌC SINH: Tôi có một câu hỏi về đúc. Để những gì nó xảy ra trong? Nếu bạn muốn làm nổi, dấu ngoặc đơn, 1 chia 10, nó làm 1 chia cho 10, sau đó nhận được 0,1, sau đó lần lượt vào một phao? JASON Hirschhorn: Nếu bạn làm nổi 1 chia cho 10 - HỌC SINH: Vâng, và sau đó bằng - tốt, nó sẽ bình thường có nó bình đẳng trong - Yeah. Bạn muốn làm cho nó một nổi, phải không? JASON Hirschhorn: OK, vì vậy chúng ta sẽ sử dụng để Segue vào tìm ra câu trả lời cho những câu hỏi này thông qua mã hóa. Bởi vì có thể bạn sẽ có rất nhiều những câu hỏi phút, và là một cách tốt để giải quyết chúng là thông qua mã hóa. Vì vậy, chúng tôi đang đi vào mã này ngay bây giờ, và sau đó chúng ta sẽ quay trở lại và mã câu hỏi mà bạn đã có. Vì vậy, dòng đầu tiên - Tôi không nên viết nó - là những gì điều đầu tiên chúng tôi muốn làm khi chúng ta mở ra một file mới trong gedit? HỌC SINH: Bao gồm. JASON Hirschhorn: Bao gồm những gì? HỌC SINH: thư viện CS50. JASON Hirschhorn: OK. Chúng ta nên bao gồm những gì khác? Chúng ta chỉ cần đi để kiểm tra những gì sẽ xảy ra khi bạn cast một cái gì đó nổi một. Nhưng những gì chúng ta cần phải bao gồm nếu chúng ta sẽ viết một chương trình C? HỌC SINH: Chuẩn I / O. JASON Hirschhorn: stdio.h. Chúng tôi thực sự không cần, cho điều này chương trình, cs50.h, mặc dù nó luôn luôn hữu ích để bao gồm nó. Nhưng chúng tôi luôn luôn cần stdio.h. HỌC SINH: Khi mã hóa trong C? JASON Hirschhorn: Khi mã hóa trong C. Vì vậy, tôi lưu nó như này tập tin c.. Tôi nhận được một số cú pháp tô sáng tốt đẹp. Tôi đã viết khoảng trống bên trong chính. Không khoảng trống có nghĩa là gì? HỌC SINH: Không có bất kỳ đối số dòng lệnh. JASON Hirschhorn: phương tiện Void, trong này trường hợp, chính không có bất kỳ đối số dòng lệnh. Trong trường hợp khác, nó có nghĩa là chức năng không có đối số dòng lệnh. Hoặc chức năng, nếu tôi đã viết khoảng trống main (void), mà có thể nói của chính không trở về bất cứ điều gì. Vì vậy, khoảng trống chỉ có nghĩa là không có gì. Tôi sẽ viết những gì nếu tôi có đối số dòng lệnh? HỌC SINH: int cung c chuỗi cung v JASON Hirschhorn: int argc chuỗi argv. Đúng không? HỌC SINH: Đó là char dấu ngoặc sao argv. JASON Hirschhorn: Vì vậy, bạn có thể viết khung chuỗi argv hoặc char sao argv dấu ngoặc đơn, nhưng bạn cần dấu ngoặc đơn. Vì argv là một mảng các chuỗi, hãy nhớ. Nó không chỉ là một chuỗi. Vì vậy, chuỗi argv là, ở đây ta một chuỗi được gọi là argv. Khung chuỗi argv được, đây là một mảng các chuỗi. Vì vậy, int argc dấu ngoặc chuỗi argv sẽ là một cái gì đó mà tôi có lẽ sẽ viết. Vì vậy, bạn muốn tiết kiệm trong một số nguyên? HỌC SINH: Vâng, số nguyên. Hoặc trong một phao. JASON Hirschhorn: Trong một phao? Như, float x bằng 1 chia cho 10. JASON Hirschhorn: OK. Làm thế nào để in ra một phao trong printf? Những gì? HỌC SINH:% f. JASON Hirschhorn:% f. Một số nguyên là gì? d hoặc tôi. Một chuỗi là những gì? HỌC SINH: s. JASON Hirschhorn: s. Làm thế nào để có được một dòng mới? HỌC SINH: Dấu gạch chéo ngược n. JASON Hirschhorn: Tôi trở lại gì nếu chạy chính một cách chính xác? HỌC SINH: 0. Tôi cần phải viết dòng đó, mặc dù? HỌC SINH: số OK, chúng tôi sẽ không viết nó, sau đó. Tất cả mọi người có thể đọc mà? Nó có vẻ hơi nhỏ. Tất cả mọi người có thể nhìn thấy, hoặc phải Tôi làm cho nó lớn hơn không? Tôi nghĩ rằng cho máy ảnh, chúng tôi sẽ làm cho nó lớn hơn một chút, mặc dù. JASON Hirschhorn: Nếu tôi muốn tắt chức năng này . C tập tin vào một thực thi, những gì để tôi viết? HỌC SINH: Hãy kiểm tra. JASON Hirschhorn: Xin lỗi? HỌC SINH: Hãy kiểm tra. JASON Hirschhorn: Hãy kiểm tra. Chúng tôi đã nói về dòng này trước đó. Kêu vang. Kêu vang là gì? Tên của trình biên dịch. Dòng này là những gì? HỌC SINH: Thiết lập nó lên để sử dụng của GDB. JASON Hirschhorn: Bộ nó cho sử dụng GDB. Dòng này, những gì vậy? HỌC SINH: Source code. JASON Hirschhorn: Đó là tập tin nguồn, các tập tin c.. Làm hai dòng làm gì? Hoặc hai không đường. HỌC SINH: Nó tên nó kiểm tra. JASON Hirschhorn: Vì vậy, các dấu gạch ngang o nói, đặt tên cho nó một cái gì đó khác nhau. Và ở đây bạn đang gọi nó kiểm tra. Nếu tôi không có trong, những gì nó sẽ đặt tên này? HỌC SINH: a.out. JASON Hirschhorn: a.out. Điều này không làm những gì? HỌC SINH: Liên kết các thư viện toán học. JASON Hirschhorn: Nó liên kết trong thư viện toán học. Chúng tôi đã không bao gồm các thư viện toán học, nhưng vì đó là quá phổ biến, họ đã có văn luôn luôn bao gồm các thư viện toán học. Và tương tự, điều này bao gồm thư viện CS50. OK, vì vậy nếu chúng tôi danh sách, chúng ta có một thực thi được gọi là thử nghiệm. Để thực hiện nó, tôi viết bài kiểm tra. Tôi thấy rằng điểm nổi của tôi, như mong đợi, bằng 0. Nào đó - như vậy - HỌC SINH: Sau đó, nếu bạn đặt nổi bây giờ, như bạn dùng nó như phao - JASON Hirschhorn: Diễn viên 1 nổi một? HỌC SINH: Không, bỏ điều đầy đủ - yeah. Nếu bạn chỉ làm điều đó, sẽ mà làm cho nó 0.1? JASON Hirschhorn: OK, vì vậy thực sự nhanh chóng, 1 chia cho 10, những người đang có số nguyên được chia. Vì vậy, khi bạn chia số nguyên, chúng 0, và bạn đang tiết kiệm mà 0 trong một nổi, bởi vì các dấu gạch chéo là chỉ phân chia số nguyên. Vì vậy, bây giờ chúng tôi đang quay một cái gì đó vào một phao. Hãy xem những gì sẽ xảy ra. Chúng tôi sẽ thực hiện kiểm tra. Vì vậy, bây giờ chúng tôi thấy rằng đó là dấu gạch chéo không phân chia số nguyên, nó đã nổi phân chia điểm. Bởi vì một trong những lập luận của mình đã được đúc nổi một. Vì vậy, bây giờ nó đã nói, điều trị này bộ phận như chúng tôi đang làm việc với điểm nổi, không có số nguyên. Và do đó chúng tôi nhận được câu trả lời, chúng tôi mong đợi. Hãy xem những gì sẽ xảy ra - oops. Nếu tôi muốn in số thập phân hơn điểm, làm thế nào tôi có thể làm điều đó? HỌC SINH: điểm chấm f, hoặc như nhiều chữ số thập phân như bạn muốn. JASON Hirschhorn: Vì vậy, tôi in 10 điểm thập phân. Và bây giờ chúng ta thấy chúng ta đang nhận được một số công cụ kỳ lạ. Và đi trở lại câu hỏi của bạn về dấu chấm động không chính xác. Có những thứ kỳ lạ được lưu trữ tại đây. OK, không có trả lời câu hỏi của bạn? Những gì người khác đã làm bạn muốn mã một cách nhanh chóng? HỌC SINH: Tôi chỉ muốn xem có hay không, nếu bạn giải phóng một số con trỏ, liệu con trỏ vẫn đã được lưu trữ trong nó là địa chỉ của những gì nó đã được trỏ đến trước đó. JASON Hirschhorn: OK, vì vậy hãy làm điều đó. Char ptr sao, điều này tạo ra một biến gọi là ptr kiểu char sao. Làm thế nào để tôi viết malloc? Alden? ALDEN: Chỉ cần malloc. Nhưng sau đó nó đã được kích thước của, và trong trường hợp này, tôi đoán bạn muốn được trỏ đến char. Vì vậy, nó muốn được char. JASON Hirschhorn: OK, vì vậy nhiều quát, bên trong - chúng ta hãy chỉnh sửa. Trong malloc, bạn muốn số của byte trên heap. Nói chung, những gì chúng ta đã thấy rằng chúng tôi làm là chúng ta sẽ malloc chuỗi, ví dụ, hoặc mảng các số nguyên. Vì vậy, nếu chúng ta muốn 10 số nguyên, hoặc 10 ký tự, 10 sẽ cho chúng ta 10. Và sau đó kích thước của ký tự sẽ cung cấp cho chúng ta biết rằng kích thước của ký tự, mà trong trường hợp này là 1 byte. Chúng tôi nhận được 10 byte. Nếu chúng ta viết kích thước của int, mà sẽ cung cấp cho chúng tôi 40 byte. Vì vậy, tổng quát hơn, bên trong malloc là số byte mà bạn muốn. Trong trường hợp này, chúng tôi đang nhận được 1 byte. Mà có vẻ như một sử dụng lạ malloc, nhưng đối với chúng tôi mục đích có ý nghĩa. Vì vậy, có đó. Chúng ta sẽ gọi miễn phí. Chúng tôi được thoát khỏi nó và chúng tôi sử dụng ptr một lần nữa. Và những gì đã làm bạn muốn kiểm tra? HỌC SINH: Tôi chỉ muốn kiểm tra xem hoặc không có bất cứ điều gì bên trong của nó. JASON Hirschhorn: Vì vậy, liệu nó chỉ vào bất cứ điều gì? HỌC SINH: Vâng, chính xác, cho dù nó vẫn có một địa chỉ bộ nhớ. JASON Hirschhorn: Vì vậy, bạn muốn kiểm tra giá trị của ptr? HỌC SINH: Vâng, chính xác. JASON Hirschhorn: Tôi viết gì ở đây nếu tôi muốn kiểm tra giá trị của điểm - là những gì, Jordan cho biết, giá trị? Hoặc những gì được lưu trữ bên trong của ptr? HỌC SINH: Một địa chỉ bộ nhớ. JASON Hirschhorn: Một địa chỉ bộ nhớ. Vì vậy, nếu tôi viết chỉ này, nó sẽ cho tôi giá trị của ptr. Và làm thế nào để in ra một địa chỉ bộ nhớ? Chuỗi định dạng là gì cho một địa chỉ bộ nhớ? HỌC SINH:% p. JASON Hirschhorn:% p. % S là một chuỗi. % P cho con trỏ. Đúng không? Điều đó là đúng. Vì vậy, ptr bằng - nó vẫn có một cái gì đó trong nó. Đây có lẽ là một hơn câu hỏi thú vị. Không đường mà làm những gì? HỌC SINH: lỗi Seg. JASON Hirschhorn: Cái gì? HỌC SINH: Tôi nghĩ rằng nó seg lỗi. JASON Hirschhorn: Hm? HỌC SINH: Tôi nghĩ rằng nó sẽ seg lỗi. JASON Hirschhorn: Vì vậy, dòng này mã, sao ptr, những gì không ngôi sao nghĩa là gì? HỌC SINH: Nội dung của. JASON Hirschhorn: Vâng. Đi để có được nội dung của. Vì vậy, đây sẽ đi vào bộ nhớ giải quyết đó và cho tôi đó. Tôi đã sử dụng% c ở đây vì có được nhân vật được lưu trữ ở đó. Vì vậy, chúng ta sẽ đi đến địa chỉ chúng tôi chỉ thấy - hoặc nó có thể sẽ là một chút này khác nhau Hiện chúng tôi chạy chương trình. Nhưng chúng tôi sẽ đi đến địa chỉ đó mà chúng ta biết vẫn còn tồn tại và xem những gì đang có. Vì vậy, nó không seg lỗi. Nó chỉ không cho chúng tôi bất cứ điều gì. Nó có thể đã thực sự cho chúng ta một cái gì đó, chúng ta không thể nhìn thấy nó. Và quay ngược lại ý tưởng này - và chúng tôi sẽ không nhận được quá nhiều vào này, bởi vì nó không nằm trong phạm vi của khóa học này. Nhưng chúng ta đã nói ở đây, nếu chúng ta đã vượt quá giới hạn của mảng bằng 1, chúng tôi có thể không gặp rắc rối. Đôi khi, khi bạn chỉ cần đi ra bằng 1, bạn đang làm sai điều gì, và bạn có thể gặp rắc rối. Nhưng bạn không luôn luôn gặp rắc rối. Nó phụ thuộc bao nhiêu là một điều xấu bạn làm, bạn sẽ gặp rắc rối. Mà không phải là để nói, được cẩu thả với mã của bạn. Nhưng nó là để nói, chương trình sẽ không luôn luôn bỏ thuốc lá, ngay cả khi bạn đi đâu đó bạn không cần đến. Một ví dụ đó là, rất nhiều người trong vấn đề của họ thiết lập 3, là 15, không kiểm tra giới hạn của hội đồng quản trị. Vì vậy, bạn nhìn sang bên trái, nhìn vào bên phải, nhìn lên trên, nhìn để phía dưới. Nhưng bạn đã không kiểm tra để xem nếu đầu đã thực sự sẽ là trên diễn đàn. Và rất nhiều người đã làm điều đó và quay trong chương trình làm việc của họ hoàn hảo, bởi vì nơi đó là hội đồng quản trị được lưu trữ trong bộ nhớ, nếu bạn đã đi một ở trên nó hoặc kiểm tra trí nhớ địa chỉ, không có bất cứ điều gì đặc biệt khủng khiếp về điều đó, chương trình của bạn không sẽ hét vào mặt bạn. Nhưng chúng tôi vẫn sẽ cất cánh nếu điểm bạn đã không kiểm tra, bởi vì bạn đang làm một cái gì đó bạn không phải làm, và bạn có thể có nhận gặp rắc rối. Tỷ lệ cược là, mặc dù, bạn có thể không. Vì vậy, đây là để cho thấy rằng, có, chúng tôi vẫn có thể đi với nó. Và chúng tôi không nhận được trong rắc rối trong trường hợp này. Nếu chúng ta cố gắng làm đọc 100 ký tự tiếp theo, chúng tôi có thể gặp rắc rối. Và bạn có thể mã đọc tiếp theo 100 ký tự nếu bạn muốn bằng cách làm một số loại cho vòng lặp. Yeah. HỌC SINH: Từ khi chúng tôi được chỉ định mà không gian một giá trị thực tế, chúng tôi sẽ không thực sự có thể nhìn thấy bất cứ điều gì. Chúng ta nên thử nó với thiết lập đó bằng như c hay cái gì? JASON Hirschhorn: Great câu hỏi. Làm thế nào để thiết lập giá trị đó - những gì dòng mã để tôi viết trên dòng bảy để làm những gì bạn nói? HỌC SINH: sao ptr bằng đơn quote c kết thúc giá duy nhất. JASON Hirschhorn: Vì vậy, đó là đặt một nhân vật, c, tại địa điểm đó, bởi vì một lần nữa, ngôi sao có nghĩa là đi đến đó. Và khi được sử dụng ở phía bên tay trái của một nhà điều hành phân công, mà bằng đăng ký, chúng tôi sẽ không có được điều đó giá trị quá nhiều như thiết lập giá trị đó. Bây giờ hãy xem những gì xảy ra. Chúng tôi đặt một cái gì đó có và nó đã có. Chúng tôi gọi là miễn phí. Một số công cụ có thể xảy ra trên heap. Vì vậy, nó không còn ở đó nữa. Nhưng một lần nữa, chúng tôi không nhận được gặp khó khăn cho đến đó. Tôi đang làm điều này trong mã để minh họa mà rất nhiều trong số này câu hỏi mà bạn có, họ thực sự thú vị câu trả lời rất nhiều thời gian. Và họ đang câu hỏi thực sự tốt. Và bạn có thể tìm chúng trên riêng nếu bạn, ví dụ, chúng tôi đang không ở trong phần. Yeah. HỌC SINH: Bởi vì bạn không gửi con trỏ bất cứ nơi nào, bạn cần phải sử dụng malloc? JASON Hirschhorn: Vì vậy, đây đi lại cho câu hỏi ban đầu của bạn. [? ?] Là nó chỉ là một biến địa phương? Malloc đây không phải là hấp dẫn. Việc sử dụng malloc đây không phải là mà hấp dẫn bởi vì nó chỉ là một biến địa phương. HỌC SINH: Vì vậy, bạn có thể làm char sao ptr bằng nhỉ? JASON Hirschhorn: Oh. Vì vậy, chúng ta sẽ bây giờ quay trở lại cho câu hỏi ban đầu của bạn. Tôi nghĩ rằng bạn không hài lòng với câu trả lời của tôi. OK? Như thế? HỌC SINH: Vâng. Chờ đợi. JASON Hirschhorn: Và nơi Bạn muốn in ra? Vì vậy, chúng tôi sẽ in ra một chuỗi như thế? HỌC SINH: Thú vị. JASON Hirschhorn: Vì vậy, đây nói này tham số có kiểu của một nhân vật. Vì vậy, đây phải là một nhân vật. HỌC SINH: Chỉ cần có một trong những đầu tiên. JASON Hirschhorn: Vì vậy, đây là những gì tôi đã nói. Như tôi đã nói, nó không lưu trữ chuỗi bên trong con trỏ biến. Nó lưu trữ - HỌC SINH: Giá trị đầu tiên của chuỗi. JASON Hirschhorn: Địa chỉ của giá trị đầu tiên của chuỗi. Nếu chúng ta in ra này, chúng tôi nhận được giá trị bên trong con trỏ. Và chúng ta sẽ thấy nó là, thực sự, một địa chỉ bộ nhớ. Điều đó có ý nghĩa? Xin lôi. Chờ đợi, không có trả lời của bạn câu hỏi, mặc dù? HỌC SINH: Vâng. JASON Hirschhorn: dòng mã này là tạo ra một chuỗi và sau đó một con trỏ biến trỏ để chuỗi, mảng đó. Yeah. HỌC SINH: Vì vậy, nếu chúng tôi đã đi một bộ nhớ giải quyết hơn nữa, chúng ta sẽ nhận được h? Nó đã được lưu trữ như là một chuỗi? JASON Hirschhorn: Giống như, chúng tôi đã làm - vì vậy đây là có giá trị để làm. Đây là điểm số học, mà các bạn đã thấy trước và phải được tương đối thoải mái. Điều này cũng giống như viết - nếu chúng ta viết dòng mã này, chúng tôi đã nhìn thấy ký hiệu mảng trước. Điều này sẽ cho chúng ta thứ hai giá trị trong mảng này, h. Nếu chúng ta đã làm điều này, điều này cũng sẽ cung cấp cho chúng tôi giá trị thứ hai trong mảng đó. Bởi vì nó sẽ không vào bộ nhớ địa chỉ của điều đầu tiên, nhưng các địa chỉ bộ nhớ của một điều hơn. Và sau đó là dereferences điều hành sao rằng con trỏ. Và một lần nữa, chúng ta hãy xem. Chúng tôi nhận được h một lần nữa. HỌC SINH: Chính xác là gì dereference nghĩa là gì? JASON Hirschhorn: tham chiếu đến là một từ ưa thích cho đi. Đi đến đó và nhận được những gì đang có là dereference một con trỏ. Nó chỉ là một từ ưa thích cho điều đó. HỌC SINH: Nếu chúng ta muốn in toàn bộ chuỗi, có thể chúng tôi làm con trỏ ký hiệu? JASON Hirschhorn: OK, chúng tôi sẽ tạm dừng ở đây. Chúng ta sẽ kết thúc ở đây. Ký hiệu cung cấp cho bạn địa chỉ của một vị trí, vì vậy khi bạn làm ký hiệu của một biến, nó sẽ cho bạn địa chỉ nơi biến được lưu trữ. Con trỏ ký hiệu sẽ cung cấp cho bạn địa chỉ của ptr nơi ptr là trong bộ nhớ. Chúng tôi sẽ không đi vào với ví dụ này. Bạn có thể tìm ra những những việc riêng của bạn. Nhưng một lần nữa, điều này có thể thậm chí được gần gần một bit xa hơn những gì bạn cần phải biết phạm vi này giữa kỳ - hoặc bài kiểm tra này, chứ không phải. Xin lôi. Chúng tôi sẽ tiếp tục, bởi vì tôi sẽ muốn làm một mã hóa vấn đề trước khi thời gian là lên. Và chúng tôi đang đi vào mã những gì tôi nghĩ là hấp dẫn nhất của các ví dụ, atoi. Vì vậy, đây là một câu hỏi về một bài kiểm tra hai năm trước đây. Và tôi có nó trên diễn đàn đây. Người đã hỏi về các bài kiểm tra - họ được tesxt nhiều hơn một chút trong các câu hỏi, nhưng tôi đã loại bỏ văn bản vì nó là không cần thiết cho các mục đích của chúng tôi bây giờ. Đó chỉ là một số nền tảng về những gì đã làm atoi. Nhưng tất cả các bạn biết và rất quen thuộc với atoi. Tôi đề nghị bạn mã này trên một tờ giấy. Tôi cũng đề nghị bạn sử dụng chiến lược mà chúng tôi đã đi qua rất nhiều trong phần của chúng tôi. Trước tiên, hãy chắc chắn rằng bạn hiểu những gì atoi của làm. Vẽ một bức tranh hoặc đến với một số hình ảnh tinh thần của nó trong đầu của bạn. Tiếp theo, viết ra giả cho việc này. Trên các bài kiểm tra, nếu tất cả các bạn nhận được là giả, ít nhất bạn đặt một cái gì đó xuống. Và sau đó bản đồ giả mà lên C. Nếu bạn có một kiểm tra trong của bạn giả, như kiểm tra xem một cái gì đó là 1, mà các bản đồ vào một nếu điều kiện và vv. Và cuối cùng, mã chương trình trong C. Vì vậy, trở lại atoi và mất năm phút mã này trên một tờ giấy, mà có lẽ là về số lượng thời gian bạn sẽ đi trên một đố để atoi mã. Năm đến 15 phút, năm 12, năm tới 10 phút, là về số lượng thời gian bạn muốn chi tiêu này câu hỏi trong bài kiểm tra. Vì vậy, mất năm phút bây giờ, xin vui lòng. Và nếu bạn có bất kỳ câu hỏi, nâng cao bàn tay của bạn và tôi sẽ đi xung quanh. [Đàm thoại SIDE] JASON Hirschhorn: OK, vì vậy đó là năm phút. Đó có lẽ là về số lượng thời gian bạn muốn chi tiêu trên mà trên một bài kiểm tra, có thể kết thúc thấp thời điểm đó. Chúng tôi sẽ tóm tắt lại trong một chút. Chúng ta hãy bắt đầu viết mã này. Và nếu chúng ta không có được tất cả các cách thức thông qua, câu trả lời cho điều này và điều này câu hỏi bài kiểm tra có sẵn, một lần nữa, Mùa thu năm 2011 là khi câu hỏi này xuất hiện trên các bài kiểm tra. Và nó là giá trị tám điểm trên các bài kiểm tra sau đó. Tám điểm là trên cao, kết thúc của số lượng các điểm một cái gì đó có giá trị. Hầu hết các câu hỏi trong phạm vi của 1-6 điểm. Vì vậy, đây là một khó khăn hơn câu hỏi, chắc chắn. Ai cũng có thể cho tôi bắt đầu? Nói chung, những gì chúng ta đang đi muốn làm với điều này chức năng atoi, hợp lý? Những gì chúng ta muốn làm gì? Vì vậy, chúng ta sẽ viết một số giả. HỌC SINH: Chuyển đổi ký tự vào số nguyên. JASON Hirschhorn: Chuyển đổi ký tự vào số nguyên. OK. Vì vậy, có bao nhiêu nhân vật chúng tôi sẽ cần phải đi qua? HỌC SINH: Tất cả trong số họ. HỌC SINH: Tất cả các nhân vật trong chuỗi. JASON Hirschhorn: Tất cả các ký tự trong chuỗi. Vì vậy, nếu chúng tôi muốn đi qua tất cả nhân vật trong một chuỗi, một điều là những gì trong C, chúng tôi đã nhìn thấy rằng đã cho phép chúng tôi phải đi qua tất cả các nhân vật trong một chuỗi? SINH VIÊN: Một vòng lặp. JASON Hirschhorn: Một vòng lặp. Vì vậy, chúng ta sẽ lặp qua mỗi nhân vật trong s. Sau đó, những gì chúng ta sẽ muốn làm khi chúng ta có được một nhân vật cụ thể? Nói rằng chúng tôi đang nhận được thông qua 90. Chúng tôi nhận được 9. Đó là một nhân vật. Những gì chúng tôi muốn làm gì với nhân vật 9? HỌC SINH: Trừ từ nhân vật 0? HỌC SINH: Thêm 0? JASON Hirschhorn: Trừ từ nhân vật 0? HỌC SINH: Vâng. JASON Hirschhorn: Tại sao bạn muốn làm điều đó? HỌC SINH: [nghe được] giá trị. Giá trị int của nó. JASON Hirschhorn: OK, vì vậy chúng ta lấy nhân vật 9, trừ nó từ nhân vật 0 để có được một thực tế số nguyên 9. Ngọt ngào. Và làm thế nào để bạn biết nhân vật đó 9 trừ đi 0 nhân vật là 9? Biểu đồ những gì bạn đã nhìn vào? HỌC SINH: Có hợp lý chín nơi từ 9 đến 0. Hoặc bạn có thể nhìn vào bảng ASCII. JASON Hirschhorn: bảng mã ASCII. Nhưng có, bạn đã đúng là tốt. Vì vậy, chúng ta trừ đi 0. Vì vậy, bây giờ chúng tôi có số nguyên 9. Và làm những gì chúng tôi muốn làm với điều đó? Nếu chúng ta có 90, đó là số nguyên đầu tiên chúng tôi đã, những gì chúng ta muốn làm gì? HỌC SINH: Tôi muốn đưa vào một số nguyên tạm thời mảng, sau đó làm toán với nó sau đó để làm cho nó vào một kết thúc. JASON Hirschhorn: OK. HỌC SINH: Bạn có thể bắt đầu vào cuối năm mảng và sau đó di chuyển về phía trước để rằng mỗi khi bạn di chuyển về phía trước, bạn nhân nó bằng 10. JASON Hirschhorn: OK. Nghe có vẻ giống như một khá ý tưởng hấp dẫn. Chúng ta có thể bắt đầu vào cuối mảng của chúng tôi, và chúng ta có thể sử dụng strleng. Chúng ta có thể sử dụng strleng ở đây. Chúng tôi sẽ có được chiều dài của chuỗi của chúng tôi. Chúng tôi bắt đầu từ kết thúc. Và + đầu tiên, chúng tôi chỉ đi mà số nguyên, và có lẽ chúng ta tạo ra như một biến số nguyên mới lên hàng đầu nơi chúng tôi đang lưu trữ tất cả mọi thứ. Vì vậy, chúng ta lặp qua tất cả các char trong s từ trở lại phía trước, chúng ta trừ 0, và sau đó chúng tôi mang nó, và tùy thuộc vào nó ở đâu, chúng ta nhân nó bởi một sức mạnh của 10. Bởi vì một trong những đầu tiên, những gì chúng tôi nhân vật ngoài cùng bên phải của? HỌC SINH: 10 đến 0. JASON Hirschhorn: 10 đến 0. Những gì chúng ta nhân thứ hai nhân vật ngoài cùng bên phải của? HỌC SINH: [nghe được]. JASON Hirschhorn: Cái gì? HỌC SINH: 10 đến 1. JASON Hirschhorn: 10 đến 1. Các ký tự bên phải thứ ba? HỌC SINH: 10 đến 2. JASON Hirschhorn: 10 đến 2. HỌC SINH: Xin lỗi, tôi không hiểu những gì chúng ta đang làm ở đây. JASON Hirschhorn: OK, chúng ta hãy quay trở lại, sau đó. Vì vậy, chúng tôi sẽ nhận được thông qua trong một chuỗi. Bởi vì chúng tôi đang viết atoi. Vì vậy, chúng tôi nhận được thông qua trong một chuỗi. Nói rằng chúng tôi đang nhận được thông qua trong chuỗi 90. Điều đầu tiên chúng ta sẽ làm là thiết lập một biến số nguyên mới mà chúng tôi chỉ cần đi để tạo ra là số nguyên mới của chúng tôi. Đó là những gì chúng ta sẽ trở lại ở cuối. Chúng tôi cần phải đi qua tất cả các nhân vật trong chuỗi bởi vì chúng tôi đã xác định rằng chúng ta cần phải chạm vào mỗi một và sau đó thêm nó vào nguyên mới của chúng tôi. Nhưng chúng ta không thể chỉ cần thêm nó như là một số. Chúng ta không thể chỉ mất 9 và thêm 9 đến số nguyên của chúng tôi. Nó phụ thuộc vào những gì diễn ra nó đang ở trong chuỗi. Chúng ta sẽ cần phải nhân nó bằng một sức mạnh của 10. Vì đó là cách cơ bản 10 công trình. Vì vậy, chúng ta sẽ nhận được thực tế nhân vật hoặc các số nguyên thực tế số, bằng cách trừ nhân vật 0 từ nhân vật 9 như chúng tôi đã làm với trừ vốn ký tự A từ bất kỳ nhân vật chúng tôi đã có trong một trong những vấn đề. Vì vậy, chúng tôi sẽ thực sự có được một số từ 0 đến 9 lưu như một số thực, và chúng tôi sẽ nhân với một sức mạnh của 10 phụ thuộc vào nơi chúng tôi đang trong chuỗi. Và sau đó chúng ta sẽ thêm nó trở lại vào biến số nguyên mới của chúng tôi. Vì vậy, điều này sẽ như thế nào sẽ được - chúng ta sẽ rút ra ở đây. Nếu chúng ta có được thông qua trong chuỗi 90 - HỌC SINH: [nghe được]. JASON Hirschhorn: Nhưng atoi mất một chuỗi. Vì vậy, chúng ta sẽ đi qua việc tổ chức. Chúng tôi sẽ có được thông qua trong 90. Chúng tôi đi từ phía sau ra phía trước. Chúng ta lấy 0. HỌC SINH: Tôi xin lỗi. Có lẽ đây là ngu ngốc. Nếu chúng ta nhận được thông qua trong một chuỗi, tại sao là 90 điều chúng ta nhận được thông qua trong? Vì 90 là một số nguyên. JASON Hirschhorn: Bởi vì atoi mất chuỗi và biến nó thành số nguyên đại diện của chuỗi. Nhưng chuỗi 90 không phải là số nguyên 90 hoặc 90 số. Chuỗi 90 là một mảng của hai hoặc ba nhân vật, chứ không phải, 9 nhân vật, nhân vật 0, và các dấu gạch chéo ngược 0 ký tự. Và chúng tôi đang viết atoi bởi vì, cho Ví dụ, khi bạn thực hiện lệnh đối số dòng, và nó sẽ được lưu trong argv, nó sẽ được lưu như một chuỗi. Nhưng nếu bạn muốn xử lý nó như một số, bạn cần phải chuyển đổi nó vào một nguyên thực tế. Mà chúng tôi đã làm một bộ vấn đề của chúng tôi. Mà chúng tôi đã làm trong một số bộ vấn đề của chúng tôi. Tất cả mọi người mà mất một số nguyên như là một đối số dòng lệnh. Vì vậy, đó là lý do tại sao chức năng atoi của chúng tôi phải mất một chuỗi. Vì vậy, một lần nữa, trong ví dụ của chúng tôi ở đây, chúng tôi sẽ mất người cuối cùng. Chúng ta sẽ trừ nhân vật 0 từ nó, bởi vì các ký tự 0 trừ đi các nhân vật 0 cung cấp cho bạn con số thực tế 0, theo toán học ASCII mà chúng ta làm. Bởi vì nhân vật được biểu diễn như là khác với thực tế của họ - nhân vật một, ví dụ, chữ thường một là 97. Nó không phải là - oops! Nó không phải bất cứ điều gì bạn mong đợi nó được, 0, ví dụ. Vì vậy, bạn phải trừ đi nhân vật một để có được 0. Vì vậy, chúng ta sẽ làm điều đó đây để có được con số thực tế. Và sau đó chúng ta sẽ nhân với một sức mạnh của 10 tùy thuộc vào nơi nó là trong chuỗi, và sau đó đi mà và thêm nó vào giữ chỗ của chúng tôi biến vì vậy chúng tôi có thể đến với nguyên mới của chúng ta. Điều đó có ý nghĩa với tất cả mọi người? Vì vậy, chúng tôi sẽ không để mã này ngay bây giờ, vì chúng tôi nhận được nhiều thời gian. Tôi xin lỗi vì thời gian đó. Nhưng đây là những gì, hy vọng, bạn sẽ có thể làm trên các bài kiểm tra - ở Ít nhất, có được giả này viết ra. Và sau đó, nếu chúng ta viết giả, trên thực tế, chúng ta có thể làm điều này khá nhanh chóng. Mỗi dòng ý kiến ​​chúng tôi, chúng tôi đã viết đây dịch để về một dòng mã C. Khai báo một biến mới, bằng văn bản một vòng, một số trừ, một số nhân, và một số nhiệm vụ. Chúng tôi có lẽ cũng muốn viết một dòng trở lại. Chúng tôi cũng có thể muốn đặt một số kiểm tra ở đây. Yeah. HỌC SINH: Vì vậy, chúng ta có thể điều trị s là chuỗi thực tế? Bởi vì tôi biết nó chỉ là một địa chỉ. Như, làm thế nào bạn sẽ nhận được chiều dài của chuỗi được thông qua thông qua? JASON Hirschhorn: Vậy làm thế nào đã làm chiều dài của một chuỗi? Strlen. HỌC SINH: strlen, yeah. Nhưng bạn có thể đặt làm các Lập luận cho rằng? JASON Hirschhorn: Vì vậy, strlen có một ngôi sao char. Và nó sau đó sao char, và nó giữ đếm cho đến khi nó được đến một dấu gạch chéo ngược 0. strlen đã thực sự một trong những chương trình khác mà chúng tôi đã đi vào mã. Đó là một trong những tốt để mã. Một trong đó là một chút dễ dàng hơn, bởi vì nếu bạn sẽ nghĩ về điều đó khái niệm - Tôi chỉ nói ra - strlen sau một con trỏ và giữ đi và đếm và theo dõi cho đến khi bạn đạt đến một dấu gạch chéo ngược 0. HỌC SINH: OK, đã nhận nó. JASON Hirschhorn: Vì vậy, tốt nhất may mắn trên bài kiểm tra 0 vào ngày mai. Nếu bạn có bất kỳ câu hỏi, tôi sẽ được bên ngoài sau này. Cảm thấy tự do để gửi email cho tôi. Tiếp cận với TF của riêng bạn nếu bạn không trong phần của tôi, hoặc có được của tôi email nếu bạn muốn nó. Nếu bạn muốn freak ra và chỉ cần gửi cho tôi một email, một email freakout, tôi sẽ gửi cho bạn trở lại, như một khuôn mặt cười, hoặc, như một trò đùa hoặc một cái gì đó. Vì vậy, cảm thấy tự do để làm điều đó là tốt. Chúc may mắn một lần nữa, và tôi sẽ xem tất cả các bạn vào tuần tới.