>> [MUSIC CHƠI]
>> Davin: Tất cả các bên phải, guys.
Vì vậy, đây là việc xem xét cho các bài kiểm tra đầu tiên.
Là tất cả mọi người đã sẵn sàng cho các bài kiểm tra vào ngày thứ tư?
ALLISON: Woo!
HỌC SINH: Woo!
Davin: Yeah.
ALLISON: Yeah!
Davin: Đó là của anh chàng sẵn sàng.
Anh chàng, hai tay, tốt đẹp.
Vì vậy, xem xét bài kiểm tra ngày hôm nay, nó sẽ là khoảng một giờ rưỡi.
Chúng tôi sẽ đi qua tất cả các chính khái niệm bạn nên biết cho các bài kiểm tra.
Chúng ta sẽ đi qua một số mã hóa bằng ví dụ tay, đó là trên tất cả các bài kiểm tra.
Và nếu bạn có câu hỏi, cảm thấy tự do để nâng cao tay của bạn và tất cả mọi thứ
như thế.
Vâng, hậu cần về các bài kiểm tra đang online.
Vì vậy, chúng ta sẽ chia người lên vào các phòng khác nhau.
Nó dựa trên tên của họ.
Vì vậy, nếu bạn có bất kỳ câu hỏi về nơi để đi hoặc về những gì là vật chất, giống như,
từ chính thức về những gì đang xảy để được vào các bài kiểm tra, kiểm tra trực tuyến.
Và đó là tất cả đến nay.
Vì vậy, nếu không có các câu hỏi để bắt đầu, chúng ta sẽ bắt đầu.
Và đây là Allison.
>> [Vỗ tay]
>> ALLISON: OK, cảm ơn, Rob.
Đánh giá cao nó.
Davin nên đã lật sang này.
Đây là danh sách không đầy đủ chủ đề, như mọi khi, như Davin vừa nói.
Tham khảo tài liệu trực tuyến về bài kiểm tra không.
Nhưng điều này là khá much-- nó trên các giáo trình
là tất cả mọi thứ chúng tôi đã đi qua cho đến nay.
Tất cả mọi thứ ở đây là trò chơi công bằng, cũng như bất cứ điều gì khác
có thể đã được đề cập trong bài giảng.
>> Phần tôi, ở đây, là chỉ cần rất nhiều đánh giá.
Có một vài bài tập rằng các bạn có thể làm việc trên.
Nhưng đối với hầu hết các phần, chúng tôi thực sự muốn để có được Davin với những người đang
các bài tập tay.
>> Vì vậy, tôi sẽ bay qua này.
Nếu bạn có bất kỳ câu hỏi, dừng lại cho tôi.
Nâng cao tay của bạn.
Tôi hứa tôi có lẽ sẽ nhìn thấy bạn.
Nếu không, chỉ cần vẫy nó xung quanh.
Tôi sẽ nói chuyện nhanh chóng.
Tôi hy vọng tất cả mọi người là OK với điều đó.
>> OK, từ đặc biệt, Davin rõ ràng quên lướt qua các slide.
[Cười] Bạn đang gặp rắc rối, người đàn ông.
Vì vậy, lời khuyên cho bài kiểm tra không, thực hành mã hóa trên giấy.
Các bạn sẽ nhận được một số thực hành với điều đó ngay bây giờ với Davin,
vì vậy bạn sẽ không được hoàn toàn của chính mình.
Tôi nghĩ rằng chúng tôi đang thực sự đi thông qua hai chức năng.
Vì vậy, bạn sẽ được chuẩn bị tốt ở đó.
>> Hãy làm quen với bộ vấn đề của bạn.
Đã có câu hỏi về câu đố trước
mà sẽ yêu cầu bạn, ví dụ, để mã hóa một cái gì đó rất giống với Mario.
Vì vậy, là rất quen thuộc với vấn đề của bạn đặt ra, cũng
là những câu hỏi chúng tôi yêu cầu bạn trong đầu về hình thức
mà bạn điền vào, sẽ phục vụ bạn rất tốt.
>> Làm một bài kiểm tra trước đó dưới những hạn chế thời gian.
Những câu đố dài.
Thời gian đi rất nhanh.
Và thường xuyên, bạn không nhận ra như thế nào nhanh nó đi cho đến khi bạn thực sự
đặt mình dưới những ràng buộc.
Vì vậy, nếu bạn chỉ có thể cắt ra, bạn đã biết, 75 phút thi đấu, hoặc là tối nay hoặc ngày mai
để có một trong những câu đố dưới đó, bạn sẽ có trong hình dạng tốt hơn nhiều.
>> Và cũng có thể, tạo ra tờ tài liệu tham khảo của bạn.
Hãy nhớ rằng, bạn sẽ có được một trước trang và trở lại
như tài liệu tham khảo cho bài kiểm tra của bạn vào ngày thứ Tư.
Tạo đó là một cách tuyệt vời để học tập.
Bất cứ điều gì mà bạn đang gặp sự cố với bạn muốn bao gồm trong đó.
Bất cứ điều gì TF của bạn có được, như thế, điều này thực sự quan trọng.
Bạn nên biết điều này, là có lẽ những điều bạn có trong đó
nếu bạn không có họ nhớ.
Thậm chí nếu bạn biết họ thực sự tốt, đôi khi có nó trên có
chỉ là loại thoải mái cho bạn, mà tôi biết câu đố rất căng thẳng.
Vì vậy, bất cứ thoải mái mà bạn nhận được có thể giúp đỡ.
Tất cả các bên phải, cũng, có được giấc ngủ và ăn và thích những điều bình thường
mà chúng tôi cho bạn biết câu đố.
>> Vì vậy, bắt đầu ra dễ dàng, các kiểu dữ liệu và kích cỡ.
Như tôi đã nói, điều này là chỉ cần đi được tôi ném rất nhiều thứ
lên đây mà bạn nên biết.
Vì vậy, chúng tôi có ký tự của chúng tôi đó là một byte, ints
đó là bốn byte, dài dài, trong đó có tám byte.
Về cơ bản, nó chỉ là bạn muốn giữ số nguyên lớn hơn.
Floats, mà là bốn, tăng gấp đôi, trong đó có tám.
Một lần nữa, chỉ cần cung cấp cho bạn nhiều hơn không gian cho các phao nổi của bạn.
Và sau đó gõ sao, vì vậy bất kỳ con trỏ trên một máy tính 32-bit,
mà là tất cả các bạn cần cho biết, là bốn byte.
>> Vì vậy, tất cả những điều bạn cần biết, có thể điều
bạn muốn có trên tờ tài liệu tham khảo của bạn.
OK, chuyển đổi nhị phân nhị phân, chuyển đổi
để hệ thập lục phân, qua lại, tất cả những điều bạn nên biết.
Vì vậy, từ nhị phân sang thập phân.
Các bạn muốn lấy một phút nhanh chóng và cố gắng tìm ra từng
và sau đó nói cho tôi biết họ là ai?
>> Tôi cũng có kẹo trong túi của tôi, vì vậy bất cứ ai người trả lời được kẹo, bằng cách này.
Và tôi có rất nhiều của nó.
Hãy để tôi lấy này.
Tôi sẽ đưa cái này cho Gabe.
Vì vậy, bạn có thể trao kẹo cho ai là tốt đẹp và hợp tác xã.
>> OK, tôi nhìn thấy một bàn tay có ở phía sau.
>> HỌC SINH: Yeah, một trong những đầu tiên là 42.
>> ALLISON: Vâng, đầu tiên là 42, chính xác.
HỌC SINH: [không nghe được].
[Cười]
ALLISON: Thứ hai một, có trở lại trong màu vàng?
HỌC SINH: 110.010.
ALLISON: Đúng, và điều này cuối cùng, xuống đây ở phía dưới?
Ngoài ra, yeah, bạn muốn biết?
Chỉ cần tung ra kẹo.
Làm thế nào về kẹo cho tất cả mọi người?
>> HỌC SINH: [không nghe được] khi chúng ta đang thực hiện.
>> ALLISON: Shh.
Và sau đó là người cuối cùng.
Ai muốn trả lời?
Ngay ở đó.
>> HỌC SINH: 11.100.
>> ALLISON: 11100, nhìn vào đó.
Xin chúc mừng, công việc tuyệt vời, tất cả mọi người.
OK, tất cả mọi người loại hiểu quá trình để làm điều này?
Bạn đã, đi từ nhị phân sang thập phân cách tôi có xu hướng để làm điều đó, được viết ra
các quyền hạn của 2.
Vì vậy, tôi nói, OK, 0 lần 2-0, vì vậy đó là 0, 1 lần 2 đến đầu tiên,
là 2 trở đi sẽ theo cách đó.
Có ai muốn tôi một cách rõ ràng đi qua một ví dụ về nhị phân?
OK, mát mẻ.
>> Số thập phân sang nhị phân là rất giống nhau.
Tôi có xu hướng để viết ra các quyền hạn của 2.
Bắt đầu với một trong đó là lớn nhất, nhưng không đi qua các số thập phân
mà bạn đang tìm kiếm.
Và sau đó loại làm việc theo cách của bạn ngược thêm những thứ cần thiết.
>> Và sau đó với Ngoài ra, nó Ngoài ra giống như bình thường.
Nếu bạn đã từng có trường hợp bạn thêm hai 1s, nó rõ ràng là trở thành 2.
2 trong hệ nhị phân tại là 1 0 vì vậy bạn cần để thực hiện 1 của bạn vào các cột tiếp theo.
Cool.
>> Hệ thập lục phân, điều này có thể là một cái gì đó đó là hơi ít quen thuộc.
Vì vậy, như Rob chỉ nói với tôi trước, lừa ông này
là chỉ cần tách nó ra thành bốn khối byte, OK?
Bit, xin lỗi.
Xem?
Cảm ơn Rob.
Đây là lý do tại sao bạn đang ở đây. [Tiếng ồn] OK, vì vậy chúng tôi chỉ phá vỡ nó lên
thành bốn bit khối.
Vì vậy, với những chương trình để hệ thập lục phân, chúng ta nhìn vào đầu tiên 4,
đó là nếu chúng tôi có bốn 1s trong một hàng, những gì số lượng không tượng trưng?
>> HỌC SINH: F.
>> ALLISON: Vì vậy, trong trường hợp này, 11111111 or-- có là gì?
HỌC SINH: FF.
ALLISON: Perfect, FF.
Vì vậy, tuyệt vời, kẹo cho bạn.
Bây giờ, để làm thế nào hệ thập lục phân thành dạng nhị phân, chúng tôi chỉ nghĩ về nó loại ngược lại.
Đối với mỗi số hoặc chữ cái đó chúng tôi có trong hệ thập lục phân của chúng tôi,
chỉ chuyển đổi nó thành bốn bit của nó [Cười] để chuyển đổi bốn bit của nó.
Vì vậy, 5, trong trường hợp này, là những gì nếu 5 chúng tôi đang đại diện cho nó với bốn bit?
>> HỌC SINH: 010?
Mm-hm.
Và sau đó A, đó là 10 thực sự, sẽ là gì?
1010.
Vì vậy, chúng tôi có điều đó, ở đây.
Vì vậy, chuyển đổi giữa các hệ thập lục phân và nhị phân thực sự không phải là xấu.
Nếu bạn nhìn vào nó trong bốn bit khối, sẽ được vàng.
Everyone-- có?
>> ROB: Đây là ngớ ngẩn, nhưng tôi luôn luôn nhớ
A, từ A cho là 10.
Và nhị phân chỉ là 10 10, so--
>> ALLISON: Ah, có chúng tôi đi.
>> ROB: Hey.
>> ALLISON: Hey, kẹo cho Rob.
Có những thứ không sô cô la trong đó.
Vì vậy, bạn có thể có một số.
Vì vậy, toán học ASCII.
Cư xử.
Vì vậy, toán học ASCII, như các bạn có lẽ cũng nhớ
p set 2 với VISIONEER và Caesar, bạn đã làm rất nhiều về điều này.
Hãy nhớ rằng, các nhân vật về cơ bản chỉ là con số.
Vì vậy, chúng ta có thể làm toán với họ, giống như chúng ta làm toán với ints.
>> Vì vậy, chúng tôi có chỉ là một chút điều đơn giản ở đây.
Chúng tôi có một số trong đó là A khởi tạo đến 65 tuổi.
Và B bằng giá trị ASCII của A cộng với 1, char C bằng D trừ đi 1,
và char D bằng 68.
Vì vậy, sau đó chúng ta sẽ in tất cả trong số họ, như chúng ta thấy ở đây.
Và bất cứ ai có thể cho tôi biết điều này sẽ in ra?
HỌC SINH: [không nghe được].
ALLISON: Chính xác, vì vậy một điều cần ghi nhận là
mà chúng tôi đang in ra nhân vật từng thời gian, ở đây.
Chúng tôi được chỉ định mặc dù A và B là ints khi chúng ta tuyên bố chúng ở trên.
Chúng tôi đang in chúng như các ký tự bằng tỷ lệ phần trăm C và tuyên bố printf của chúng tôi,
do đó họ sẽ in tất cả như ký tự.
Và tất nhiên, giá trị ASCII 65 ý in như A. Các giá trị ASCII của A cộng với 1
sẽ là 66, mà sẽ tự hào B. Vì vậy, trong thực tế, chúng tôi
được A B C D. Mọi người đều tốt ở đó?
Bất kỳ câu hỏi?
Tuyệt vời.
>> OK, phạm vi.
Vì vậy, phạm vi rõ ràng là một rất điều quan trọng để hiểu, ở đây.
Rất nhiều bạn, nếu bạn có lỗi biên dịch,
và nói rằng bạn không có truy cập vào một số biến,
nó có thể là bởi vì bạn định nghĩa nó trong một vòng lặp
và sau đó cố gắng truy cập vào nó ra khỏi nó, hoặc ngược lại.
>> Vì vậy, phạm vi cốt lõi của nó, nó chỉ xác định nơi
chúng ta nói một biến tồn tại, nơi chúng tôi có thể thay đổi nó, nơi mà chúng ta có thể truy cập nó.
Nó chỉ là loại nói đây là những nơi duy nhất mà bạn có thể truy cập
để biến này.
>> Vì vậy, hai lĩnh vực mà chúng ta nói về trong lớp học là toàn cầu và địa phương.
Vì vậy, các biến toàn cầu chúng ta nói về khi bạn đang định nghĩa chúng trên chính.
Nó có nghĩa là toàn bộ của bạn chương trình có thể truy cập vào nó,
và nó tồn tại càng lâu như chương trình chạy, OK?
Địa phương có nghĩa là nó hơn giới hạn trong một khu vực.
Vì vậy, bất cứ khi nào bạn có chức năng cụ thể như trao đổi, chúng tôi luôn luôn nói về.
Chúng tôi luôn luôn nói về trao đổi với A và B. A và B tồn tại trong chức năng đó.
Họ không tồn tại bất cứ nơi nào khác.
>> Cũng như vậy, khi bạn có nếu báo cáo hoặc cho các vòng.
Bất cứ khi nào chúng ta có, ví dụ, trong một vòng lặp chúng ta có int tôi bằng 0.
Chúng tôi có một số điều kiện và chúng tôi cập nhật nó.
Tôi chỉ tồn tại trong niềng răng đó cho vòng lặp.
Nếu bạn cố gắng để truy cập nó ở nơi khác, biên dịch của bạn sẽ hét lên với bạn.
Nó muốn được như thế, những gì bạn đang cố gắng để làm gì?
Điều này không tồn tại.
Vì vậy, đó là hai loại khác nhau của phạm vi.
Điều đó có ý nghĩa với tất cả mọi người?
>> Vì vậy, ví dụ ở đây, điều này chỉ là một số chương trình đơn giản.
Những gì bạn nghĩ là sẽ xảy ra tại mỗi điểm
mà chúng ta cố gắng để in?
Vì vậy, một ở đây, những gì sẽ xảy ra?
HỌC SINH: Nó sẽ in ba.
ALLISON: Đúng vậy.
Nó sẽ in ba.
Còn ở đây?
HỌC SINH: Nó sẽ không làm việc.
ALLISON: Nó sẽ không làm việc.
Bạn ra khỏi phạm vi, phải không?
Biến cục bộ không tồn tại ngoài các dấu ngoặc, tất cả phải không?
Và sau đó những gì về đây?
>> HỌC SINH: [không nghe được].
>> ALLISON: Cái gì?
Rob, đi.
>> ROB: tôi vừa nói.
Biến toàn cầu nên gạch biến toàn cầu.
>> ALLISON: Ah, vâng, xin lỗi.
Cảm ơn, Rob.
Rob như trình biên dịch thường trú của chúng tôi.
Ông sẽ chỉ hét lên với chúng ta khi chúng ta cần nó. [Cười] Vâng, đó
nên biến gạch toàn cầu.
Vì vậy, giả định rằng là gạch toàn cầu
biến, những gì sẽ xảy ra đây?
HỌC SINH: Điều đó sẽ làm việc.
ALLISON: Nó sẽ làm việc.
Vì vậy, nó sẽ in, vì vậy chỉ cần một ví dụ rất đơn giản.
OK, nguyên mẫu.
Vì vậy, rõ ràng, chúng tôi thực sự nhấn mạnh cho các bạn
để thực hiện chức năng nếu nó có ý nghĩa trong chương trình của bạn.
Nhưng tất nhiên, khi bạn thực hiện chức năng của riêng bạn,
thường bạn sẽ xác định họ sau khi chính.
Và bạn sẽ cố gắng để gọi cho họ trong chính.
Và nếu bạn không sử dụng một nguyên mẫu, biên dịch của bạn sẽ mắng bạn.
>> Prototype là cơ bản chỉ nói với trình biên dịch của bạn
mà tôi có chức năng này dưới chính.
Tôi sẽ gọi nó là trước khi tôi định nghĩa nó.
Chỉ cần giữ chặt.
Tôi hứa rằng nó được định nghĩa, và bạn sẽ có tất cả mọi thứ mà bạn cần.
>> Vì vậy, cách chúng tôi làm điều đó chỉ là sự trở lại của bạn loại, tên chức năng của bạn, đầu vào của bạn
danh sách.
Đó là cơ bản dòng đầu tiên khai chức năng của bạn.
Đó thực sự là tất cả nó được.
Nhưng điều này chỉ là một là loại chung của định dạng.
>> Vì vậy, trong ví dụ của chúng tôi ở đây, mà các bạn nên
đã thấy trong phần tại một số điểm, chúng tôi có
một số int cube đó mất một số int của đầu vào.
Và chúng tôi có chính của chúng tôi chức năng, trong đó kêu gọi khối lập phương.
Và khối lập phương được xác định sau khi thực tế.
>> Vì vậy, nếu chúng tôi không có int khối đầu vào ở phía trên, khi chúng tôi gọi khối
trong chính, trình biên dịch của chúng tôi sẽ giận chúng tôi.
Nó muốn được như thế nào, bạn đang nói về?
Cube không tồn tại.
Tôi không biết những gì bạn đang yêu cầu.
Và tôi chỉ cần đi dừng lại.
>> Nhưng vì chúng tôi đã làm thử nghiệm của chúng tôi ở phía trên, chúng tôi đã nói,
bạn biết đấy, khi bạn nhìn thấy khối lập phương, không lo lắng về nó.
Tôi hứa nó được xác định sau.
Và nó sẽ cho phép bạn làm những gì bạn muốn.
Vì vậy, nếu bạn đã từng có một chức năng đó là tuyên bố sau khi bạn gọi nó
lần đầu tiên, bạn cần phải có nó prototyped ở đầu trang.
>> Có?
>> ROB: Nó bình, không cubing.
>> ALLISON: Ôi Chúa ơi.
Tôi không have-- Gabe, tôi nghĩ bạn đã soát lỗi của chúng tôi.
Kẻ OK, chịu với tôi, ở đây.
Tôi hy vọng mọi người nhận được các ý tưởng.
OK, vì thế này nên có được bình phương, không cắt nhỏ hinh khôi.
Nhưng ý tưởng vẫn giữ nguyên.
Bất kỳ chức năng mà chúng ta đang gọi điện thoại sau thực tế cần phải có một nguyên mẫu.
Mọi người đều tốt với điều đó?
Bất kỳ lỗi chính tả nào khác không?
OK.
Bất kỳ lỗi chính tả ở đây trước khi chúng tôi bắt đầu, Rob?
[Cười] OK, vì vậy cấu trúc.
Về cơ bản, cấu trúc cho phép bạn để tạo ra các kiểu dữ liệu của riêng bạn.
Vì vậy, giống như một int hoặc char hoặc một phao, nó chỉ là một loại.
Tôi thích nghĩ về nó như, giống như, tạo kiểu dữ liệu của riêng bạn.
Vì vậy, nó cho phép bạn làm điều đó.
Và nó giữ các loại dữ liệu khác nhau.
>> Vì vậy, nếu bạn nhớ, trong một mảng, chúng tôi chỉ có thể giữ những thứ của các loại tương tự.
Cấu trúc cho phép chúng ta tổ chức nhiều những loại khác nhau.
Vì vậy, trong trường hợp này đây, chúng tôi có một cấu trúc gọi là sinh viên,
đặt tên ở đây ở phía dưới.
Và chúng tôi có một số int id và một số tên chuỗi.
Vì vậy, đây chỉ là kiểu dữ liệu khác.
Bây giờ chúng ta có một loại dữ liệu được gọi là sinh viên.
>> Vì vậy, bởi vì chúng ta có thể nghĩ nó như là kiểu dữ liệu khác,
chúng ta có thể khai báo các biến như chúng ta sẽ bất kỳ khác.
Vì vậy, thay vì chỉ có, như thế, một int sinh viên, chúng tôi chỉ có một học sinh,
1 sinh viên.
Oh, nhìn.
Đó là Rob.
Vì vậy, ở đây chúng tôi đang tuyên bố một cấu trúc, hoặc một biến
được gọi là sinh viên 1 loại học sinh.
Vì vậy, nó sẽ có id và tên liên kết với nó.
>> Và cách chúng ta truy cập vào các yếu tố bên trong cấu trúc của chúng tôi
là với các dấu chấm, ở đây.
Vì vậy, trong trường hợp này, chúng tôi tuyên bố một số sinh viên 1.
Chúng tôi giao các ID là 1.
Và chúng tôi giao tên là Rob.
OK, tất cả mọi người tốt với điều đó?
Sử dụng nó chỉ like-- có?
>> HỌC SINH: Yeah, khi typedef-- chúng ta cần phải sử dụng typedef?
>> ALLISON: Vì vậy, typedef chỉ nói that-- Rob, bạn
có thể đúng cho tôi về điều này nếu tôi wrong-- nhưng typedef là chỉ thực sự tuyên bố
nó như là một loại mà bạn có thể sử dụng, phải không?
>> ROB: Yeah, nó về cơ bản, do đó, nó chỉ tạo ra
một bí danh, hoặc một biệt danh cho một loại.
Vì vậy, bạn có thể gõ mà [không nghe được].
Vì vậy, [không nghe được] tồn tại, và bây giờ chúng tôi chỉ có
[Không nghe được] phương tiện chính xác những điều tương tự.
Và như vậy ở đây, chúng tôi đang đánh máy, tôi nghĩ rằng, một số cấu trúc loại 2 [không nghe được].
Vì vậy, nó chỉ là một biệt danh cho một loại nhất định.
>> HỌC SINH: String [không nghe được] thư viện được gõ lên như char sao.
>> ALLISON: Đối với mục đích của chúng tôi ở đây, nếu bạn khai báo một cấu trúc,
chỉ cần làm typedef struct.
OK, vì vậy trước, đây là chỉ là một biến bình thường ở đây.
Chúng tôi truy cập nó với một dấu chấm.
nếu chúng ta có một con trỏ đến một cấu trúc, chúng ta có thể thực sự
sử dụng một mũi tên, mà là khá mát mẻ.
>> Vì vậy, trong trường hợp này, chúng tôi có một con trỏ đến một sinh viên 1 đó là loại học sinh.
Hãy nhớ rằng, với bạn xây dựng con trỏ,
bất cứ điều gì bạn muốn gõ con trỏ của bạn được trỏ đến là lúc đầu.
Vì vậy, chúng tôi có một số sinh viên 1, ở đây.
Và kể từ khi sinh viên này 1 bây giờ là một nhọn,
chúng tôi thực sự có thể đi sinh viên tên 1 mũi tên thay vì dấu chấm, bởi vì nó là một con trỏ,
và gán Rob.
Và bây giờ nếu chúng ta muốn Rob thay đổi để Davin,
điều này chỉ được hiển thị cho bạn một cách khác để làm điều đó.
>> Vì vậy, thay vì sử dụng các mũi tên, bạn có thể also-- tôi sẽ hoàn thành điều này và sau đó
đi mà question-- bạn có thể cũng làm sinh viên tham khảo 1.
Đó là nói như đi bất cứ điều gì ở sinh viên 1,
sẽ là cấu trúc sinh viên của chúng tôi.
Truy cập nó với một dấu chấm và các yếu tố mà bạn muốn, và sau đó gán nó.
Có một câu hỏi.
HỌC SINH: Vâng, vậy làm thế nào đến bạn có sử dụng [không nghe được] khi bạn
làm sao học sinh không [Không nghe được] sinh viên?
ALLISON: Bởi vì đây đang tạo ra một con trỏ.
ROB: Chúng ta sẽ nói về nó.
ALLISON: Chúng ta sẽ nói chuyện về điều này sau trong tổng quan.
Vì vậy, chỉ cần giữ vào suy nghĩ đó.
Nếu nó vẫn còn làm phiền bạn tại kết thúc, đến nói chuyện với một người trong chúng ta.
>> Vì vậy, làm chính xác những điều tương tự.
Chúng tôi chỉ hiển thị cho bạn hai cách khác nhau để làm điều đó.
Sinh viên 1 bây giờ là một con trỏ, vì vậy bạn có thể truy cập vào các phần tử Tên
trong cấu trúc với một mũi tên.
Hoặc bạn có thể tới đích của con trỏ của bạn, và sau đó truy cập vào nó như bình thường.
Điều đó có ý nghĩa cho mọi người?
Nếu những điều toàn bộ con trỏ là một chút khó hiểu, Gabe sẽ nói về điều đó,
và sau đó có lẽ điều này sẽ có ý nghĩa hơn.
Có?
>> HỌC SINH: Vâng, vậy làm thế nào là này khác nhau từ?
ALLISON: Người trước đó?
Vì vậy, các sinh viên trong 1 này trường hợp không phải là một con trỏ.
Nó chỉ là cấu trúc thực tế của bạn.
>> SINH VIÊN: OK.
>> ALLISON: Trong khi một này là một con trỏ đến một cấu trúc.
>> SINH VIÊN: OK, nhưng làm nó loại kết thúc làm việc cùng [không nghe được].
>> ALLISON: Nó có hiệu quả hoạt động tương tự.
Cú pháp của bạn chỉ là khác nhau.
SINH VIÊN: OK.
>> ALLISON: Vâng, họ là có hiệu quả như nhau.
Nó chỉ phụ thuộc vào bối cảnh, bạn có thể muốn một trong khác.
Có?
>> HỌC SINH: Khi bạn làm tài liệu tham khảo để các 1--
ALLISON: Mm-hm?
HỌC SINH: Tại sao bạn có dấu ngoặc đơn?
ALLISON: Bởi vì sinh viên 1 là con trỏ.
Vì vậy, bạn cần phải chắc chắn rằng bạn đang chỉ dereferencing con trỏ.
>> SINH VIÊN: OK.
>> ALLISON: Vì vậy, trong trường hợp này đây, dấu ngoặc xung quanh nó
có nghĩa là bạn đang dereferencing sinh viên 1.
Vì vậy, bạn đang đi đến nơi mà sinh viên 1 điểm, đó là cấu trúc của bạn.
Vì vậy, bây giờ bạn có thể nghĩ của nó như là cấu trúc đó,
vì vậy chúng tôi có thể sử dụng dấu chấm hoạt động bình thường của chúng tôi.
Bất kỳ câu hỏi khác?
Mát mẻ, tuyệt vời.
>> Vì vậy, điều cuối cùng, tôi nghĩ rằng là trượt cuối cùng của tôi, woo!
OK, vì vậy nổi điểm không chính xác.
Chúng tôi nói chuyện ngắn gọn về này trong bài giảng.
Về cơ bản, chúng tôi có vô hạn các số thực.
Và nếu bất kỳ của các bạn yêu toán học, có
tất cả các loại công cụ mát mẻ với chúng tôi.
>> Nhưng có vô hạn nhiều số thực.
Nhưng họ chỉ có hữu hạn nhiều bit mà chúng ta có.
Vì vậy, bạn luôn luôn có sự thiếu chính xác, là tất cả.
Và đó là đó chỉ là loại giống như một cái gì đó bạn nên biết.
Điều đó giống như chúng tôi có thể hỏi bạn tại sao điểm nổi không chính xác tồn tại?
Vì vậy, chỉ một cái gì đó bạn nên biết.
Và với điều đó, tôi quay nó cho con trỏ.
>> Binky: Xin chào, guys.
Tên tôi là Binky.
Tôi sẽ nói chuyện về con trỏ.
Yeah, vì vậy con trỏ là thực sự phần yêu thích của tôi trong khóa học này.
Vì vậy, chỉ để làm cho rõ ràng những gì Allison đã được nói tới ở đây, vậy lý do
why-- sự khác biệt duy nhất ở đây, sự khác biệt lớn là đường
chúng ta tuyên bố điều này.
Vì vậy, ngôi sao sinh viên có nghĩa này là một con trỏ đến một học sinh.
Trong khi đó, các slide trước, học sinh là một cấu trúc thực tế, giống như một sinh viên thực tế,
có chứa bất kỳ những điều đó.
>> Và lý do tại sao chúng tôi muốn đối với: có, Davin?
>> Davin: không vào mũi tên có ý nghĩa gì?
>> Binky: Các phương tiện mũi tên chính xác giống như này.
Vì vậy, bạn không thực sự cần những mũi tên.
Giống như, nếu bạn chỉ chương trình trong C, bạn chỉ có thể sử dụng này.
Xin lỗi, tôi làm điều đó không phải là những gì.
Bạn chỉ có thể sử dụng cú pháp này.
>> Nhưng một số người, khi họ đã thiết kế C,
họ đã hình dung rằng mọi người sử dụng cú pháp mà rất nhiều,
rằng họ sẽ thích chỉ đi lên với một cấu trúc cú pháp cho nó.
Và điều này đã diễn ra trong các hình thức của mũi tên này.
Và nó thực sự tốt đẹp, bởi vì nó tượng trưng cho một cái gì đó
như chúng tôi đang thực sự sau mũi tên này, con trỏ này,
đối với một số không gian trong bộ nhớ.
Và khi chúng ta đạt được điều đó, chúng tôi muốn nhìn vào tên của học sinh đó,
nếu có ý nghĩa.
OK?
>> Vì vậy, đây là giống hệt nhau.
Đây chính là điều tương tự như thế này.
Họ được biên dịch giống hệt nhau, OK?
Và lý do tại sao chúng ta ở đây malloc một cái gì đó, là bởi vì trong trường hợp này,
biến của chúng tôi là thực sự chỉ là một biến con trỏ.
Vì vậy, chúng tôi chỉ có một số không gian trong bộ nhớ đó là giữ một con trỏ.
Chúng tôi không thực sự có bất kỳ không gian chứa các cấu trúc thực tế.
>> Vì vậy, điều này đã được thực hiện theo hai bước.
Chúng ta phải tạo ra bộ nhớ để đặt các cấu trúc trong.
Và chúng ta phải tạo ra bộ nhớ để đặt con trỏ tại.
Vì vậy, họ về cơ bản hai biến số khác nhau, ở đây.
Một trong số đó là loại sinh viên, ngoại trừ nó không thực sự có một cái tên.
Và một trong những khác loại sao học sinh.
Và sau đó học sinh 1 điểm ở đó, nếu đó có ý nghĩa.
OK?
>> Vì vậy, lý do tại sao chúng tôi sử dụng con trỏ là bởi vì tất cả mọi thứ
trong một máy tính, mỗi biến trong một máy tính có hai điều.
Nó có giá trị của nó.
Và nó có địa chỉ của nó.
Và một cách tốt để khái niệm này là có
nhiều vấn đề khi bạn cố gắng sử dụng các chức năng.
Và chúng tôi sẽ cố gắng để nhìn vào một trong những.
Cụ thể, nó sẽ nghĩ về bộ nhớ như hộp.
>> Bạn luôn luôn nghĩ về biến khi bạn nói nôm na bằng 5.
Bạn nghĩ rằng việc đưa 5 vào một hộp.
Vì vậy, nếu bạn muốn vượt qua rằng int vào một chức năng?
Bạn chỉ cần pass-- tôi không know-- x vào một chức năng.
Nhưng những gì xảy ra là bình thường như con người, bạn
sẽ nghĩ rằng một cái gì đó giống như tôi đi qua các hộp cho một người.
Và nó không thực sự xảy ra trong máy tính.
Điều gì xảy ra là bạn sao chép các giá trị hộp để hộp của người đó.
>> Vì vậy, những gì tôi đang cố gắng để nói là nếu bạn có một function-- sorry-- đây,
nếu chúng ta có một chức năng như đến năm lên ở đó, nếu bạn cố gắng để vượt qua một biến,
nó chỉ cần đi để sao chép.
Nếu một nx khởi tạo bằng 3, nó sẽ để sao chép giá trị này lên để biến một
up there.
OK, và đây là loại lý do lý do tại sao chúng tôi muốn sử dụng con trỏ.
Bởi vì thay vì đưa ra chỉ là giá trị,
thay vì chỉ cần đi qua chỉ giá trị cho một chức năng,
chúng tôi muốn vượt qua bằng cách tham khảo.
Những gì chúng ta gọi là vượt qua bằng cách tham khảo loại là của cho hộp chức năng,
để các chức năng cũng có thể thay đổi giá trị trong hộp đó.
>> OK, vì vậy chỉ cần một số con trỏ cơ bản là công cụ để tạo ra con trỏ,
bạn chỉ cần khai báo nó một kiểu, và bạn đặt một ngôi sao ngay sau khi nó.
Và loại chỉ là những gì bạn đang chỉ vào.
Vì vậy, nếu nó là một ngôi sao int, bạn đang chỉ vào một int.
Nếu nó là một ngôi sao char, bạn đang chỉ vào một biểu đồ.
Và nếu đó là một ngôi sao sinh viên, bạn đang chỉ vào một học sinh.
OK?
>> Và họ suốt cả 4 byte.
Bởi vì biến này nó không thực sự
cần phải tổ chức một char, một int, hoặc một sinh viên.
Nó chỉ cần giữ một địa chỉ.
Đó là lý do tại sao họ đang tất cả 4 byte dài trong một máy 32-bit bình thường.
OK?
Vì vậy, ở đây, x là một biến trỏ đến một int. điểm y đến một char. điểm z
để một phao.
Bất kỳ câu hỏi ở đây?
Cool.
Và có hai biểu tượng khác nhau mà họ có
cần lưu ý khi đến con trỏ.
Vì vậy, tham khảo và dereferencing là những người lớn.
Vì vậy, các ký hiệu của tên biến cho bạn?
HỌC SINH: Địa chỉ.
Binky: Địa chỉ.
Vì vậy, nếu bạn khai báo int a bằng 5, sau đó ký hiệu
một là sẽ cung cấp cho bạn địa chỉ.
Và bạn thực sự có thể thử để in và xem
những địa chỉ trong bộ nhớ biến của bạn có.
Và sau đó dereferencing-- để được tham khảo,
nhận được dereferencing address-- hoàn toàn ngược lại.
OK, giống như lần là đối diện của một bộ phận,
sao là đối diện của ký hiệu.
Vì vậy, phương tiện dereferencing đi đến đó.
Vì vậy, nếu bạn cung cấp cho star-- tôi không know-- 50, đó là
sẽ cố gắng để đi đến các địa chỉ của số 50 bên trong máy tính của bạn.
OK, và tại sao chúng ta thấy rằng họ là đối lập?
Bởi vì những gì xảy ra nếu bạn làm một cái gì đó giống như một ngôi sao ký hiệu?
Vâng, một dấu và cung cấp cho bạn địa chỉ của một biến, địa chỉ của một.
Nhưng sao có nghĩa là đi đến đó.
>> Vì vậy, những gì sẽ xảy ra nếu bạn đi đến địa chỉ của một?
Bạn chỉ cần có được một, phải không?
Vì vậy, đi đến địa chỉ của một là điều tương tự như một.
Đó là lý do tại sao chúng thường giới thiệu đến các same-- này
và điều này được gọi nhà khai thác như ngược lại.
OK?
Vì vậy, mát mẻ.
>> Dưới mui xe, ví dụ, nếu chúng ta khai báo int x = 5,
chúng tôi có một biến.
Và hãy nhớ rằng tôi đã nói tất cả variable-- và đây là một điều tốt
để giữ mind-- nó có hai những thứ khác nhau liên kết với.
Nó có một địa chỉ và một giá trị.
OK?
>> Vì vậy, các giá trị trong trường hợp này là 5.
Và địa chỉ is-- hãy nói, tôi làm một cái gì đó up-- nó là 0x04.
Và lý do duy nhất lý do tại sao chúng ta thường đại diện cho các địa chỉ trong hệ thập lục phân
là một, vì nó giống như tốt.
Nó cũng đi với nhị phân.
Thật dễ dàng để chuyển đổi sang và từ nhị phân.
Và nó không nhận được quá lớn nếu bạn có một số lượng rất lớn.
Vì vậy, chúng tôi muốn sử dụng hệ thập lục phân trong địa chỉ in ấn.
Nhưng tôi có thể đại diện này là một số nguyên.
Đó là tốt.
>> Và vì vậy nó có một địa chỉ 4 và một giá trị của 5.
Và sau đó tôi đã nói con trỏ int sao.
Vì vậy, đây là một loại, thông báo khác nhau.
Int con trỏ sao bằng địa chỉ của x.
Vì vậy, những gì là có được giá trị của ptr?
Nó sẽ là địa chỉ của x, xuống đây.
OK, vì vậy giá trị sẽ giống như địa chỉ.
Đó là sự phân công hoạt động tôi đang làm.
Và sau đó ptr là sẽ có địa chỉ riêng của mình, mà hóa ra,
trong trường hợp này, 8, OK?
>> Và sau đó tôi tạo ra một bản sao nguyên mới.
Và tôi nói int bản sao bằng đến đó.
Vì vậy, đi đến những gì ptr được trỏ đến.
Vâng, những gì ptr này có?
Ptr có 0x04.
Điều gì xảy ra nếu tôi cố gắng để đi đến đó?
Tôi sẽ tìm thấy anh chàng có địa chỉ x và những người có địa chỉ 4.
Và những người có địa chỉ bốn là x.
Điều đó có ý nghĩa?
Có?
>> HỌC SINH: Trong trường hợp này, là con trỏ trong một ngăn xếp?
>> Binky: Trong trường hợp này, it's-- câu hỏi hay.
Tôi không thực sự nghĩ về điều này khi chiếm những địa chỉ này.
Nhưng nếu điều này là, như, tất cả đây là những biến địa phương,
sau đó x sẽ sống in-- tất cả mọi thứ sẽ sống trong ngăn xếp.
Vì vậy, tất cả mọi thứ đang diễn ra được trỏ đến ngăn xếp.
Bạn chỉ nhận được vào đống khi bạn bắt đầu sử dụng malloc, phải không?
>> Vì vậy, nếu bạn nhớ lại chồng là mỗi lần bạn gọi một chức năng trong chương trình của bạn,
như, chính ví dụ, hoặc bất kỳ chức năng khác, như printf.
Tất cả các biến địa phương sẽ được đặt trong một khung stack.
Và họ sẽ nhận được như chất đống trong ngăn xếp.
Đó là những gì được gọi là một chồng.
Và tất cả những biến địa phương sẽ có mặt ở đó.
Và heap-- và chúng ta sẽ nói thêm về điều này later--
heap là nơi mà tất cả cấp phát động cuộc sống của bộ nhớ.
Mát mẻ?
>> Chúng tôi đi đến slide này.
Có?
>> HỌC SINH: Tại sao không phải là int bản sao trở 0x04?
>> Binky: Tại sao không phải int bản sao trở 0x04?
>> HỌC SINH: Tại sao không phải là [không nghe được]?
>> Binky: Bởi vì một giá trị của ptr là gì?
>> HỌC SINH: 0x04.
>> Binky: 0x04.
Điều gì xảy ra nếu bạn đi đến 0x04?
Để bạn có được những gì?
>> HỌC SINH: Oh, OK.
Binky: Bạn thấy không?
HỌC SINH: Vâng.
Binky: Vì vậy, bạn nhận được 5.
Vì vậy, bản sao sẽ có 5, nếu có ý nghĩa.
Có?
>> HỌC SINH: Có thể chúng tôi đã nhận 5 trong hộp giá trị [không nghe được]
nếu chúng ta đặt int sao chép [không nghe được].
>> Binky: Int-- chúng tôi sẽ, yeah.
Điều đó đã được thực hiện khá nhiều điều tương tự.
Nhưng cách này, chúng ta có thể vượt qua giải quyết các chức năng.
Và đó là điều mát mẻ chúng ta sẽ làm ngay bây giờ.
>> Vì vậy, loại này của tập thể dục luôn luôn đi kèm on-- rất thường đi lên trên câu đố.
Vì vậy, nó thực sự tốt để cố gắng làm điều đó là điều mà bản thân bạn.
Vì vậy, cố gắng theo dõi những gì địa chỉ là và muốn các giá trị của các biến
là tại mỗi điểm.
Vì vậy, đây là chính xác những gì chúng ta sẽ làm.
Ở đây, chúng ta có các bước, một, hai, ba, bốn, năm.
Một, hai, ba, bốn, năm.
Và chúng tôi sẽ tiếp tục theo dõi các giá trị của x và a.
>> Vì vậy, những gì đang thực hiện, nếu điều này là một mã lỗi, chúng tôi đang cố gắng làm đến năm.
Vì vậy, chúng tôi đang cố gắng để có được trong một biến và thay đổi giá trị của nó đến 5.
Và hãy nhớ tương tự của tôi có một hộp và đưa hộp với một ai đó?
Vì vậy, chính có hộp này được gọi là x.
Và nó có chứa giá trị 3.
Và tôi đang cố gắng để tay hộp này để đến năm.
>> Và tôi muốn năm để thay đổi giá trị của ô này đến 5.
Và sau đó tôi chỉ in giá trị của x.
Đây là những gì tôi function-- đây là những gì tôi đang cố gắng để làm.
Tôi chỉ cố gắng để cập nhật giá trị của x 5.
Có rõ chức năng không?
>> OK, vì vậy những gì sẽ là giá trị của x và ngay tại đây,
dòng đầu tiên, ngay trước khi là người đầu tiên line-- tôi sẽ say-- của chương trình?
>> HỌC SINH: Có thể là rác.
>> Binky: Chỉ cần những thứ rác.
Vì vậy, tôi chỉ cần đặt N / A. Như vậy chúng ta không thực sự biết.
Giống như, một thậm chí không tồn tại, bởi vì chúng tôi đã không được gọi là đến năm.
Int một không được khai báo.
Và x là sẽ tồn tại ở đây, nhưng chúng tôi đã không thực sự
chỉ định bất kỳ giá trị cho nó, vì vậy OK?
>> Và sau đó, những gì đang có được các giá trị của x và một trong số hai?
>> HỌC SINH: [không nghe được].
>> Binky: x Vì vậy, sẽ là 3.
Đó là dễ dàng, bởi vì chúng ta đang gán 3 đến nó.
Và vẫn không tồn tại bởi vì chỉ sống trong năm.
Vì vậy, tôi sẽ có 3 và không có gì.
hoặc như rác, bất cứ điều gì, không thực sự xác định.
Và bây giờ, đây là dòng quan trọng.
Ở đây, chúng ta sẽ thực sự gọi đến năm.
Và hãy nhớ những gì tôi nói.
Chúng tôi không bao giờ vượt qua trong hộp.
Chúng tôi chỉ cần sao chép các giá trị của hộp hộp khác.
Đó là tất cả các máy tính làm gì, sao chép thứ từ nơi này đến nơi khác.
>> Vì vậy, đến năm, những gì nó thực sự làm là nó sao chép các giá trị của x để a.
Vì vậy, những gì đang xảy đến đây?
Các giá trị của x và a.
3 và 3, chúng tôi sẽ chỉ cần sao chép nó hơn từ x đến một.
Cool.
>> Bây giờ chúng ta đang ở đây.
Và bây giờ chúng ta sẽ để cập nhật một bằng 5.
Điều gì sẽ xảy ra trong dòng bốn?
>> HỌC SINH: [không nghe được].
>> Binky: một được cập nhật, nhưng x không được cập nhật.
Bởi vì x vẫn sống trong chính, đó là một khối hoàn toàn khác nhau của bộ nhớ.
Đó là một biến khác nhau.
a là một biến khác.
Chúng xảy ra để có cùng một giá trị bởi vì tôi
copy toàn bộ các giá trị của x để a.
Nhưng bây giờ khi tôi làm một bằng 5, nó không thực sự hiệu x trong bất kỳ cách nào.
Đây là phần phức tạp hơn.
Liệu nó có ý nghĩa với tất cả mọi người?
Có?
HỌC SINH: Một câu hỏi nhiều hơn, bạn có 3.
Tại sao một already-- oh, không, đó là 3.
Xin lỗi, không bao giờ nhớ.
Tôi đọc 5.
>> Binky: Yeah, 3, 3.
>> HỌC SINH: [không nghe được], yeah.
Binky: Và sau đó chúng ta gán 5 một, nhưng không thực sự thay đổi x.
Tốt?
HỌC SINH: Vâng.
Binky: Vâng?
Bạn có thể giải thích một lần nữa như thế nào một được sao chép [không nghe được]?
>> Binky: OK, vì vậy khi bạn gọi đến năm của x, vì vậy dòng mã này ở đây.
đến năm x, x là gì?
x chỉ 3 vào thời điểm này là, phải không?
Vì vậy, bạn chỉ có thể nghĩ đến việc đưa 3 ở đây và quên đi x.
Chỉ cần đặt một 3 ở đây.
Giống như, chúng ta sẽ sao chép các giá trị của x để các int a đó là lên đó.
OK?
>> Vì vậy, giá trị của x là 3.
Chúng tôi sẽ sao chép 3 sang một.
Và tất cả các khối này khác bộ nhớ, biến khác này
gọi là sẽ có 3, là tốt.
Điều đó có ý nghĩa?
Có?
>> HỌC SINH: Nếu bạn cho đến năm như có nó như là số nguyên x thay vì một,
mà sẽ sửa chữa tất cả mọi thứ?
>> Binky: Nếu nó là một integer-- không, rằng sẽ không sửa chữa tất cả mọi thứ.
Vì vậy, đó là một câu hỏi rất tốt.
Nó không thực sự có vấn đề gì bạn gọi các biến.
Một lần nữa, nó sẽ là một vấn đề phạm vi, bởi vì họ không giống nhau x.
Họ hoàn toàn không gian khác nhau trong bộ nhớ.
HỌC SINH: [không nghe được].
Binky: Vì vậy, nó không thực sự vấn đề gì bạn gọi cho họ.
Điều đó không khắc phục điều này, OK?
Các câu hỏi?
Có?
>> HỌC SINH: Làm thế nào là nó trở lại số năm [không nghe được]?
Binky: OK, chúng tôi đã không làm điều đó được nêu ra.
Hãy đi đến thứ năm, sau đó.
>> HỌC SINH: [không nghe được]?
>> Binky: Cái gì?
>> HỌC SINH: Bạn đã có một sự trở lại ở tất cả?
Binky: Chúng tôi không có quay trở lại, không phải của chính.
Nhưng lợi nhuận chính 0 tự động nếu bạn không trả lại bất cứ điều gì.
Có?
>> HỌC SINH: bạn có thể làm cho main-- hoặc bạn có thể làm để trở lại một năm?
>> Binky: Chúng ta có thể có đến năm trở lại một, vâng.
Nhưng sau đó chúng tôi sẽ phải gán x tương đương với giá trị trả lại đến năm,
đó sẽ là một hơi chương trình khác nhau.
Nó sẽ làm việc.
Nhưng những gì chúng tôi muốn làm là những gì gọi là thay đổi một cái gì đó tại chỗ.
Vì vậy, chúng tôi muốn thực sự thay đổi hộp và lo lắng
về việc phải quay trở lại giá trị hoặc bất cứ điều gì.
OK?
>> Đây là giống như các chức năng trao đổi David cho thấy trong bài giảng, ngoại trừ tôi
chỉ đối phó với một biến.
Và ông đã sử dụng hai, vì vậy int a và b và sau đó biến tạm thời và không có điều gì.
OK?
Vì vậy, dòng cuối cùng là gì?
Sau khi đến năm lợi nhuận, đó là chỉ đơn giản là một là sẽ đi xa.
Chúng tôi sẽ không có nữa, và chỉ x sẽ vẫn còn sống.
>> Và đoán những gì? x không thay đổi giá trị của nó,
sau khi tất cả, bởi vì chúng tôi chỉ thay đổi giá trị của a.
Đó là lý do tại sao x là 3 trong suốt.
OK?
Tốt.
Vì vậy, chương trình này không đạt được những gì chúng tôi muốn.
Bây giờ chúng ta hãy sửa chữa nó.
>> Và các chương trình sửa chữa là sử dụng con trỏ.
Những gì chúng tôi làm là chúng tôi có ba đường dây là khác nhau.
Những cái đầu tiên là chúng tôi không đi qua x.
Chúng tôi đang đi qua địa chỉ của x.
Vì vậy, thay vì sao chép trên giá trị của hộp,
Tôi vẫn sẽ sao chép trên một cái gì đó.
Nhưng tôi sao chép trên địa chỉ của hộp.
>> Vì vậy, nếu tôi vượt qua địa chỉ của hộp để đến năm, sau đó đến năm
sẽ có thể thấy rằng trong bộ nhớ và thay đổi giá trị của nó.
>> Vì vậy, và sau đó lên ở đó, tôi có rằng không phải là một int nữa.
một là một ngôi sao int.
Đó là một con trỏ đến một số nguyên.
Và sau đó, bởi vì tôi đi qua các địa chỉ ở đây, và sau đó những gì tôi làm
không phải là một bằng 5, bởi vì một đang nắm giữ một địa chỉ.
Vì vậy, những gì tôi muốn làm là đến đó và cập nhật các nội dung của địa chỉ này
với 5.
>> OK, vì vậy hãy đi qua tất cả các dòng một.
Vì vậy, khi tôi bắt đầu ở đây, tôi vẫn có N / A, N / A, N / A
cho tất cả mọi thứ trong lần đầu tiên dòng, bởi vì tôi đã không thực sự
tuyên bố nội dung được nêu ra.
Và sau đó xếp hàng hai, tôi có x bằng 3.
Một int sao một không tồn tại, điều tương tự như trước đây.
>> Bây giờ nó được thú vị.
Vì vậy, tôi sẽ vượt qua.
Và chúng ta hãy giả sử rằng địa chỉ của x là 12 trong hệ thập lục phân.
Hãy chỉ là giả định này.
Tôi đã thực hiện nó lên.
Vì vậy, những gì tôi đi qua ở đây là một đến năm.
Tôi đang đi qua 12.
>> Vì vậy, những gì giá trị không có một?
>> HỌC SINH: [không nghe được].
>> Binky: Xin lỗi?
>> HỌC SINH: [không nghe được].
Binky: Vâng, như thế, để chúng ta cho rằng chúng ta đang ở đây, bây giờ.
Tôi hỏi.
>> HỌC SINH: [không nghe được].
>> Binky: Nó đã được bắt đầu.
>> HỌC SINH: [không nghe được].
Binky: Bởi vì chúng tôi thông qua một cái gì đó để chức năng.
Có?
>> HỌC SINH: Địa chỉ của x.
Binky: Nó sẽ có địa chỉ của x.
Và địa chỉ của x là 12, tốt.
Vì vậy x sẽ là 3, bởi vì chúng tôi đã không thực sự thay đổi x nào.
Và sau đó một sẽ là 0x12, do đó địa chỉ của x, bởi vì đó là
những gì chúng ta truyền cho đến năm.
>> Và sau đó những gì xảy ra nếu chúng tôi cố gắng để đi đến đó?
Chúng ta sẽ tìm thấy?
Vì vậy, nếu bạn cố gắng in một ngôi sao, chúng ta sẽ làm theo địa chỉ này
và nhận được những giá trị bên trong.
Và giá trị chỉ là cùng một giá trị mà x
có bởi vì đó là địa chỉ của x, đó sẽ là 3.
Chúng ta tốt?
>> OK, và sau đó bây giờ, chúng tôi thực sự đến đó.
Và chúng tôi cập nhật bất cứ điều gì là địa chỉ này 12.
Chúng tôi làm cho nó 5.
Vì vậy, bây giờ cả hai x và một ngôi sao là 5.
>> Tại sao vậy?
Bởi vì địa chỉ của x là 12.
Và cũng có 12 giá trị của nó.
Vì vậy, nếu chúng ta theo 12, chúng tôi chỉ cần đi để tìm x.
Vì vậy, bất cứ điều gì chúng tôi làm với sao một sẽ xảy ra
để x, bởi vì một chứa địa chỉ của x.
OK?
>> Và điều này cũng giống như mấu chốt của việc sửa chữa.
Vì vậy, bây giờ chúng tôi có thể, từ đến năm, thực sự
bộ nhớ truy cập sống trong chính.
Vì vậy, bộ nhớ này không sống vào năm, như trước đây, địa chỉ này 12.
Và chúng tôi đã có thể đi đến đó và thay đổi giá trị của nó đến 5.
>> Và sau đó khi chúng tôi quay trở lại, chúng ta quên đi một.
Chúng ta quên về một ngôi sao.
Và x vẫn là năm.
Vì vậy, nếu bạn muốn thực hiện một chức năng trao đổi,
bạn sẽ chỉ cần làm một điều chính xác, ngoại trừ bạn cần phải int sao đây,
vv và vv.
OK?
Chúng ta tốt?
Cool.
>> Vì vậy, con trỏ số học.
Đây là một chủ đề hơi khó khăn.
Vì vậy, nó chỉ ra rằng con trỏ chỉ là số nguyên.
Bạn có thể nghĩ về họ như là số nguyên.
Bởi vì trong bộ nhớ, bạn có như bộ nhớ địa chỉ không, một, hai, ba,
bốn, năm.
Vì vậy, chúng ta có thể tổng hợp các địa chỉ bộ nhớ.
>> Và đó thường là những gì bạn làm khi bạn đang ở trong và mảng, ví dụ.
Một mảng được giống như một tiếp giáp khối của bộ nhớ, của rất nhiều ký tự,
Ví dụ, rất nhiều ints.
Vì vậy, nếu bạn muốn đi đến thứ hai int hoặc int thứ ba,
bạn chỉ có thể tổng hợp một cái gì đó để là người đầu tiên địa chỉ, và bạn sẽ đạt được điều đó.
Vì vậy, đây là thực sự hữu ích cho điều đó.
>> Và điều cần lưu trong tâm trí, mặc dù, là
rằng nó không giống như số học thông thường trong ý nghĩa
rằng nếu bạn đang làm việc với, nói, một ngôi sao int, và bạn thêm 1 với nó,
sau đó bạn sẽ không thêm 1 đến địa chỉ,
bạn sẽ thêm 4 đến địa chỉ.
Bởi vì một int là 4 byte.
>> Vì vậy, đây là giống như đi bộ trên một mảng.
Nếu chúng ta có một mảng của rất nhiều ints và sau đó chúng tôi cố gắng đi đến một giây,
nó về cơ bản chỉ là cách tổng hợp các địa chỉ của một trong những đầu tiên cộng thêm 1.
Nhưng đó sẽ không be-- chỉ giả rằng địa chỉ của một trong những đầu tiên là 4.
Ở đây, trong trường hợp này.
Và nếu chúng ta tổng hợp, vì vậy đây là những gì đang xảy ra.
Chúng tôi có một int.
Int x = 5.
X có giá trị 5.
Và chúng ta khởi tạo con trỏ này, int y int sao y bằng địa chỉ của x.
>> Giả sử địa chỉ của x là 4.
Điều gì sẽ xảy ra bây giờ nếu tôi tổng cộng 1 vào y?
Nó sẽ thực sự tổng 4 thay vì chỉ 1.
Vì vậy, tôi thêm một 1, nhưng nó thực sự thêm 4, bởi vì máy tính thông minh.
Vì vậy, nó sẽ thực sự thêm bởi tôi lần kích thước của kiểu của con trỏ.
OK?
>> Vì vậy, nếu nó là một char, ví dụ, nếu điều này là một y char sao,
và nếu chúng ta thêm 1 sau đó điều này sẽ là 5, vì char là 1 byte dài.
Tốt?
>> Và cuối cùng, chúng tôi đã đến con trỏ và mảng.
Nó chỉ ra rằng mỗi lần bạn đang làm việc với một mảng,
bạn đang thực sự đối phó với một con trỏ.
Lý do khái niệm rất tốt đẹp cho này là mảng rất lớn.
Vì vậy, hãy nhớ rằng tôi đã nói rằng mỗi lần bạn vượt qua những thứ xung quanh,
bạn sao chép tất cả mọi thứ.
Vì vậy, nếu bạn có một mảng đó là thực sự, thực sự lớn,
bạn không thực sự muốn sao chép tất cả mọi thứ mỗi lần
bạn vượt qua nó xung quanh khác chức năng, bởi vì đó chỉ là
số lượng lớn công việc.
Vì vậy, những gì bạn làm chỉ là quá khứ địa chỉ của byte đầu tiên.
Và sau đó các chức năng sẽ có quyền truy cập cho tất cả các yếu tố trong mảng đó.
Vì vậy, bạn thông qua các mảng theo địa chỉ của nó, vì vậy các địa chỉ của byte đầu tiên.
>> Vì vậy, nếu chúng ta khai báo int mảng 3, ở đây, chúng ta biết
làm thế nào để truy cập vào các phần tử đầu tiên bằng cách sử dụng ký hiệu khung.
Nếu bạn còn nhớ khung ký hiệu, khung mảng 0 bằng 1.
Vâng, điều này sẽ được chính xác giống như chỉ đến đó và đưa 1.
OK, là chính xác những điều tương tự.
Vì vậy, các ký hiệu khung ở đây sẽ giống như dòng này.
>> Và đoán những gì các ký hiệu khung cho khung mảng 1 sẽ được?
Nó sẽ chỉ được điều tương tự như thế này.
Vì vậy, thêm một mảng.
Di chuyển một cùng trong bộ nhớ.
Đến đây, và đặt một 2.
OK?
Và dòng này là điều tương tự.
Chúng tôi muốn đi đến thứ ba hộp, vì vậy cộng với 2 mảng.
Đến đây, và đặt một 3.
Vì vậy, trong bộ nhớ, có chuyện gì sẽ xảy ra là chúng tôi
sẽ có 1, 2, và 3 là ba yếu tố của mảng này.
>> Chúng tôi có thể làm điều này bằng cách sử dụng khung ký hiệu quen thuộc của chúng tôi.
Tôi chỉ muốn các bạn biết rằng họ là những điều tương tự.
OK, câu hỏi về điều này?
Nice.
Bây giờ, tôi sẽ đến tay nó cho Hannah,
>> HANNAH: Yay, yee-haw.
>> Binky: Nói về bộ nhớ và bài viết công cụ.
[Vỗ tay]
>> HANNAH: Hi, mát mẻ, vì vậy chúng tôi sẽ nói một chút hơn
về bộ nhớ, mà chúng ta chỉ giải quyết bằng cách sử dụng con trỏ.
Vì vậy, có hai bộ phận chính của bộ nhớ mà chúng tôi đang quan tâm đến.
Chúng tôi có chồng, mà phát triển lên ở dưới cùng, và heap, mà
đi từ trên xuống.
Và chồng sẽ tổ chức tất cả các biến dụ của chúng tôi.
Vì vậy, mỗi cuộc gọi đến một chức năng được ít khung hình riêng của mình trên stack.
Vì vậy, Gabe đã đề cập trước, nếu chúng tôi gọi hàm một lần nữa và một lần nữa,
chúng ta sẽ ngăn xếp mọi thứ trên stack.
>> Và tương tự, đống, mà bắt đầu ở đầu trang
sẽ tổ chức tất cả các bộ nhớ mà chúng tôi tự động phân bổ.
Và như vậy, chúng tôi tự động cấp phát bộ nhớ,
này sẽ đi xuống hướng về phía dưới.
Những cặp vợ chồng cần lưu ý khi chúng tôi đang sử dụng stack và heap,
với chồng, nếu chúng ta có quá many-- hãy say-- cuộc gọi đệ quy,
và chúng tôi đang kêu gọi một chức năng một lần nữa, và một lần nữa, và một lần nữa, và một lần nữa,
và nó được xếp chồng lên, xếp chồng lên, xếp chồng lên.
Và nó sẽ sụp đổ vào đống.
Chúng ta sẽ chạy ra khỏi bộ nhớ.
Điều đó sẽ gây ra một vấn đề cho máy tính.
Và đó được gọi là stack tràn.
Vì vậy, đó chắc chắn là một cái gì đó bạn cần phải nhận thức và cố gắng tránh.
Và đống, phải nhớ không vô tình bị rò rỉ bộ nhớ.
Bất cứ lúc nào bạn sử dụng malloc, không quên để giải phóng bộ nhớ.
Nếu không, nó sẽ chỉ được trên đống lãng phí,
và máy tính sẽ không biết rằng nó là miễn phí để sử dụng bộ nhớ.
Vì vậy, những người đang có một vài điều phải rất cẩn thận với khi
bạn đang làm việc với stack và heap.
Bất kỳ câu hỏi với điều này?
Tuyệt vời.
>> OK, mát mẻ.
Vì vậy, hình thức này có cùng một ý tưởng như tràn stack, nơi
chúng ta sẽ vượt ra ngoài giới hạn của những gì bộ nhớ
là chúng ta cần phải có thể sử dụng.
Vì vậy, lấy ví dụ, một bộ đệm, hoặc bạn chỉ có thể nghĩ về nó như một mảng.
Và chúng tôi đã nói, OK, chúng ta sẽ tạo mảng này ít tốt đẹp.
Nó sẽ là một chuỗi.
Hoặc nó sẽ lưu trữ ký tự.
Và nó chỉ cần đi để chào hỏi.
Và đó là không xác định.
Có bấy nhiêu thôi.
>> Nhưng nếu tôi là một người xấu xa và muốn làm điều gì đó xấu với mảng này, những gì
Tôi có thể làm là cố gắng viết quá khứ kết thúc của chuỗi.
Và như bạn sẽ thấy, nếu Tôi viết đủ xa,
Tôi thực sự có thể ảnh hưởng đến địa chỉ trả lại.
Và nếu tôi bắt đầu ảnh hưởng đến địa chỉ trả lại,
Tôi ảnh hưởng đến cách các chương trình thực sự chạy.
Và thay vì quay trở lại, bạn biết, một chuỗi hạnh phúc như hello, tôi
có thể làm một cái gì đó xấu, như đi ở một nơi khác trong máy tính của bạn, vẫn còn
bộ nhớ, thay đổi nó, bất cứ điều gì tôi muốn làm.
Vì vậy, đó là những gì này sẽ như thế nào là nếu tôi chỉ loại đầy nó lên
với giá trị rác ngẫu nhiên, trong trường hợp này, chỉ cần một.
Và sau đó khi tôi thực sự đã đến địa chỉ bộ nhớ,
Tôi bắt đầu làm đầy nó bằng một cái gì đó mà đã làm những gì tôi muốn nó làm.
Bất kỳ câu hỏi với lỗi tràn bộ đệm?
Awesome, bay đúng thông qua công cụ này.
>> OK, vì vậy chúng tôi đã nói chuyện rất nhiều về con trỏ với Gabe.
Làm thế nào để chúng ta thực sự có được một con trỏ?
Làm thế nào để chúng ta có được một địa chỉ trong bộ nhớ?
Vâng, chúng ta có thể sử dụng tốt đẹp chức năng gọi malloc, mà
là sẽ nhận được một ít mảnh bộ nhớ,
đặc biệt trong heap, như chúng ta đã thảo luận,
và nó sẽ cung cấp cho bạn trở lại một con trỏ đến địa chỉ trong bộ nhớ.
Và lập luận rằng chúng ta có để cung cấp cho malloc
là bao nhiêu không gian trong bộ nhớ chúng ta muốn.
>> Vì vậy, bạn có thể thấy kích thước trong byte.
Hãy nói rằng, ví dụ, hoặc trên thực tế, trong ví dụ này,
chúng tôi phân bổ đủ không gian cho 10 số nguyên.
Vì vậy, có lẽ là những gì chúng ta sẽ muốn đặt ở đây là một mảng 10 số nguyên.
Vì vậy, chúng tôi cung cấp cho nó kích thước của kiểu int, mà chúng tôi đã học được bao nhiêu byte?
HỌC SINH: 4.
HANNAH: 4, đẹp, và chúng tôi muốn 10 người trong một hàng,
để chúng tôi có đủ không gian để lưu trữ tất cả 10 số nguyên, trong trường hợp này.
Một cái gì đó siêu quan trọng, bất cứ lúc nào bạn gọi malloc,
bạn phải kiểm tra cho null.
Nếu bạn không kiểm tra null, tốt, malloc nếu nó chạy ra khỏi không gian
và không còn có thể cung cấp cho bạn bất kỳ bộ nhớ nhiều hơn, nó sẽ trả về null.
Vì vậy, nếu bạn không kiểm tra, malloc có thể trở lại null.
Và sau đó nếu chúng tôi cố gắng dereference một con trỏ null,
chúng ta sẽ nhận được một lỗi phân khúc, mà chúng tôi sẽ nói về ngay bây giờ.
Tuyệt vời.
>> OK, câu hỏi với malloc?
Có?
>> HỌC SINH: Có kiểm tra rỗng [Không nghe được] không làm điều đó trên các bài kiểm tra?
>> HANNAH: Chắc chắn, câu hỏi là nó matter-- trên các bài kiểm tra,
bạn sẽ nhận được điểm off nếu bạn không kiểm tra null?
Có, bạn sẽ nhận được điểm off nếu bạn không kiểm tra null.
Bất cứ lúc nào bạn gọi malloc, cả trên đố vui và psets của bạn và trong cuộc sống thực,
bạn phải kiểm tra cho null.
Tốt câu hỏi.
>> Gabe: Nếu tôi không giải phóng?
HANNAH: Gabe muốn biết những gì nếu chúng ta không miễn phí.
Sau đó chúng tôi sẽ có một rò rỉ bộ nhớ trong heap của chúng tôi.
Bất kỳ câu hỏi khác?
Có?
>> HỌC SINH: you-- có thể đi qua tràn bộ đệm thực sự nhanh chóng một lần nữa?
>> HANNAH: Chắc chắn.
Câu hỏi đặt ra là chúng ta có thể đi qua tràn bộ đệm thực sự nhanh chóng.
Chúng ta hãy trở lại những slide.
Vì vậy, một bộ đệm, bạn có thể chỉ nghĩ về nó như một mảng, phải không?
Bạn có một số không gian trong bộ nhớ.
Và khi chúng tôi lần đầu tiên tạo mảng của chúng tôi, chúng tôi biết mảng có cố định kích thước,
hoặc đệm của chúng tôi có một kích thước cố định.
>> Vì vậy, hãy nói rằng trong trường hợp này, chúng tôi chỉ có đủ không gian để viết chuỗi hello.
Nếu chúng ta đi quá khứ mà ràng buộc, nếu chúng ta đi qua những mảng của chúng tôi, chúng tôi cho biết nó có thể nắm giữ,
chúng ta có thể thực sự bắt đầu viết vào bộ nhớ
rằng máy tính không muốn chúng tôi viết vào.
Và đặc biệt, nếu chúng ta nhấn một cái gì đó giống như sự trở lại
giải quyết các chức năng, trong đó, giống như bất kỳ phần khác của bộ nhớ,
chỉ là một nơi nào đó của bạn máy tính, bạn có thể thực sự
thay đổi điều đó và bắt đầu làm những điều ác.
Trả lời câu hỏi của bạn?
Awesome, bất cứ điều gì khác?
Có?
>> SINH VIÊN: Vì vậy, ngăn xếp [không nghe được], bạn nói đi từ dưới đi lên.
Trong ngăn xếp phạm vi, không bộ nhớ đi từ, như,
từ trên xuống liên quan đến từng phá vỡ?
>> HANNAH: Làm thế nào you-- trì hoãn để Rob ngày này.
>> ROB: Nó sẽ phát triển trong cùng một hướng như ngăn xếp phát triển.
HANNAH: OK.
ROB: Vì vậy, tôi bị lẫn lộn.
Điều này là có được trừu tượng.
HANNAH: OK.
ROB: Đây là chính xác.
Vì vậy, nếu chồng đang phát triển lên, sau đó nó generally--
không phải là như thế này. nhưng bạn có thể khai báo int x.
Sau đó, bạn khai báo int y.
Sau đó, int x nói chung sẽ thấp hơn trên stack hơn int y.
Nhưng đó chỉ là một thực tế.
Điều đó không giống như một điều giống quan trọng.
>> ROB: Vậy câu hỏi một lần nữa là chỉ những gì xảy ra mỗi khung xây dựng lên.
Vì vậy, mỗi chức năng được một ít mảnh của stack.
Và như bạn đi lên, trong đó đôi chút, trong khung đó,
chúng tôi sẽ nói rằng các biến trong khung đó cũng di chuyển lên.
Câu hỏi?
>> ROB: Chỉ cần được vào mic.
HANNAH: Oh, yeah.
ROB: Tôi sẽ nói chuyện vào bạn.
HANNAH: Oh, yeah, OK.
ROB: Trường hợp ngoại lệ là cho mảng và cấu trúc,
nơi mảng, thấp hơn chỉ số trong mảng,
và trong cấu trúc ở mức cao hơn lĩnh vực trong các cấu trúc
có bảo đảm là ở địa chỉ thấp hơn hơn một giá trị sau trong mảng.
Vì vậy, những người được đảm bảo.
Tuy nhiên, bất kỳ biến cụ thể trong, như int x và int y trong vòng một chức năng,
không có mối quan hệ cần thiết giữa các địa chỉ của họ.
HANNAH: Một câu hỏi trên đây?
SINH VIÊN: Vì vậy, trong bộ đệm dòng chảy, chỉ tràn bộ đệm
chỉ xảy ra khi bạn đã, như, giao
một số tiền của một mảng sau đó là lớn hơn?
Giống như, có thể bạn?
Vì vậy, nếu bạn đang yêu cầu một cái gì đó từ user--
>> HANNAH: Mm-hm.
HỌC SINH: Có thể họ buộc cung cấp cho bạn một cái gì đó trở lại
đó là lớn hơn so với bất cứ điều gì bạn đã phân bổ cho họ?
HANNAH: Chắc chắn rồi, vì vậy câu hỏi là về cơ bản,
người dùng có thể cung cấp cho bạn nhiều hơn bạn yêu cầu?
HỌC SINH: Yeah.
HANNAH: Vâng, bạn có thể ngăn chặn người dùng từ làm điều đó.
Bạn đặc biệt có thể nói không cung cấp cho tôi nhiều hơn x số của byte
Tôi đã chỉ cho bạn chỗ cho x số byte, x số lượng ký tự.
Vì vậy, đó là một cái gì đó bạn muốn ngăn chặn.
Có?
Sự khác biệt giữa những gì là ngăn xếp tràn và tràn bộ đệm?
>> HANNAH: OK, vậy stack overflow-- oh, những gì
là sự khác biệt giữa chồng tràn và lỗi tràn bộ đệm?
Vì vậy, chúng tôi muốn nghĩ về stack overflow xảy ra khi chúng tôi thực sự
xếp chồng lên các cuộc gọi chức năng.
Hãy nói rằng bạn có một hàm đệ quy, bởi vì chúng ta biết rằng mỗi khi bạn
gọi một chức năng, nó được khung hình riêng của mình trên stack.
>> Vì vậy, chúng chồng lên quá cao, và sau đó chúng tôi bắt đầu tràn.
Và chúng tôi sử dụng quá nhiều bộ nhớ, Và chúng tôi không có bất cứ nơi nào để lại.
Chúng tôi nhận được lỗi đó.
>> Tràn bộ đệm là trong một chương trình.
Chúng tôi muốn có thể không nhất thiết phải có chạy ra khỏi bộ nhớ trong cùng một cách
rằng chúng ta có thể nếu chúng ta xếp chồng lên rất nhiều cuộc gọi chức năng,
nhưng chúng tôi viết qua bộ nhớ mà chúng ta biết chúng ta có thể sử dụng.
Và cho phép chúng ta làm điều xấu.
Yeah?
>> ROB: Vâng, bạn có thể muốn chỉ cần lặp lại điều này,
nhưng bạn cũng có thể nghĩ của một chồng tràn
là giống như một loại hình cụ thể tràn bộ đệm.
Hoặc bạn chỉ nghĩ về bạn ngăn xếp như một bộ đệm thực sự lớn.
Sau đó, khi bạn tràn bạn sắp xếp, đó là loại giống như một lỗi tràn bộ đệm.
Nhưng một chồng tràn chỉ là một là hạn cụ thể được sử dụng khi stack
bản thân tràn.
>> HANNAH: Phải, như vậy để lặp lại cho các video,
nó, bạn có thể nghĩ đến chồng tràn như một loại hình cụ thể của lỗi tràn bộ đệm.
Mát mẻ?
Bất kỳ câu hỏi nhiều hơn trước khi chúng tôi đi về?
Tuyệt vời.
>> OK, mát mẻ, vì vậy chúng ta hãy nói về một số thông báo lỗi phổ biến.
Đây là điều mà có được hiển thị lên trên nhiều câu đố,
nên cái gì đó là giá trị tham gia một cái nhìn thứ hai tại.
Tôi chắc rằng bạn đã gặp phải ít nhất là một số trong những
như bạn đang làm vấn đề của bạn đặt ra.
Vì vậy, hãy chắc chắn rằng bạn có thể nói chuyện về họ trên các bài kiểm tra.
>> Vì vậy, một trong những đầu tiên là một lỗi phân khúc.
Và đó là bất cứ lúc nào chúng tôi cố gắng để truy cập bộ nhớ
rằng chúng tôi không được phép truy cập.
Vì vậy, bạn migh đã thấy điều này, ví dụ, trong breakout.
Nếu phát hiện va chạm trở về null, và sau đó bạn
cố gắng làm một cái gì đó với giá trị null,
máy tính sẽ cung cấp cho bạn một lỗi phân khúc.
Vì vậy, một, một điều quan trọng làm để cố gắng tránh điều này
là luôn luôn kiểm tra null.
>> Bạn có thể cũng đã nhìn thấy khai tiềm ẩn của chức năng.
Vì vậy, đây là những gì sẽ xảy ra khi Allison cho thấy bạn
làm thế nào chúng ta tạo được một, phải không?
Vì vậy, hãy nói rằng chúng tôi có một số chức năng mà chúng ta định nghĩa.
Hãy nói rằng khối lập phương.
Và đó đi ở phía dưới chức năng của chúng tôi, dưới chính.
>> Nếu chúng ta quên nói với máy tính về khối lập phương, khi chính cố gắng gọi khối lập phương,
máy tính sẽ được, như, oh chúa ơi.
Tôi không có ý tưởng gì đó có nghĩa.
Tôi không biết phải làm gì, ở đây.
Vì vậy, các mẫu thử nghiệm nói đừng lo lắng.
Tôi sẽ cho bạn biết.
>> Nó sẽ đến.
Đừng hét vào mặt tôi.
Đừng đưa cho tôi một tiềm ẩn kê khai chức năng.
Vì vậy, nếu bạn nhận được lỗi này, một điều bạn sẽ muốn làm
là chắc chắn rằng bạn có nguyên mẫu của bạn.
OK?
>> Và cuối cùng nhưng không kém, định không khai báo
về cơ bản là khi bạn cố gắng sử dụng một biến mà bạn đã không khai báo.
Vì vậy, tất cả của một đột ngột bạn bắt đầu nói như n cộng với cộng với.
Và các máy tính nói n là gì?
Bạn không bao giờ nói với tôi n là một điều.
>> Vì vậy, có một điều bạn phải chắc chắn rằng bạn đã làm là cho máy tính những gì là n.
Vì vậy, ví dụ, n có thể là một số nguyên.
Và sau đó bạn sẽ tránh được lỗi này.
Bất kỳ câu hỏi về lỗi phổ biến?
Có?
>> HỌC SINH: Đối với các ngầm kê khai chức năng,
có thể nó cũng là bạn bỏ qua một các thư viện bạn đã dự
bao gồm, chứ không phải là nguyên mẫu?
>> HANNAH: Đúng, vì vậy Câu hỏi là, có thể bạn
cũng nhận được lỗi này nếu bạn quên bao gồm một thư viện.
>> HỌC SINH: Vâng.
>> HANNAH: Tuyệt đối, bởi vì trong cùng một cách
mà chúng tôi muốn đưa nguyên mẫu của chúng tôi trước khi chức năng chính,
nếu chúng ta có một thư viện, những người sẽ về cơ bản bao gồm các nguyên mẫu,
bao gồm các định nghĩa các chức năng.
Great câu hỏi.
>> HỌC SINH: Đối với một phân khúc lỗi, sẽ cũng
xảy ra nếu chúng ta, như thế, cố gắng để truy cập vào một biến,
như thế, trong một khác nhau [không nghe được] hơn nó được khai báo trong?
HANNAH: Chắc chắn rồi, vì vậy chúng tôi sẽ nhận được một lỗi phân khúc
nếu chúng ta cố gắng truy cập vào một biến ra khỏi phạm vi?
Là một câu hỏi?
HỌC SINH: Vâng.
HANNAH: Beautiful.
Vì vậy, có lẽ, bạn sẽ nhận được một lỗi định không khai báo thay thế.
Vì vậy, nó chỉ sẽ nói Tôi không biết đó là những gì.
Cool, bất cứ điều gì khác?
Yeah, OK, xinh đẹp.
>> Tất cả righty, vì vậy đệ quy.
Vì vậy, tôi đã đề cập một vài lần rằng chúng ta có thể nhận được một chồng tràn
bởi vì chúng tôi đang gọi điện thoại của chúng tôi hàm đệ quy rất nhiều lần.
Chúng tôi đang nhận được tất cả các ngăn xếp khung, blah, blah, blah.
Những gì thậm chí là một hàm đệ quy?
Vâng, một hàm đệ quy là bất kỳ chức năng mà tự gọi mình.
>> Một số điều cần lưu ý khi bạn đang thực hiện chức năng đệ quy,
không quên bao gồm một trường hợp cơ sở.
Một trường hợp cơ sở là điểm mà tại đó chúng tôi kết thúc.
Vì vậy, ví dụ, nếu chúng ta đang mã hóa, , Nói, Fibonacci đệ quy,
chúng tôi muốn chắc chắn rằng khi chúng tôi nhận được đến 0 hoặc số Fibonacci đầu tiên,
hai con số có những trường hợp này, bởi vì những người không phải phụ thuộc
về những điều mà đến trước.
Những người có giá trị riêng của họ.
>> Một số ưu để đệ quy, mà là một Câu hỏi chúng ta đã nhìn thấy trên các câu đố qua.
Họ có thể dẫn đến nhiều ngắn gọn, mã thanh lịch.
Và rất nhiều chức năng, một rất nhiều thuật toán khác nhau,
thực sự là đối tượng của đệ quy.
Định nghĩa của họ có thể là đệ quy trong và của chính nó.
Vì vậy, Fibonacci là một.
Thừa là một.
Hợp nhất phân loại là one-- tất cả những điều mà bạn có thể nhìn vào.
OK, bất kỳ câu hỏi?
Có?
>> SINH VIÊN: Là một trường hợp góc tương tự như một trường hợp cơ sở?
Hoặc là đối với một số khác loại [không nghe được]?
>> HANNAH: Chắc chắn, do đó, một trường hợp góc là any-- vậy
là trường hợp góc giống như trường hợp cơ sở?
Một góc trường hợp là bất cứ điều gì của bạn mã có thể hành xử một chút khác nhau.
Trường hợp cơ sở được loại liên quan, trong rằng họ đang như trường hợp đặc biệt
mà bạn muốn xem xét.
Tuy nhiên, ý tưởng về một trường hợp cơ sở là bạn muốn hàm đệ quy của bạn
dừng lại ở một số điểm.
Nó không thể giữ tự xưng là mãi mãi.
Nó cần phải dừng lại ở một số điểm.
>> ROB: Có, thường xuyên, trường hợp cơ sở của bạn có thể là ví dụ về các căn cứ góc.
>> HANNAH: Đúng, mát mẻ, bất cứ điều gì?
>> HỌC SINH: bạn có thể giải thích căn cứ hơn một chút?
Tôi hoàn toàn không hiểu [Không nghe được] trường hợp cơ sở.
>> HANNAH: Trong trường hợp cơ sở?
>> HỌC SINH: trường hợp cơ sở, yeah.
>> HANNAH: Oh yeah, chắc chắn.
Hãy xem.
Chúng ta đã phấn hơn ở đây?
Có, chúng tôi làm.
OK, vì vậy thực sự nhanh chóng, tôi sẽ cố gắng viết đủ lớn
vì vậy bạn có thể thấy trên màn hình.
Hãy nói về, thực sự nhanh chóng, Fibonacci.
Vì vậy, tôi sẽ cung cấp cho bạn dãy Fibonacci.
Bạn có thể tìm kiếm các định nghĩa.
>> Về cơ bản, mỗi số trong dãy là tổng của hai số trước đó.
OK, vì vậy cách mà tôi vừa mô tả Fibonacci,
bạn có thể nghe thấy đệ quy, phải không?
Khi tôi nói mỗi số là tổng của hai số trước,
chúng ta có thể nói OK.
Vâng, Fibonacci thứ n number-- vì vậy hãy
nói rằng chúng ta có chức năng này gọi fib fib-- của n
là có được bằng fib của n trừ đi 1 plus-- xin lỗi,
chúng tôi sẽ đi vào dòng tiếp theo trên fib here-- của n trừ đi 2.
>> OK, vì vậy điều này làm việc tuyệt vời nếu bạn nhìn vào, ví dụ, không, một,
hai, ba, bốn, số Fibonacci thứ năm,
nơi bạn có thể nói rằng 5 tương đương với 2 cộng với 3.
Nhưng nếu bạn đang ở đầu?
Điều gì nếu bạn chỉ cần nhấn hai giá trị đầu tiên này?
>> Để có được 1 này, bạn có thể không nói thêm trước đó hai,
bởi vì đó không và- Tôi không biết.
Vì vậy, tại một số điểm, chúng ta cần phải dừng lại.
Tại một số điểm, chúng ta cần phải nói rằng những hai chỉ có định nghĩa riêng của họ.
Các số Fibonacci 0 là 0.
Và số Fibonacci đầu tiên là 1.
>> Vì vậy, cách tôi có thể mã này, tôi sẽ nói gì nếu n là ít hơn hai,
sau đó chỉ cần quay trở lại n.
Và đó sẽ là trường hợp cơ sở của tôi.
Đó là cách mà tôi biết để ngăn chặn với một hàm đệ quy.
Là rõ ràng?
Tuyệt vời.
Bất cứ điều gì khác trên đệ quy?
Đẹp.
>> Hãy nhanh chóng nói về tìm kiếm và thời gian chạy loại.
Và sau đó tôi sẽ cung cấp cho một số Davin thời gian để nói về mã hóa ví dụ.
Vì vậy, đây là tìm kiếm chính và các loại mà bạn nên biết.
Guarantee-- tôi không thể đảm bảo, bởi vì tôi đã không nhìn thấy quiz--
nhưng điều này đi lên đố sau khi bài kiểm tra sau khi bỏ thuốc lá.
Vì vậy, chắc chắn sử dụng biểu đồ này.
Giống như, có biểu đồ này.
Đặt nó vào cheat sheet của bạn.
Bạn sẽ là một người hạnh phúc.
>> Điều này cho chúng ta biết thời gian chạy của mỗi của các thuật toán sắp xếp và tìm kiếm.
Vì vậy, tìm kiếm tuyến tính, bạn có thể nhìn thấy chạy thời gian, và cùng với tìm kiếm nhị phân.
Đi qua những gì các thuật toán làm, ý tưởng chung.
Nhìn vào một số giả, nếu không mã chính nó.
>> Bạn sẽ thấy rằng bong bóng sắp xếp có một trên ràng buộc trong trường hợp tồi tệ nhất của n bình phương.
Vì vậy, nếu mảng của chúng tôi là hoàn toàn ngược trước khi chúng tôi muốn sắp xếp nó,
chúng tôi sẽ nói rằng đó là sẽ thực hiện các bước n bình phương.
Nhưng trong trường hợp tốt nhất, do đó, thấp hơn giới hạn cho các trường hợp tốt nhất
là có được nếu nó đã hoàn toàn được sắp xếp.
Sau đó, tất cả chúng ta phải làm là kiểm tra xem nó được sắp xếp.
Có một câu hỏi ở đây?
>> HỌC SINH: Khi sẽ bạn muốn sử dụng loại?
Việc sắp xếp.
Tôi chỉ tò mò.
>> HANNAH: Khi bạn sẽ muốn sử dụng lựa chọn loại?
Này?
Một trong đó là n bình phương trong cả hai trường hợp?
>> HỌC SINH: [không nghe được].
>> HANNAH: Vì vậy, nó rất khác nhau.
Nếu bạn có cụ thể yêu cầu đối với chương trình của bạn,
giống như những thứ như thế nào nếu chúng ta chỉ nói thực hiện một sorry-- search--
thực hiện sắp xếp, bạn sẽ có thể muốn đi
cho một trong những người mà có một trường hợp tốt nhất của n,
hoặc thấp hơn bị ràng buộc trong trường hợp tốt nhất của n.
Nhưng có thể có những điều nào đó như, nói,
giao dịch hoán đổi thực sự đắt đối với một số lý do.
Sau đó, bạn sẽ muốn làm bong bóng sắp xếp, bởi vì bạn
phải làm như vậy nhiều giao dịch hoán đổi, những điều như thế.
Bất kỳ có other--?
>> HỌC SINH: Nó sẽ được [không nghe được] để nói rằng [không nghe được]?
HANNAH: Đó là một điều rằng sẽ cho bạn biết
nếu bạn đang nhìn vào thực hiện.
Con đường tôi sẽ thực sự suy nghĩ về lý do tại sao nó là n
squared là chúng ta phải chạy thông qua các mảng của chúng tôi có độ dài n,
mỗi lần làm nhiều nhất, n giao dịch hoán đổi.
Và chúng ta phải làm quá trình này n lần.
>> Vì vậy, khi bạn phải thực hiện nhiều nhất, n giao dịch hoán đổi và cho n chạy qua mảng,
có sẽ được n bình phương.
Nhưng có, điều này sẽ được tiết lộ thông qua đôi này cho vòng lặp,
như câu hỏi asked-- hoặc lồng nhau cho vòng lặp, tôi nên nói.
OK?
>> Và sau đó hợp nhất phân loại, mà là loại nhanh nhất, chúng tôi bây giờ,
hoặc mà chúng tôi đã đề cập trong CS50, biết rằng các thuật toán chính là
ý tưởng này đột nhập vào phần được sắp xếp và sau đó
sáp nhập cùng các bit được sắp xếp.
Và sẽ được chúng tôi đăng nhập n log n.
Bất kỳ câu hỏi về tìm kiếm và các loại trước khi tôi vượt qua nó trên?
Hãy xem.
>> Oh, danh sách liên kết.
Xin lỗi, tôi có thêm một chủ đề.
OK, tuyệt vời, danh sách liên kết.
Vấn đề với các mảng, họ có một kích thước cố định.
Vì vậy, nếu bạn không biết làm thế nào lớn đầu vào của bạn là có được,
bạn không muốn tạo ra một mảng.
Bởi vì nếu chúng ta tạo ra một mảng đó là quá nhỏ,
chúng ta có thể chạy vào lỗi tràn bộ đệm.
>> Vì vậy, thay vào đó, chúng ta có thể làm điều gì đó với danh sách liên kết, mà
cho phép chúng ta có một động cấu trúc dữ liệu có kích thước
mà sẽ cho phép chúng ta lưu trữ một số lượng linh hoạt hơn của dữ liệu.
Vì vậy, trong mỗi nút trong của chúng tôi danh sách liên kết, chúng tôi có hai miếng.
Chúng tôi có giá trị thực tế mà nó lưu trữ.
Vì vậy, đó chỉ là những điều bạn sẽ thấy trong mảng, ví dụ.
Và sau đó chúng tôi cũng theo dõi một con trỏ để điều tiếp theo trong bộ nhớ.
>> Không giống như mảng, mà chúng ta biết là tất cả sẽ
để be-- phần tử mảng đều là một sau khi một trong memory-- liên kết
danh sách có thể là bất cứ nơi nào trong bộ nhớ.
Họ là các vị trí tùy ý.
Vì vậy, nếu chúng ta thực sự đi tìm họ, chúng tôi
cần theo dõi Điều tiếp theo trong danh sách của chúng tôi.
>> Và sau đó để biết nơi danh sách đó như một toàn thể là,
tất cả chúng ta phải theo dõi là yếu tố đầu tiên trong danh sách liên kết của chúng tôi.
Và điều đó sẽ cho phép chúng tôi theo dõi suốt.
>> Vì vậy, đây là cách bạn có thể xác định một chế độ.
Đây là một cơ hội tuyệt vời để tận dụng lợi thế của cấu trúc.
Bởi vì bạn có ý tưởng này, tốt, cho một nút cho trước, tôi có hai miếng.
Tôi có giá trị thực tế bản thân.
Và sau đó tôi có một con trỏ đến phần tử tiếp theo trong danh sách liên kết.
Vì vậy, bạn thấy, chúng tôi có một số nguyên n, mà là có được giá trị thực tế,
và sau đó một con trỏ đến một nút, được gọi tới.
Vì vậy, đó sẽ là người tiếp theo phần tử trong danh sách liên kết của chúng tôi.
HỌC SINH: Vâng?
Bạn phải xác định rằng ngôi sao giống như một cấu trúc?
>> HANNAH: Vâng, như vậy kể từ này gần như là một loại,
nó có vẻ như một đệ quy định nghĩa trong chúng ta mà
cần phải biết những gì một nút là bên trong để tìm kiếm một nút.
Kể từ khi nó không thực sự biết những gì một nút là hoàn toàn
cho đến khi chúng tôi nhận được đến cuối this-- và sau này, chúng tôi chỉ có thể gọi nó
một node-- bên trong định nghĩa này, chúng ta cần phải gọi nó là một cấu trúc nút.
Great câu hỏi.
Bất cứ điều gì khác?
Có?
>> HỌC SINH: Tại sao chúng ta phải nói nút hai lần?
Bởi vì khi chúng tôi ở [không nghe được] chúng tôi chỉ cần có để làm điều đó trong dấu chấm phẩy,
nhưng bây giờ chúng ta phải thấy rằng cấu trúc nút? [Không nghe được].
HANNAH: Vì vậy, tôi tin rằng trong ví dụ cuối cùng,
chúng tôi chỉ tạo ra bất cứ lúc nào bạn muốn sử dụng một sinh viên sau đó, bạn
đã phải sử dụng cấu trúc node-- Tôi sorry-- struct sinh viên.
Điều này cho phép chúng tôi, sau khi thực tế, chỉ cần nút sử dụng thêm một loại mới, về cơ bản.
Điều đó làm cho tinh thần?
Vì vậy, chúng tôi phải quay trở lại và nhìn vào các mã trước.
Nhưng tôi đoán rằng chúng tôi không sử dụng typedef.
Và chúng tôi hỏi những câu hỏi, tại sao chúng ta cần phải sử dụng typedef?
Typedef cho phép chúng ta tránh những cấu trúc từ trong đầu.
Có?
HỌC SINH: Những loại câu hỏi sẽ đi lên
về về các nút và các danh sách liên kết?
>> HANNAH: Vì vậy, có một điều chúng ta có thể nói như thế nào bạn có thể tìm kiếm thông qua một danh sách liên kết?
OK, vì nó là một ít phức tạp hơn
hơn nếu chúng tôi đang tìm kiếm thông qua một mảng.
Chúng tôi chỉ có thể nhìn vào yếu tố không, phần một, phần hai, blah, blah,
blah.
Nếu chúng ta muốn tìm kiếm thông qua một danh sách liên kết,
chúng tôi thực sự phải làm theo mê cung này ít của con trỏ.
Vì vậy, hãy thực sự đi thông qua điều này thực sự nhanh chóng.
Những gì chúng tôi có thể làm trong đặt hàng đối với: hãy nói chúng tôi
muốn chỉ cần lặp qua danh sách của chúng tôi hoàn toàn liên kết.
Chúng tôi sẽ bắt đầu từ đầu.
Và sau đó để di chuyển đến phần tử tiếp theo,
thay vì chỉ incrementing bởi một như chúng tôi có thể trong đi qua một mảng,
chúng tôi đang thực sự đi vào theo con trỏ tới,
vì vậy chúng tôi có thể tìm thấy nơi ở bộ nhớ các yếu tố tiếp theo là.
Vì vậy, tôi biết điều đó là không đủ để mất tất cả điều này ngay bây giờ,
nhưng bạn sẽ có những slide.
Vì vậy, bạn có thể đi qua này chậm hơn một chút.
Nhưng về cơ bản, những gì chúng ta muốn làm là theo các con trỏ
thông qua toàn bộ các danh sách liên kết.
Vì vậy, đây là một câu hỏi bạn có thể được yêu cầu.
>> Một cái gì đó để thông báo với chèn, chúng ta hãy nói
chúng tôi muốn đặt một nguyên tố mới ở phía trước của danh sách liên kết của chúng tôi.
Chúng tôi phải rất cẩn thận về thứ tự trong đó chúng ta
bố trí các con trỏ.
Bởi vì chúng ta hãy nói rằng tôi chỉ nói OK.
Hãy điểm đầu đến yếu tố mới này.
Chỉ cần làm cho nó trỏ tới 1 Sau đó, chúng tôi đã về cơ bản bị mất phần còn lại của danh sách của chúng tôi,
bởi vì tôi không nhớ nơi 2 cuộc sống.
>> Vì vậy, chúng ta phải làm trong một trật tự rất cụ thể.
Đầu tiên, chúng tôi làm mới điểm yếu tố để các đầu.
Và sau đó chúng tôi làm cho đầu trỏ đến các yếu tố mới.
Vì vậy, chúng ta hãy xem những gì mà trông giống như với arrows-- chỉ như thế.
Vì vậy, trước tiên bạn phải mới điểm yếu tố để các đầu cũ.
Và bây giờ, chúng tôi có người đứng đầu trỏ đến các yếu tố mới đầu tiên.
Bất kỳ câu hỏi với điều này?
>> OK đây là một số mã một lần nữa, một cái gì đó nhìn một chút sau đó.
Và bây giờ tôi sẽ chuyển nó qua cho Davin cho GDB và một chút chút thực hành
mã hóa trên giấy.
Đẹp.
>> ROB: Và Rob.
>> HANNAH: Oh, Davin và Rob.
Tôi xin lỗi.
>> HỌC SINH: Woo!
>> ROB: Cảm ơn.
>> Davin: Bạn có muốn nói tất cả mọi thứ nhanh chóng thực?
ROB: Yeah, yeah.
Davin: Khi tôi lên.
OK, trong khi Rob đặt microphone trên, vì vậy GDB là gì?
Mọi người nên đã thấy trong GDB lớp và cũng có lúc giờ hành chính.
Và bạn nên sử dụng nó.
Vì vậy, GDB là gì?
Bất kỳ ai?
>> HỌC SINH: Đó là một trình gỡ lỗi.
>> Davin: Đó là một trình gỡ lỗi.
Và những gì nó cho phép bạn làm gì?
Giống như, tại sao chúng ta thích GDB?
HỌC SINH: Để làm chậm chương trình.
Davin: Đúng, vì vậy bạn có thể đi bộ qua nó như tốc độ của con người.
Và như vậy là những gì một số lệnh bạn có thể làm gì?
Vâng, có lẽ là nghỉ lệnh yêu thích của bạn.
Bởi vì đó là cho phép bạn phá vỡ chương trình và thực sự đi qua nó
từng dòng.
>> Run cho phép bạn chạy nó.
Tiếp theo, giống như bước qua.
Là gì giữa tiếp theo và bước?
Chờ đợi, nói ra điều đó.
Đó là chính xác.
>> HỌC SINH: [không nghe được].
>> Davin: Vâng, tuyệt vời.
Vì vậy, như thế nào, bước tiếp theo, và nếu you're-- chúng ta hãy nói rằng bạn có một chức năng bạn
xác định.
Hãy nói rằng một số chức năng chính của bạn, và bạn chỉ cần nhấn tiếp theo, tiếp theo,
tiếp theo.
Bạn đang thực sự đi vào thực hiện chức năng,
nhưng bạn sẽ nhảy qua nó.
Nếu bạn nhấn bước, hoặc s hoặc bất cứ điều gì, bạn
sẽ thực sự nhảy vào chức năng,
và sau đó bạn có thể nhấn tiếp theo để xem các cuộc gọi khác nhau
bên trong có chức năng cụ thể.
Yeah?
>> HỌC SINH: Có cách nào để nhảy, như, sao ra?
Davin: Finish, yeah, kết thúc với nhảy bạn ra ngoài.
Vì vậy, nó sẽ kết thúc mà chức năng, và sau đó bạn
sẽ trở lại trong chính, ví dụ.
In sẽ in ra một lần.
Một cái gì đó tôi luôn luôn sử dụng là màn hình hiển thị.
Màn hình sẽ in ra liên tục trong suốt toàn bộ
chương trình của bạn.
>> Ví dụ, nếu bạn trong một vòng lặp, và bạn
muốn xem làm thế nào một cái gì đó đang thay đổi, và bạn không muốn, như thế, liên tục
được làm như in, in ấn, in ấn, màn hình hiển thị
sẽ hiển thị biến liên tục, mỗi khi bạn nhấn Next.
Và tiếp tục.
Vì vậy, GBD, đó là GDB.
>> HỌC SINH: một là gì nơi bạn [không nghe được]?
Davin: nó là gì?
>> HỌC SINH: Có gì the-- các biến địa phương.
ROB: Có một cái gì đó thực sự như người dân địa phương hoặc một cái gì đó.
Tôi can't--
>> Davin: Nó có thể là một cái gì đó như thế, yeah.
>> HANNAH: Trong dân địa phương?
>> Davin: Đó là nó.
Đó là một trong những.
ROB: Beautiful.
>> Davin: Yeah.
>> HỌC SINH: Điều gì không tiếp tục làm gì?
>> Davin: Nó continues-- vì vậy nó chỉ sẽ tiếp tục chương trình của bạn.
Vì vậy, nếu bạn phá vỡ và nhấn tiếp tục, nó sẽ
chỉ cần chạy chương trình cho đến khi nó chạm nghỉ đó một lần nữa.
Vì vậy, ví dụ, nếu bạn đã phá vỡ trong một chức năng,
và bạn sẽ làm như thế nào cho vòng lặp hoặc một cái gì đó như thế,
và bạn nhấn tiếp tục, nó sẽ tiếp tục và trở lại nghỉ đó.
Hoặc không có giờ nghỉ, nó sẽ tiếp tục và kết thúc chương trình.
>> ROB: Vì vậy, chỉ muốn dừng chạy tại các điểm dừng đầu tiên
bạn nhấn, nếu sau đó bạn nhấn tiếp tục, nó sẽ giữ
đi cho đến khi nó là điểm dừng tiếp theo.
Và sau đó tiếp tục sẽ đi với breakpoint tiếp theo.
Davin: Bất kỳ câu hỏi khác trên GDB?
Vì vậy, tôi nghĩ rằng trong quá khứ, chúng tôi đã hỏi bạn những gì
GDB là và đưa ra một ví dụ về một số điều bạn
có thể làm với GDB, vì vậy thực sự đơn giản, nhưng yeah.
Có bạn đi.
Và nút?
>> ROB: Vâng, vậy mà hướng là nó?
HỌC SINH: Đó là nó.
Davin: Chờ.
ROB: Anh chàng này?
Davin: Đó là một trong.
ROB: Anh chàng này, oh, tôi đã không nhận ra.
Vì vậy, chúng tôi đã không rõ ràng về những gì tôi the-- không
biết nó was-- nhưng câu hỏi.
Chúng tôi không biết chính xác những gì bạn được hỏi về nó, vì vậy chỉ
để làm rõ một cái gì đó.
Vì vậy, đầu tiên, như tôi đã nói trước đây, typedef bạn luôn luôn sử dụng chỉ
tạo ra một biệt danh cho một loại.
Vì vậy, ngay tại đây, biệt danh chúng tôi việc tạo là cho loại cấu trúc nút.
>> Vì vậy, đầu tiên, bỏ qua nút này trong typedef, vì vậy đây cấu trúc nút xoăn
cú đúp xuống xoăn tiếp theo cú đúp là cấu trúc kiểu nút.
Và chúng ta cần phải nút đó ở đó, bởi vì chúng tôi
cần phải tham khảo nút ở đây.
Vì vậy, với loại này của cấu trúc đệ quy, bạn cần phải cung cấp cho struct này một cái tên,
hoặc nếu không bạn có thể không nói cấu trúc nút ở đây.
Trong khi đó, trước khi có sinh viên khi chúng tôi đang đánh máy, tôi nghĩ rằng,
chúng tôi đã không phải nói sinh viên lên ở đó, bởi vì chúng tôi
không phải nói cấu trúc sinh viên bên trong cấu trúc của chính nó.
Vì vậy, nó là đệ quy buộc chúng ta phải nói nút đó.
>> Nút này chỉ là tên chúng tôi cho nút cho typedef.
Vì vậy, nút đó không phải là giống như nút đó.
Nhưng nút cấu trúc này là tương tự như nút struct.
Davin: Vì vậy, bất cứ khi nào bạn gọi, như, nút chức năng chính của bạn,
bạn sẽ không phải nói struct node.
Bạn chỉ có thể nói nút, bởi vì nút là một different-- về cơ bản là
bạn đang nói, OK.
Thay vì phải gọi nút cấu trúc trong mã của tôi,
Tôi chỉ muốn đổi tên nó như nút để làm cho nó dễ dàng hơn.
>> ROB: Nếu bạn luôn luôn sử dụng typedef, sau đó này
là nơi duy nhất bạn sẽ có để khai báo một biến với cấu trúc nút
ngôi sao, yeah.
>> Davin: OK, vì vậy phần cuối cùng là khó dạy because--
ROB: Cái gì?
>> Davin: Bởi vì nó được mã hóa trên giấy.
Vì vậy, mỗi năm chúng tôi có mã trên câu hỏi giấy.
Vì vậy, tôi nghĩ rằng năm ngoái, 12 trong số 80 điểm là mã trên giấy.
Năm trước đó, 10 trong số 80 năm trước đó, 20 trong số 100,
vì vậy khá một vài trong số này.
Vì vậy, bạn sẽ có để có thể mã lên các chức năng này bằng tay.
>> Vì vậy, tôi nghĩ chúng ta có thể đi qua một vài trong số họ và xem cách mọi người làm,
loại đi bộ qua chúng từ từ với mọi người.
Vì vậy, nói chung, và strlen atoi đã rất phổ biến.
Năm ngoái, tôi nghĩ rằng chúng tôi đã có GetPositiveInt và RandomInt.
Nhưng pow, vì vậy quyền lực, cũng một tích cực quá.
Hãy chỉ cần đi qua có thể một hoặc hai trong số này lại với nhau.
Những gì người ta muốn xem?
>> HỌC SINH: atoi.
HỌC SINH: Yeah.
Davin: atoi?
HỌC SINH: [không nghe được].
Davin: OK, tôi sẽ để làm điều đó trên diễn đàn.
Bạn có một sở thích nếu tôi làm điều đó ở đây hay không?
Có, Gabe nói rằng có.
>> ROB: Và đây là suy nghĩ chung về những câu hỏi mã hóa.
Hãy thử viết một cái gì đó.
Đừng để trống.
>> Davin: Có.
ROB: Nếu bạn có thể nhận được trả lại đúng loại,
hoặc có lẽ chúng ta có thể cung cấp cho nó để bạn, nhưng nếu bạn có thể, như,
viết chữ ký chức năng nói chung, Nếu bạn có thể nhận được các trường hợp cơ sở chính xác,
hoặc trường hợp góc, hoặc nhớ kiểm tra cho null,
miễn là bạn có một số điều trên, thì có lẽ chúng ta
có thể cung cấp cho bạn một vài chỉ cho vấn đề.
Không chỉ để trống.
>> Davin: Vâng, và nếu bạn chỉ hoàn toàn
bối rối như thế nào để thực sự biến thành mã.
Nếu bạn viết mã giả, đó là khá tốt quá.
Vì vậy, nó là như thế, nó là một câu hỏi sáu điểm, và bạn viết mã giả chính xác,
bạn sẽ nhận được ít nhất hai điểm.
Vì vậy, không chỉ để lại cho họ trống.
Hãy thử đặt một cái gì đó.
>> ROB: Nó cần phải được đúng giả, mặc dù.
>> Davin: Có.
ROB: Vì vậy, chúng ta thường ít khoan dung với lỗi trong mã giả.
Davin: OK, vậy các bạn muốn xem atoi.
OK, vì vậy chỉ cần really-- vì vậy những gì bạn muốn làm
là bạn sẽ được đưa ra một số loại số.
Nhưng con số này không phải là sẽ là một int, phải không?
Nó là những gì sẽ được?
>> HỌC SINH: [không nghe được].
>> Davin: Nó sẽ là một chuỗi, phải không?
Vì vậy, nếu bạn đã được đưa ra một string-- hãy say--
>> ROB: Tôi có nên kéo lên một biên tập viên?
Tôi có thể kéo up--
>> Davin: Oh, bạn muốn làm điều đó on--
>> ROB: Bạn có thích hội đồng quản trị?
>> Davin: Những gì bạn muốn làm gì?
Tôi có nghĩa là, bạn muốn làm điều đó bằng tay?
Hoặc bạn có muốn làm điều đó bằng máy tính?
>> ROB: Làm điều đó bằng tay.
>> Davin: [Cười]
ROB: Làm điều đó bằng tay.
>> Davin: OK, vì vậy nó sẽ là atoi.
Vì vậy, những gì it-- Ý tôi là, chúng ta sẽ có thể đưa cái này cho bạn.
Nhưng những gì nó sẽ trở lại?
>> HỌC SINH: Int.
>> Davin: Nó sẽ trở lại int, phải không?
So-- tôi không muốn làm điều đó ở đó.
Tôi sẽ làm điều đó ở đây.
>> ROB: Bạn có thể kéo nó xuống và sau đó đẩy lên trên nó.
>> Davin: yeah.
[Cười] Trò chơi thay đổi.
OK, vì vậy nó sẽ là int atoi, và những gì nó sẽ mất?
Một ngôi sao char, vì vậy chỉ cần một chuỗi, sao s, như thế.
>> ROB: Nice sao, tốt đẹp.
Davin: Điều này có thể không có mặt ở đó, OK.
ROB: Yeah.
Davin: OK, vì vậy đầu tiên điều bạn muốn do-- tôi
không biết nếu bất cứ ai nhìn tại solutions-- thực hành
nhưng những gì bạn đang đi muốn làm là bạn
sẽ muốn có một vòng lặp, bởi vì bạn
sẽ muốn thực sự bước qua chuỗi này.
Vì vậy, helpful-- vì vậy hãy nói chúng ta sẽ một cho vòng lặp,
và chúng ta sẽ bước qua mọi phần tử của chuỗi.
Làm thế nào lâu như vậy?
Đã bao nhiêu lần chúng ta sẽ để lặp lại trong đó cho vòng lặp?
HỌC SINH: Sterln?
Davin: Sterln, yeah.
Vì vậy, hãy nói int chiều dài bằng sterln s.
Và chỉ tò mò, tại sao nó luôn luôn là loại của tốt hơn để làm bên ngoài này của các vòng?
Giống như, tại sao nó tốt hơn để gọi chức năng này bên ngoài của một vòng lặp?
Chỉ cần một sự tỉnh táo nhanh chóng kiểm tra?
Yeah?
SINH VIÊN: Vì vậy, bạn không phải tiếp tục kiểm tra nó.
Bạn chỉ có thể [không nghe được].
>> Davin: Chính xác, vì vậy yeah, chính xác những gì cô nói.
Vì vậy, chúng tôi không cần phải liên tục kiểm tra nó.
Vì vậy, ví dụ, nếu tôi gọi chức năng này bên trong một vòng lặp,
sau đó tôi sẽ tiếp tục gọi chức năng này nhiều lần.
Và đó là sẽ giảm hiệu quả của các chương trình của bạn.
Vì vậy, nó luôn luôn hữu ích tuyên bố nó bên ngoài.
>> ROB: Đó là nói trên bất kỳ của những vấn đề này,
khá nhiều miễn là bạn có được một giải pháp làm việc, bạn nhận được tín dụng đầy đủ.
Vì vậy, đừng lo lắng nếu thiết kế của bạn là hoàn toàn khủng khiếp.
Nó có thể làm cho chúng ta khó chịu đọc mã của bạn.
Nhưng miễn là nó hoạt động, bạn sẽ nhận được điểm.
>> Davin: Có.
OK, vậy thì tôi sẽ khai báo một số biến.
Nó chỉ sẽ gọi int sum.
Và tôi sẽ thiết lập này bằng không, như thế.
Và đó là chỉ cần đi là một giữ chỗ.
Vì vậy, đó sẽ là những gì tôi sẽ trở lại.
Vì vậy, tôi sẽ dần dần trả lại số tiền ra khỏi chương trình này.
Vì vậy, tôi có hai biến.
Tôi có chiều dài.
Tôi có tiền.
Và bây giờ hãy nhảy vào chuỗi của chúng tôi.
>> Vì vậy, cho phép chúng tôi có cho vòng lặp.
Vì vậy, bốn int tôi bằng 0 w, trong khi Tôi là ít hơn so với chiều dài cộng với cộng với tôi.
Và now--
ROB: Nice.
Davin: OK, và bây giờ ở đây đến thịt của mã của chúng tôi.
Vì vậy, bạn thực sự có thể làm về cơ bản này trong một dòng.
Vì vậy, không ai có một ý tưởng của những gì chúng ta sẽ làm gì tiếp theo?
OK, vì vậy đó là OK.
Vì vậy, chúng tôi đang làm để nói tổng equals-- cho tôi chuồn tổng over-- này
bằng 10 lần số tiền plus-- chúng tôi sẽ mất của tôi trừ một
quote 0 một trích dẫn thực hiện, như thế.
ROB: Rất trực quan.
>> Davin: dăm nó.
OK, vì vậy someone-- tôi đã nhận nó, tôi đã nhận nó.
OK, vì vậy đây là rõ ràng đi lên.
Điều này có nghĩa gì?
Vì vậy, không ai biết điều này có nghĩa?
Tất cả mọi người có thể thấy điều này?
Không, không ai có thể thấy điều này, OK.
Tôi sẽ đối với:
>> ROB: Tôi sẽ viết sữa đúng ở đây.
Davin: OK, Rob sẽ làm điều đó trên máy tính, đó là niềm vui.
ROB: Ôi Chúa ơi.
Hoặc tôi sẽ không.
Davin: Stand by.
HỌC SINH: Tôi có một câu hỏi.
Davin: Ừ, chắc chắn.
HỌC SINH: [không nghe được]?
Davin: OK, vì vậy nó thực sự, như thế, chỉ nói chung,
nếu bạn đã đặt, như thế, trong int khai này
Tôi bằng chiều dài 0 dấu phẩy bằng sterln, that--
>> HỌC SINH: [không nghe được].
>> Davin: Đó là tốt, bởi vì that--
HỌC SINH: Tại sao bạn thậm chí cần phải sử dụng chiều dài?
Tại sao có thể chúng ta không chỉ [không nghe được] sterln s, giống như toàn bộ thời gian [không nghe được]?
>> Davin: Bạn có nghĩa là ngay tại đây?
>> HỌC SINH: Vâng.
Davin: Bởi vì mỗi lần này cho vòng lặp chạy,
nó sẽ đánh giá tình trạng này.
HỌC SINH: Đúng vậy.
Davin: Và nếu bạn có sterln có, thì đó là
sẽ phải thực sự gọi mà chức năng mỗi lần duy nhất.
Vì vậy, thay vì chỉ so sánh nó với một int,
bạn sẽ được gọi một chức năng và sau đó so sánh nó
với giá trị trở lại.
Yeah, vì vậy nó chỉ là, yeah.
>> Nice, OK, vì vậy bây giờ tất cả mọi người có thể nhìn thấy nó.
Có gì does-- này là như thế, đây là nó.
Đây là mứt, ngay tại đây.
Điều đó có nghĩa gì?
Tôi đang làm gì?
Yeah, một ý tưởng?
Yeah?
>> HỌC SINH: Vâng, vì vậy khi bạn đang bước vào một mảng,
bạn sẽ được đi từ trái sang phải,
do đó, bạn sẽ được đi trong số thập phân từ xuống [không nghe được].
Davin: Chính xác.
SINH VIÊN: Vì vậy, mỗi một bạn phải nhân
những gì bạn nhìn thấy là giá trị của int bởi thời gian bạn có thể di chuyển mà hơn một.
>> Davin: Hoàn hảo, hoàn hảo, ví dụ như vậy, chúng ta hãy
nói rằng tôi đã you-- tôi sẽ viết ở đây.
Không, tôi không.
Tôi sẽ viết ở đây.
Hãy nói rằng tôi đã cho bạn 76, phải không?
Hãy nói rằng tôi cung cấp cho bạn 76.
Đó là một chuỗi để bắt đầu với, OK?
>> Vì vậy, chiều dài là gì?
2, phải không?
Sum là 0.
Sau đó chúng tôi nhảy trong của chúng tôi cho vòng lặp.
OK, phiên đầu tiên của này, những gì nó sẽ được?
Nó sẽ được tổng hợp là 0.
Vì vậy, tổng thời gian 10 0.
Đó là vô nghĩa.
Sau đó, những gì hiện này làm gì?
HỌC SINH: [không nghe được].
>> Davin: Nó sẽ lần lượt là nhân vật vào một số nguyên, phải không?
Đó là loại giống như của bạn vấn đề set-- light-- này
nó là loại giống như với vấn đề thiết lập để VISIONEER.
Bạn đang làm việc với các giá trị ASCII.
Vì vậy, nếu tôi cung cấp cho bạn, như thế, một bảy, nhưng đó là một nhân vật,
và bạn muốn biết, OK, những gì chữ số là?
Yeah, bạn có thể, yeah.
Vì vậy, những gì là chữ số đó?
Bạn có thể trừ đi 0 từ nó, nhưng bạn phải trừ đi 0, nhân vật.
>> Và nơi một số người bị vấp, họ đang
như, OK, tốt, tôi phải biết các giá trị ASCII cho đề thi này?
Không, chắc chắn bạn không cần phải biết ASCII
giá trị, giống như, chữ thường một, chữ hoa A, bằng không.
>> ROB: Không có lý do gì để bao giờ hết đặt này trên bảng cheat.
>> Davin: Chắc chắn không lãng phí không gian của bạn với điều này.
Bạn có thể thay vì chỉ literally-- nói 48, giống như phải lên
có, đó là tương đương với nói một, một dấu nháy đơn,
như vậy, chính xác như nhau.
>> ROB: Bạn gần như có thể nghĩ của nó như if-- Thiên Chúa, tôi cần tôi,
oops-- bạn gần như có thể nghĩ về nó như nếu chúng ta có một cái gì đó giống như băm
xác định 0 48.
Điều đó sẽ không làm việc.
Nhưng nghĩ về nó như báo giá duy nhất 0 báo duy nhất, và cho tất cả các nhân vật.
Hãy suy nghĩ về nó như là một hằng số đại diện cho giá trị ASCII.
>> Davin: Có.
OK, vì vậy lần đầu tiên thông qua, do đó, với 76-- nên thời gian đầu tiên thông qua,
điều này chỉ là nhân vật 7 trừ đi các nhân vật 0,
và những bảy integers-- tốt, những
bảy không gian xa nhau khác trên bảng xếp hạng ASCII hoặc bất cứ điều gì.
Vì vậy, đó là sẽ trả lại một int 7.
Vì vậy, bây giờ, số tiền tương đương với 7.
>> OK, tốt, chúng ta hãy nhảy vào việc này cho vòng lặp một lần nữa.
OK, bây giờ là tổng thời gian 10.
Vì vậy, bạn có hiệu quả 7 di chuyển sang bên trái.
Điều đó có ý nghĩa?
Bạn đang có hiệu quả di chuyển nó sang bên trái.
>> Và sau đó bạn add-- này là có được 6 trừ đi 0.
Đó là 6.
Vì vậy, nó sẽ là 70 cộng với 6.
76, đó là số của bạn.
Vì vậy, bất kể những gì số Tôi đưa cho bạn, nó chỉ chậm
sẽ thay đổi các giá trị lớn hơn bên trái, 1 yếu tố của 10
mỗi lần trong vòng lặp for, và sau đó thêm vào khi cần thiết.
>> Ở phía sau?
SINH VIÊN: Chúng tôi không phải làm bất kỳ kiểm tra trong chương trình?
>> ROB: Vì vậy, như xa như kiểm tra đi cho các chương trình,
chúng tôi sẽ cho bạn biết khá nhiều những gì bạn cần phải kiểm tra.
Nếu chúng ta không nói cho bạn bất cứ điều gì, sau đó nói chung
giả sử bạn phải kiểm tra hầu hết mọi thứ.
Cũng giống như bạn có thể, chỉ để được an toàn, bạn có lẽ nên kiểm tra hey, là s null?
Sau đó, tôi không có ý tưởng gì để quay trở lại.
Nhưng chúng tôi sẽ cho bạn biết các loại điều này.
0, tôi không biết.
>> Davin: Và tại sao bạn muốn để kiểm tra lại nếu s bằng null?
HỌC SINH: [không nghe được].
Davin: Bởi vì char sao.
Đó là một con trỏ.
Vì vậy, một hoàn toàn chấp nhận kê khai, tôi có thể nói, OK,
s bằng null, bởi vì nó có thể là một con trỏ null.
Vì vậy, bất cứ khi nào bạn có con trỏ trong con đường của bạn trong như thế này,
có lẽ bạn nên kiểm tra.
Bởi vì nếu bạn không kiểm tra, và sau đó sau đó bạn đi vào cho vòng lặp,
và bạn đang doing-- chuồn xuống.
Chuồn xuống.
>> ROB: Xin lỗi, đó là nó.
>> Davin: Và như vậy, như thế nào, nếu nó là vô giá trị, và sau đó bạn
làm được điều này, những gì lỗi bạn sẽ nhận được?
HỌC SINH: Bạn sẽ nhận được một lỗi thiết lập.
Davin: Bạn sẽ thiết lập lỗi, phải, bởi vì bạn
cố gắng để chỉ mục vào null.
Vì vậy, bạn sẽ cố gắng để chỉ số vào bộ nhớ mà bạn không sở hữu.
Vì vậy, đây, nếu điều này là vô giá trị, và bạn làm điều này, bạn sẽ thấy chu kỳ.
>> ROB: Tôi cũng nghĩ về kỳ thi, trong đó chúng tôi hỏi câu hỏi này, chúng tôi cho bạn
mà bạn chỉ có thể giả định đó là một số dương.
Bởi vì atoi cũng dự kiến để xử lý các số âm,
vì vậy bạn sẽ phải trường hợp đặc biệt.
Hey, là nhân vật đầu tiên một dấu gạch ngang, trong trường hợp đó, OK,
bây giờ nó là một số nguyên âm.
Chúng tôi sẽ cho bạn biết những thứ như thế.
Chúng tôi sẽ cho bạn biết những gì bạn cần để xử lý.
Davin: Có.
Vì vậy, tôi chắc chắn rằng một số người có thể have-- nếu bạn bắt đầu nhìn vào bài thi trước,
bạn đã nhìn thấy sterln.
Đó là một trong những phổ biến.
Và tôi nghĩ rằng trong sterln, bạn phải thực hiện kiểm tra này cho null, sự trở lại
0 hoặc một cái gì đó như thế.
Giống như, bạn đã có để kiểm tra null.
Và nếu bạn không, mà đã chỉ ra trên các bài kiểm tra.
Vì vậy, dù sao, làm tất cả mọi người cảm thấy OK với atoi?
Có ai muốn đi qua bộ phận một lần nữa?
ROB: Oh yeah, tôi nghĩ chúng tôi cũng cho bạn biết bạn
có thể giả định rằng tất cả mọi thứ mà is-- họ đang thực sự bước vào một số,
bạn không phải lo lắng về, như, thư đang trong chuỗi, do đó.
Davin: Yeah.
Có?
HỌC SINH: Bạn có thể đi trên một lần nữa khi
bạn sử dụng báo giá gấp đôi và giá duy nhất?
>> Davin: Chắc chắn rồi, vì vậy dấu ngoặc kép, rất đơn giản, là dấu ngoặc kép là chuỗi.
Vì vậy, nếu bạn tăng gấp đôi quote bất cứ điều gì, đó là một chuỗi.
Vì vậy, giống như, nếu tôi có điều này 0 trên đây, và tôi đã làm điều này, đó là một chuỗi.
Đó không còn là một nhân vật.
Vì vậy, tôi không thể tìm thấy giá trị này trên ASCII của tôi biểu đồ, bởi vì đó là một chuỗi, yeah.
>> OK, bất kỳ câu hỏi nào khác không?
Có?
>> SINH VIÊN: Vì vậy, bạn đã đã trả lời câu này,
nhưng cũng giống như, khi chúng ta thực sự văn bản này trên các bài kiểm tra,
Bạn muốn chúng tôi viết với chém zero [không nghe được]?
Davin: số
Câu hỏi đặt ra là nên bạn đặt một dấu gạch chéo thông qua các số không
để chỉ ra nếu họ số không?
Không, chúng tôi sẽ tìm ra nó.
Vâng, cảm ơn, họ đang tốt.
OK, bất cứ điều gì khác?
Có ai muốn đối với: vì vậy tôi nghĩ chúng tôi đã chạy một chút thời gian.
Bạn có muốn nhìn thấy nhau, hoặc?
HỌC SINH: RandomInt.
>> Davin: RandomInt, OK, chính xác.
Vì vậy, chúng ta hãy làm RandomInt.
Tôi sẽ làm điều đó ở đây.
Vì vậy, RandomInt thực sự là đơn giản hơn nhiều.
Tôi nghĩ rằng atoi có lẽ là một trong những khó khăn nhất mà chúng tôi đã hỏi trong những năm trước đó.
HỌC SINH: [không nghe được].
>> Davin: Cái gì?
ROB: Tôi nhìn thấy nếu nó là loại của thể xem được từ trên đây.
Davin: Liệu nó?
ROB: Tôi không nghĩ rằng đó là going-- tôi nghĩ nó sẽ chạy ra bên phải.
Davin: OK, vì vậy tôi sẽ làm điều này.
Và sau đó bạn chỉ cần đặt nó trên màn hình.
>> ROB: Tất cả đúng.
>> Davin: Bạn muốn trở thành người ghi chép của tôi?
>> ROB: Yeah.
>> Davin: Nice.
OK, tôi có thể xóa này?
>> HỌC SINH: Yeah.
>> Davin: Đó là khó khăn như vậy.
(Hát) Bạn đang làm những gì bạn đang làm.
Và làm những gì bạn làm không.
Được rồi.
>> OK, nếu tôi nhớ chính xác, trên các bài kiểm tra các RandomInt được như thế,
OK, tôi sẽ cung cấp cho bạn hai số, giống như một một và b.
Và tôi muốn các bạn cho tôi một RandomInt giữa những con số.
Vì vậy, RandomInt sẽ để mất hai numbers--
để RandomInt-- và nó sẽ trả lại một int.
>> Vì vậy, giá trị trả về là gì?
Tôi chỉ nói với bạn.
Int, phải không?
Như thế này, và sau đó nó sẽ mất hai ints.
Vì vậy, nó sẽ mất int a và int b, như thế.
Vì vậy, những gì là RandomInt đi làm là nó sẽ
để trở lại một số giá trị ngẫu nhiên ở giữa hai giá trị.
Vì vậy, nó sẽ là lớn hơn hơn, ít hơn b.
Vì vậy, tôi nghĩ rằng bạn có thể có thể giả định rằng một là nhỏ hơn của hai giá trị.
Vì vậy, nếu chúng ta đang đối phó với ngẫu nhiên, những gì chức năng
Chúng ta đã thấy rằng cho chúng ta những điều ngẫu nhiên?
HỌC SINH: Drand.
Davin: Drand, chính xác.
Vì vậy, bạn sẽ có thể muốn sử dụng drand của bạn.
Vì vậy, bạn có thể nói int ngẫu nhiên, và chúng tôi sẽ chỉ nói nó có bằng 0 ngay bây giờ.
Và họ chúng ta sẽ nói, OK, bình đẳng ngẫu nhiên drand 48.
Và điều này có trở lại?
Những gì hiện chức năng này cung cấp cho bạn?
>> HỌC SINH: Giữa 0 và 1.
>> Davin: Yeah, giữa 0 và 1.
Vì vậy, nó sẽ be--
>> ROB: Và điều này is-- tôi nghĩ chúng tôi sẽ nói với bạn điều này.
Giống như, bạn có thể sử dụng drand 48.
Bạn có thể xác minh điều này trên các kỳ thi vừa qua.
Nhưng chúng ta có thể nói bạn có thể sử dụng drand 48, mà
trả về một phao giữa 0 và 1.
>> Davin: Vâng, vâng, tôi khá chắc chắn về các kỳ thi
nó nói có lẽ bạn muốn sử dụng drand, yeah.
Vì vậy, nó sẽ trở lại một số giá trị giữa 0 và 1.
Và sau đó bạn là gì sẽ muốn làm gì?
Vâng, bạn muốn nhân by-- chờ đợi, tôi nghĩ rằng nó là như thế này, xin lỗi.
Tôi sẽ chỉ làm điều này.
Tôi không biết.
>> Vì vậy, trừ b a.
Vậy tại sao trừ b một?
Vì vậy, hãy nói drand cung cấp cho bạn trở lại một int-- OK, tôi sẽ làm phần còn lại,
như vậy cộng với một.
Vì vậy, những gì does-- y là b trừ đi một.
Vì vậy, hãy nói drand cung cấp cho bạn trở lại giá trị tối đa của nó có thể có thể
cung cấp cho bạn.
Có gì đó sẽ là?
HỌC SINH: 1.
>> Davin: 1, phải không?
Vì vậy, nếu điều này là 1, và bạn nhân nó bằng trừ b một,
tốt, đó chỉ là sự khác biệt giữa trừ A.
Và nếu bạn sau đó thêm rằng trở lại vào một, đó là những gì?
Đó là cơ bản b.
Điều đó có ý nghĩa?
>> HỌC SINH: Vâng.
>> Davin: Vì vậy, nếu điều này là tối đa giá trị của nó có thể có thể được,
nó sẽ là 1.
Và sau đó điều này chỉ là sự khác biệt giữa hai người.
Thêm vào đó, vì vậy đây là sẽ trở lại ngẫu nhiên.
Và trong trường hợp góc drand cung cấp cho bạn trở lại 1,
ngẫu nhiên sẽ chỉ được hiệu quả được b.
Nhưng đó là tối đa có thể được.
Vì vậy, nếu nó sẽ được ít hơn đó, vì vậy chúng ta hãy nói rằng nó giống như 0,9,
như vậy thì 0,9 lần b trừ một là có được ít
hơn sự khác biệt giữa b trừ đi một.
>> Và sau đó nếu bạn thêm rằng vào một, sau đó giá trị đó là
sẽ lớn hơn một, bởi vì bạn đang thêm một cái gì đó vào nó,
nhưng nó sẽ được ít hơn b.
Vì vậy, bạn sẽ nhận được một ngẫu nhiên số lượng, bởi vì bạn đang gọi điện thoại drand.
Và rand rằng, con số ngẫu nhiên là sẽ là một nơi nào đó ở giữa một
và b.
Điều đó có ý nghĩa?
>> ROB: Chỉ cần đặt nó trong số cụ thể, vì vậy
hãy nói rằng chúng tôi muốn chọn một số ngẫu nhiên giữa 7 và 10.
Vì vậy, b trừ đi một là phạm vi của chúng tôi.
Vì vậy, có một loạt các ba số chúng ta muốn lựa chọn.
Và sau đó nhân rằng giữa 0 và 1 1,
nếu mà sau đó cho chúng ta some-- hãy nói cho chúng ta 1.5.
>> Sau đó, 1.5, chúng tôi muốn đi 7-10.
Vì vậy, cộng với 1,5 7 mang đến cho chúng tôi trở lại của chúng tôi 7-10 phạm vi.
Và sau đó chúng tôi đang lưu trữ nó bên trong một số nguyên, do đó, nó rút ngắn xuống còn 8.
Và sau đó chúng tôi chỉ trả lại đó.
Vì vậy, b trừ đi một là phạm vi của chúng tôi.
một thay đổi nó thành những con số mà chúng tôi muốn trong phạm vi đó.
Vì vậy, từ 7 đến 10, và sau đó chúng tôi có thể trả lại những gì chúng ta kết thúc với.
>> Davin: Yeah, tốt đẹp.
>> ROB: Cảm ơn bạn.
>> Davin: Vâng, có chuyện gì thế?
>> SINH VIÊN: Chúng ta chạy nó vào bất kỳ loại Lỗi ASCII khi we're-- nếu drand là
trả lại một float [không nghe được].
>> ROB: Vì vậy, giống như Rob cho biết, bởi vì ngẫu nhiên không phải là một int,
để drand sẽ là một phao.
Vì vậy, và sau đó nó sẽ nhân ra ngoài.
Và bạn có thể nhận được một số loại số phao.
Và sau đó nó sẽ cắt ngắn.
>> SINH VIÊN: OK.
Davin: Yeah.
ROB: Và nếu trình biên dịch là để cảnh báo bạn về, như thế, mất độ chính xác,
chỉ ném một int trong ở đó, và sau đó nó là tốt.
Davin: Vâng?
>> HỌC SINH: Nó sẽ có cùng xác suất nhận,
như, b hoặc a [không nghe được]?
>> ROB: Vì vậy, is-- Tôi thực sự wondering-- là RandomInt phải
là một số từ một đến dưới b?
Giống như, nếu nó từ 7 và 10, khả năng là những gì?
7, 8, và 9, hoặc 7, 8, 9, 10?
Davin: Tôi quên.
Về vấn đề set--
>> ROB: Tôi nghĩ rằng đó là 7, 8, 9.
>> Davin: Nó đặc biệt nói của một người toàn diện và một của độc quyền.
>> ROB: Yeah.
>> Davin: Nhưng tôi don't-- tôi not--
>> ROB: Vì vậy, tôi nghĩ rằng đây là không có, trong trường hợp này,
có một bằng Xác suất của 7, 8, và 9.
Không có xác suất 10.
Davin: Vâng?
HỌC SINH: Tôi có một câu hỏi.
Chúng tôi muốn xác định một chức năng trả về không phải là một giá trị, nhưng một mảng.
Sau đó, những gì sẽ là cú pháp sau khi trở lại?
>> Davin: OK, vậy thì bạn would-- sau khi trở về?
Vì vậy, hãy nói rằng bạn đã tuyên bố một mảng ở một nơi nào đó.
Sau đó, bạn sẽ chỉ trả lại tên của mảng.
>> SINH VIÊN: OK, cảm ơn bạn.
Sau đó chỉ cần trở lại với a--
Davin: Oh chờ đợi, vì vậy xin lỗi.
Câu hỏi đặt ra là làm thế nào Bạn trả lại một mảng.
>> ROB: Mặc dù nó có thể không được một mảng được khai báo
trên stack hay bất cứ điều gì như thế.
Nó sẽ có được một cái gì đó malloced, bởi vì malloc
là làm thế nào bạn có được xung quanh cấp phát bộ nhớ tự động.
>> Davin: Có.
ROB: Làm thế nào bạn có được xung quanh phạm vi địa phương.
>> Davin: Nhưng bạn sẽ chỉ trả lại name-- của nó
>> HỌC SINH: [không nghe được] nó không phải là một giá trị, ví dụ, hai con số, do đó,
[Không nghe được].
>> Davin: Bạn không thể trả nhiều số.
Bạn có thể không, như, return--
>> HỌC SINH: Tôi đã nói chuyện về trở về một mảng hoặc một cái gì đó như thế.
>> Davin: Yeah, vì vậy câu hỏi là Tôi có thể trả lại nhiều giá trị.
Bạn không thể trả lại nhiều giá trị.
Bạn có thể không, như thế nào, sau đó trả về một trở lại b hoặc một cái gì đó như thế.
Bởi vì sau khi bạn quay trở lại, bạn trở lại ra khỏi chức năng.
Và sau đó các chức năng được thực hiện, và như Rob cho biết, là trên stack.
>> Vì vậy, tất cả những bộ nhớ chỉ được trả lại cho máy tính.
Tất cả mọi thứ bị lãng quên, về cơ bản.
Vì vậy, nếu bạn muốn trở lại nhiều giá trị, bạn phải trả lại một mảng,
Và cách bạn làm điều đó là mallocing.
Và sau đó bạn sẽ quay trở lại x như thế.
Về cơ bản, bạn chỉ cần trả lại tên.
Và khi bạn trở về một cái gì đó như thế này, bạn
không thực sự trở về giá trị.
>> Vì vậy, hãy nói rằng bạn được lưu trữ các giá trị trong một mảng.
Bạn không thực sự trở về những giá trị.
Giống như, nếu tôi trở về một int, tôi thực sự quay trở lại bản sao của các giá trị.
Nhưng nếu tôi được trở lại một cái gì đó như thế này,
Tôi trở lại một tài liệu tham khảo để những giá trị.
Vì vậy, tôi trở lại, về cơ bản, một địa chỉ bộ nhớ để các giá trị.
Điều đó có ý nghĩa?
HỌC SINH: Vâng.
Davin: Nice.
Có?
>> HỌC SINH: Khi bạn sử dụng drand trên đây,
Bạn phải đặt srand trước đó?
>> Davin: Không, không, tôi không nghĩ như vậy.
>> ROB: Yeah, vì vậy bạn có để nói bất cứ điều gì về srand?
Mặc định của bạn không bao giờ nói srand ở tất cả là chỉ cần làm srand của null.
Vì vậy, drand trên sẽ làm việc riêng của mình.
Và nó sẽ tự động giống với thời gian hiện tại, là những gì nó sử dụng.
Davin: Vâng?
HỌC SINH: Bạn có [không nghe được] với những con số?
Davin: Vâng, bạn có thể.
SINH VIÊN: Vì vậy, bạn có thể nói, như, 4 lần 2.
Có điều là, bạn không thể giả sau đó một int là bốn byte.
Các only--
>> Davin: Tôi có nghĩa là, đối với các bài kiểm tra bạn có thể.
[Cười]
>> ROB: Mm, không có.
Davin: Vâng, vâng bạn có thể.
Nếu họ yêu cầu bạn lớn như thế nào là một int, bạn không thể, giống như, bốn hoặc tám.
ROB: Oh, vì vậy nếu câu hỏi là cụ thể,
như thế, nếu nó là một vấn đề mã hóa, bạn nên nói kích thước của int.
Nếu nó là một bảng, hoặc nó nói có bao nhiêu byte,
bạn không nên điền vào kích thước của ints.
>> SINH VIÊN: [Cười]
>> Davin: Đúng, vậy tại sao kích thước của int quan trọng ở đây?
Vì vậy, như thế, nếu chúng ta đến 32-bit xử lý hoặc một cái gì đó như thế,
sau đó nó sẽ là bốn byte.
Tuy nhiên, trên một số phiên bản mới hơn công cụ, nó có thể là những gì?
Nó có thể là tám, phải không?
Vì vậy, this-- nếu bạn chỉ cứng mã bốn, sau đó trên một số máy, nó sẽ làm việc.
Một số máy, nó sẽ không làm việc.
Nhưng nếu trên các bài kiểm tra chúng tôi như thế nào lớn là một int?
Đặt bốn.
ROB: Đúng vậy.
Davin: Yeah?
SINH VIÊN: Vì vậy, bởi vì chúng tôi tuyên bố [Không nghe thấy] bên trong một hàm,
chúng ta nên đặt 3 bên trong chức năng đó?
Hoặc chúng ta có thể sử dụng nó bên ngoài?
Davin: Bạn có thể sử dụng nó ngoài chức năng đó.
Vì vậy, ông yêu cầu miễn phí.
>> HỌC SINH: Thua theo dõi nơi [không nghe được].
>> ROB: Oh, miễn phí không happen-- đó là một phần của sự kỳ diệu của malloc
là bạn đang không giới hạn trong phạm vi địa phương.
Bạn có toàn quyền kiểm soát bao lâu biến của bạn sống.
Vì vậy, chúng ta gọi là malloc ở đây, nó có thể là một chức năng hoàn toàn riêng biệt.
Nó có thể là 10 giờ sau đó mà cuối cùng chúng ta gọi miễn phí.
>> Davin: Vì vậy, ví dụ như, một cặp vợ chồng tuần kể từ bây giờ khi bạn cuối cùng
làm Speller từ điển của bạn psets, bạn sẽ
có một số chức năng tạo ra tấn nút.
Vì vậy, bạn đang mallocing tấn của các nút chức năng này.
Và sau đó trong một chức năng riêng biệt, bạn
sẽ muốn giải thoát tất cả các nút.
Vì vậy, bạn có nghĩa là có thể chỉ cần vượt qua để giải phóng một con trỏ, do đó, một địa chỉ bộ nhớ
với những gì bạn malloced.
Và đó sẽ là tốt.
Bạn không cần phải giải phóng, như, trong cùng chức năng.
Có?
>> SINH VIÊN: Vì vậy, một malloc biến [không nghe được] bên ngoài?
Đó là những gì bạn đang nói?
Davin: Chờ đợi, nói rằng?
Xin lỗi.
>> HỌC SINH: Nếu một biến malloc có thể được miễn phí bất cứ nơi nào trong các mã,
sau đó họ có thể được truy cập bất cứ nơi nào trong các mã?
Bạn có thể giữ chúng địa phương?
>> Davin: Oh, cô hỏi, như, biến, like--
>> ROB: Vì vậy, bạn vẫn cần phải có một số loại tài liệu tham khảo
để khối của malloc bộ nhớ.
Vì vậy, ở đây, chúng tôi đang trở về x.
HỌC SINH: Oh.
ROB: Nếu chúng ta không trở về x ở đây, và điều này chỉ là hư vô,
sau đó chúng tôi sẽ không có quyền truy cập vào con trỏ được malloced,
và nó bị rò rỉ bộ nhớ.
>> SINH VIÊN: OK.
>> Davin: Vì vậy, như thế nào, hãy nói rằng bạn có điều này, giống như, ngay tại đây.
ROB: số
Davin: Trong chức năng chính của tôi, tôi không thể chỉ cần gọi x này và có thể được, như thế, OK,
trong chức năng này, tôi đã làm điều này.
>> ROB: Đúng vậy.
>> Davin: Vì vậy, tôi sẽ gọi cho x trong, như, chính hoặc một cái gì đó như thế.
Bạn không thể làm điều đó.
Bạn sẽ trở lại một cái gì đó.
Nhưng những gì thì bạn sẽ trở lại?
Bạn sẽ trả về một địa chỉ bộ nhớ.
Và bởi vì bạn quay trở lại một bộ nhớ địa chỉ, có thể truy cập ở những nơi khác.
Bất kỳ câu hỏi nhiều hơn?
Có?
>> HỌC SINH: là các chức năng trên được kiểm tra cho [không nghe được]?
>> Davin: Tại sao tôi không cần phải làm điều đó?
HỌC SINH: [không nghe được].
Davin: Bởi vì bạn không mallocing bất cứ điều gì.
Vì vậy, nó not-- yeah, đó là không giống như một chuỗi s.
Đó là một con trỏ ở đâu đó.
Đây chỉ là giá trị.
SINH VIÊN: OK.
Davin: Yeah.
Bất cứ điều gì khác?
ROB: Yep?
HỌC SINH: Nhưng khi bạn [không nghe được]?
>> ROB: Vì vậy, để giải phóng bộ nhớ, chúng tôi sẽ nói ở đây.
Vì vậy, x là con trỏ của chúng tôi để khối của bộ nhớ.
Chúng tôi giải phóng con trỏ đó.
Và chúng tôi sẽ không nhất thiết phải làm điều đó ở đây.
Chúng ta có thể làm điều đó bất cứ nơi nào.
Nhưng bạn chỉ gọi miễn phí trên cái gì mà malloc trả về.
Vì vậy, malloc, ở đây, trở lại những gì đang được lưu trữ trong x.
Vì vậy, chúng ta có thể gọi miễn phí trên x.
Bất kỳ câu hỏi cuối cùng?
>> Davin: Bất kỳ câu hỏi cuối cùng?
Yeah?
>> HỌC SINH: Xin lỗi, có thể bạn lại giải thích tại sao bạn sẽ giải phóng trong đó?
Tại sao [không nghe được]?
>> Davin: Vì ở đây?
>> HỌC SINH: Yeah, giống như ngay sau đó.
Davin: Bạn có thể không muốn một miễn phí tại đây.
ROB: Bạn có thể sẽ không được.
Davin: Yeah, rằng điều này sẽ không làm gì cả.
Điều này sẽ, như, tạo ra bộ nhớ, làm công cụ để nó,
và sau đó ngay lập tức quên nó, yeah.
>> ROB: Nhưng chúng ta có thể làm, như, ở đây đối với một số lý do.
Chúng tôi có thể nói int sao y bằng mảng trở lại.
Làm một số công cụ với y, có thể in nội dung.
Và sau đó, cuối cùng, chúng tôi đang thực hiện.
Chúng tôi có thể giải phóng y.
HỌC SINH: [không nghe được].
Davin: Tôi có nên di chuyển xuống?
Cảm ơn.
ROB: Nice.
>> Davin: OK, đó là nó.
ROB: Được rồi, tốt.
Chúc may mắn.
>> Davin: Nếu bạn có câu hỏi, gửi email cho chúng tôi.
Chúc may mắn.