>> SPEAKER 1: Xin chào tất cả mọi người.
Chúng tôi sẽ bắt đầu.
Tôi nghĩ mọi người vẫn còn đang đi được lọc trong.
Nhưng vì lợi ích của thời gian, vì vậy chúng tôi có thể được các bạn ra khỏi đây vào thời gian,
chúng ta sẽ bắt đầu.
Vì vậy, hoan nghênh các CS50 đố 0 xem xét.
Đối với những người bạn của những người đã không nhận ra Chưa hết, bạn có một câu hỏi về thứ tư.
Woo-hoo.
>> Nếu bạn chưa bắt đầu học chưa hay đã không nhận ra rằng điều này tồn tại được nêu ra,
câu đố trong quá khứ và tất cả các thông tin về bài kiểm tra của bạn trên cs50.net/quizzes.
Có một số công cụ khá tốt trên đó, câu đố qua từ cuối 10
năm cũng như thông tin về bài kiểm tra này và các chủ đề
sẽ được bảo hiểm.
Vì vậy, chúng ta hãy bắt đầu.
>> Vì vậy, các bạn có thể nhớ, lần đầu tiên ngày lớp David đã có những đèn trên.
Vì vậy, về cơ bản, tất cả mọi thứ mà đi dưới mui xe của một máy tính là
thực hiện trong hệ nhị phân.
Nhị phân có nghĩa là những gì nó âm thanh như, 0 và 1.
Nó có hai giá trị có thể được đại diện.
>> Vì vậy, giống như trong ngày đầu tiên của phần khi David bật một ánh sáng
bóng đại diện trên, hoặc 1, máy tính của chúng tôi hiểu nhị phân là 0 và
1, trên hoặc tắt.
Khái niệm cơ bản của nhị phân.
Mỗi nơi được đại diện trong cơ sở hai.
Vì vậy, bạn thêm 2 đến 0 đến 1 đến 2 tất cả các con đường lên.
>> Để tính toán những gì nhị phân của bạn là số thập phân, bạn chỉ cần làm theo phương trình này
loại điều.
Nếu bạn có một trong bất kỳ 1 trong những nơi, bạn nhân nó với bất cứ điều gì
căn nó trong, thêm nó lên, và bạn sẽ có được số thập phân.
Vì vậy, đây là cách bạn đếm 5 trong hệ nhị phân.
Cũng giống như những gì chúng tôi đã làm trên trượt cuối cùng, đây là cách bạn sẽ
đại diện cho từ 1 đến 5.
>> Tương tự như vậy, giống như bạn có thể thêm và trừ trong thập phân hoặc căn cứ 10, hoặc
thực sự có cơ sở, có thể thêm vào và trừ trong hệ nhị phân.
Chính xác những gì bạn mong đợi khi bạn thêm hai lên, nó có bằng cao hơn
hơn 1, bạn mang theo 1, làm cho nó một 0, và làm thêm theo cách đó, chỉ
như bạn mong đợi với thường xuyên số thập phân hoặc bất kỳ cơ sở khác.
Mát mẻ.
>> Vì vậy, như tôi đã nói, tất cả mọi thứ đi trên dưới mui xe của máy tính của chúng tôi
được thực hiện trong 0 và 1, hoặc nhị phân.
Vì vậy, làm thế nào để chúng ta bày tỏ, ví dụ, chữ cái, hoặc số, hoặc các ký tự?
Và câu trả lời đó là ASCII.
>> ASCII là một ánh xạ giữa các ký tự mà chúng ta thường thấy trong
Ngôn ngữ tiếng Anh như A, B, C, gạch dưới, dấu gạch ngang, và
bất cứ điều gì như thế.
Và bản đồ đó để giá trị ASCII.
Một giá trị ASCII chỉ là một con số có thể được hiểu bởi máy tính của bạn.
Và cũng giống như bạn có thể làm bổ sung, trừ với các con số, bạn có thể làm
chúng với giá trị ASCII.
>> Vì vậy, trong ví dụ này, những gì này sẽ in ra?
Yeah, vì vậy chỉ cần một không gian không gian không gian C B D. đâu con chuột của tôi đi đâu?
Chú ý bạn có thể xác định một int 65.
Và khi bạn in ra rằng sử dụng phần trăm C, nó sẽ giải thích điều đó như một
nhân vật và sẽ in ra A.
>> Tương tự như vậy, bạn có thể khai báo nó như là một char.
Và khi bạn in nó ra bằng cách sử dụng phần trăm C, nó sẽ giải thích điều đó như
phần trăm D. Và cũng giống như bạn có thể thêm một số lượng, bạn có thể thêm các ký tự có
Giá trị ASCII, trong trường hợp này.
>> Vì vậy, một chút con trỏ cho tất cả mọi người.
5, như là một chuỗi, không thực sự bằng 5.
Vậy làm thế nào chúng ta có thể chuyển đổi chuỗi 5 đến số nguyên 5?
Bất cứ ý tưởng?
Yeah.
>> Vì vậy, nếu chúng tôi có 5 như là một chuỗi, chúng ta có thể trừ đi 0.
Và đó sẽ cho chúng ta 5.
Và tương tự, nếu chúng tôi có 5 như một số nguyên, bổ sung vào chuỗi 0.
Và điều đó cho chúng ta chuỗi 5.
Mát mẻ.
>> Bây giờ, nhớ lại giảng dạy một trong những nơi chúng tôi nói chuyện về các thuật toán.
Vì vậy, làm thế nào để chúng tôi thực sự muốn có một máy tính làm những điều thú vị?
Bạn biết đấy, chỉ cộng và trừ số và in ấn những điều trên không phải là
là thú vị.
Thông thường, chúng ta muốn máy tính của chúng tôi để thực hiện một số loại thuật toán.
Một chút gì đó phức tạp hơn hơn là chỉ số học đơn giản.
>> Một thuật toán chỉ là một từng bước thiết lập các hướng dẫn về cách thực hiện
một task-- nhất định
giống như một công thức.
Bạn có thể nhớ ngày đầu tiên của lớp học, nơi David đã cho chúng tôi đếm một phòng
người và bao nhiêu người là trong phòng.
Bạn có thể được sử dụng để đếm từng người một.
1, 2, 3, 4.
Trong trường hợp đó, một thuật toán thời gian tuyến tính.
>> Nhưng David giới thiệu một thuật toán để bạn đếm số người trong phòng
nơi mà tất cả mọi người đứng lên, bạn nói bạn số cho người khác, thêm vào đó
số, và một người ngồi xuống.
Và bạn lặp lại điều đó.
Đó là một loại thuật toán.
Chúng ta có thể phân tích một cách hiệu quả thuật toán dựa trên nó chạy thời gian.
Nhưng chúng tôi sẽ nói một chút thêm về điều này sau.
>> Vì vậy, tất cả các thuật toán cũng có thể được viết bằng mã giả.
Giả chỉ là một tiếng Anh như cú pháp được sử dụng để đại diện cho
một ngôn ngữ lập trình.
Ví dụ, nếu chúng ta muốn hỏi một người sử dụng đoán số yêu thích của tôi, chúng tôi
có thể có giả như vậy.
>> Có được một người dùng đoán.
Nếu đoán đúng, nói với họ họ là chính xác, nếu không nói cho họ biết
họ không phải là chính xác.
Và giả là một cách dễ dàng đại diện cho một ý tưởng hoặc một thuật toán.
Vì vậy, bây giờ chúng tôi có thể muốn thực sự viết này trong ngôn ngữ mà máy tính
might hiểu biết.
Vì vậy, chúng ta có thể viết mã giả của chúng tôi và giải thích rằng vào mã nguồn.
>> Cho đến nay, mã nguồn phải tuân thủ với một cú pháp nhất định
một ngôn ngữ lập trình.
Và cho đến nay, trong CS50, chúng tôi đã được sử dụng chủ yếu là c.
Vì vậy, đây có thể là mã nguồn cho c.
Sau đó trong khóa học, bạn đi đêm tiếp xúc với lập trình khác
ngôn ngữ như PHP.
Hoặc nếu bạn thậm chí còn có các lớp học khác, bạn có thể làm Java, Python, hoặc thậm chí OCML.
Nhưng trong chương trình ngôn ngữ c của chúng tôi, đây là làm thế nào chúng ta có thể viết mã nguồn cho
các thuật toán mã giả mà Tôi vừa mô tả trước đó.
>> Vì vậy, làm thế nào máy tính của bạn thực sự hiểu không?
Giống như tôi đã nói, nó chỉ thực sự hiểu số không và những người thân.
Vì vậy, làm thế nào để nó nhận được từ các nguồn mã để một cái gì đó có thể được
hiểu?
Vâng, chúng tôi có một cái gì đó được gọi là một trình biên dịch.
>> Nếu bạn nhớ lại trở lại ở hầu hết các bạn psets, bạn đã có một số loại chương trình
bằng văn bản trong một tập tin chấm c.
Và sau đó bạn sẽ gõ thực hiện.
Vì vậy, những gì đang làm làm gì?
>> Bạn có thể gõ make để biên dịch của bạn chương trình vì someone--
ai đã viết p thiết lập của bạn; có lẽ David--
tạo ra một tập tin thực hiện.
Và điều đó làm cho biết để chạy của bạn trình biên dịch, được gọi là kêu vang, mà sẽ
sau đó biên dịch mã nguồn của bạn để phản đối mã, đó là số không và những người thân
máy tính của bạn hiểu được.
Nhưng một lát sau, chúng ta sẽ đi sâu hơn về trình biên dịch.
>> Vì vậy, nhớ lại pset 0, where-- có, bạn có câu hỏi?
>> TƯỢNG: [không nghe được]?
>> SPEAKER 1: Có.
Tôi nghĩ rằng họ thực sự nên được trực tuyến.
Yeah.
>> TƯỢNG: Có như [không nghe được]?
>> SPEAKER 1: Nó không phải là.
Các doanh nghiệp tính cs50.net/quizzes.
>> TƯỢNG: câu đố Slash, giảm năm 2013, giảm 0, và chỉ cần nhấp vào thông qua
câu đố 2013 và bài kiểm tra 0, xem lại phần trình bày.
>> SPEAKER 1: Vâng, vì vậy nếu các bạn muốn kéo nó lên và nhìn vào nó, bạn sẽ
máy tính riêng, đó là tốt quá.
Nói rằng một lần nữa.
>> TƯỢNG: [không nghe được].
>> SPEAKER 1: Yeah, [không nghe được] là biến giả.
Ồ, có chứ?
>> TƯỢNG: [không nghe được]?
>> SPEAKER 1: Không, cuộc đình công không vào kỳ thi.
Xin lỗi, câu hỏi của cô, là đình công vào kỳ thi.
Và nó không phải là.
Vì vậy, pset 0, các bạn nên có tất cả thực hiện một cái gì đó sử dụng đầu.
Và chúng tôi đã học được một số chương trình cơ bản khối xây dựng bằng cách sử dụng đầu.
>> Vì vậy, chúng ta hãy xem xét một số các khối xây dựng
tạo nên một chương trình.
Đầu tiên là biểu thức Boolean.
Biểu thức Boolean là những người thân và 0 hay bất cứ điều gì có
hai giá trị có thể.
Trong trường hợp này, đúng hay sai, hoặc tắt, và có hoặc không.
Một ví dụ đơn giản, rất đơn giản, chương trình sử dụng một Boolean
biểu hiện ở đây.
>> Vì vậy, để cho các biểu thức Boolean để có ích, chúng tôi có các toán tử logic.
Đây là những nhà khai thác có thể được sử dụng để so sánh giá trị nhất định.
Vì vậy, chúng ta có hay không và bằng ít hơn, hơn hoặc bằng, lớn hơn hoặc
bằng, và ít hơn hoặc lớn hơn.
Tuy nhiên, các nhà khai thác không phải là rất hữu ích trừ khi chúng ta có thể kết hợp chúng thành
điều kiện.
>> Vì vậy, các bạn có thể nhớ từ đầu và từ p của bạn đặt ra là chúng ta
có điều kiện.
Họ là, về cơ bản, giống như dĩa trong logic của chương trình của bạn
thực hiện tùy thuộc vào việc một điều kiện được đáp ứng.
Vì vậy, một trong những điều kiện mà chúng tôi đã sử dụng nhiều lần trong khóa học này là
nếu, nếu không, nếu, và các điều kiện khác.
>> Dưới đây là một ví dụ về cách bạn có thể sử dụng.
Có ai biết sự khác biệt giữa chỉ sử dụng nếu báo cáo tất cả
các con đường xuống câu nếu, khác, nếu, và khác kết hợp?
Có?
>> TƯỢNG: [không nghe được].
>> SPEAKER 1: Chính xác.
Vì vậy, nếu tôi đã có nếu tất cả các con đường xuống này cách, ngay cả khi tình trạng này trở lại
đúng, nó vẫn sẽ tiếp tục kiểm tra hai tới.
Trong khi đó, với một người nào khác, nếu một người nào khác tuyên bố, nếu một trong những trả về true,
những người khác không được kiểm tra.
Mọi thắc mắc về điều đó?
Mát mẻ.
>> Vì vậy, bạn sử dụng một nếu-khác của một người nào khác tuyên bố nếu bạn biết rằng nó có thể chỉ
là một trong những trường hợp này.
Vì vậy, chúng ta biết nếu x là nhỏ hơn 0, nó chắc chắn sẽ không được
lớn hơn 0.
>> Tiếp theo, một khối xây dựng mà chúng tôi được biết là các vòng lặp.
Chúng tôi có ba loại vòng.
Đối với các vòng lặp, trong khi vòng, và làm trong khi vòng.
Và nói chung, khi bạn ngồi xuống để viết một cái gì đó, bạn phải quyết định
mà trong ba bạn muốn sử dụng.
Vì vậy, làm thế nào để chúng tôi quyết định cái nào?
>> Chúng tôi thường sử dụng một vòng lặp nếu chúng ta biết bao nhiêu lần chúng tôi muốn lặp
thông qua một cái gì đó hoặc bao nhiêu lần chúng tôi muốn thực hiện một nhiệm vụ.
Chúng tôi sử dụng trong khi các vòng nếu chúng ta cần một số điều kiện là đúng sự thật để tiếp tục chạy.
Và chúng tôi sử dụng làm trong khi rất giống với thời gian, nhưng chúng tôi muốn mã của chúng tôi để chạy ở
ít nhất một lần.
>> Vì vậy, thời gian, bất cứ điều gì trong làm sẽ luôn luôn chạy ít nhất một lần.
Trong khi đó, với thời gian, nó không thể chạy tất cả nếu
điều kiện là không hài lòng.
Bất kỳ câu hỏi với điều đó?
>> Vì vậy, cấu trúc của một vòng lặp.
Các bạn đều đã nhìn thấy điều này.
Bạn khởi tạo nó.
Bạn có một số loại điều kiện.
Vì vậy, ví dụ, chúng ta có thể khởi tạo như đối với tôi bằng 0.
i nhỏ hơn 10.
Và tôi ++.
Một trong rất đơn giản mà chúng tôi đã thực hiện.
>> Đối với một vòng lặp trong khi, tương tự, bạn có có một số loại khởi tạo,
một số loại điều kiện, và một số loại cập nhật.
Vì vậy, chúng ta có thể thực hiện của chúng tôi cho vòng lặp cũng như một vòng lặp trong khi sử dụng này.
Và tương tự với việc phải làm trong khi vòng lặp, chúng ta có thể có một số khởi tạo,
thực hiện một cái gì đó, cập nhật nó, và sau đó kiểm tra điều kiện.
>> Vì vậy, bây giờ các chức năng.
Chúng tôi đặt tất cả mọi thứ lại với nhau.
Chúng tôi có thể muốn viết một số loại chức năng.
Chức năng phổ biến mà có lẽ bạn đã thấy đã là chính.
Chính là một chức năng.
Nó có một kiểu trả về int.
Nó có một cái tên chức năng, chính.
Và nó có lý lẽ, argc và argv.
Vì vậy, chính là chỉ là một chức năng.
>> Các chức năng khác bạn có thể đã được sử dụng, printf printf-- là một function--
GetInt, toupper.
Nhưng những xảy ra để có được thực hiện đối với chúng tôi bởi
một số loại thư viện.
Nếu các bạn nhớ bao gồm thư viện này CS50.h hoặc
tiêu chuẩn I / O thư viện.
Vâng, câu hỏi?
>> TƯỢNG: Liệu chính chỉ vốn có trong c?
Liệu nó chỉ là loại [không nghe được]?
>> SPEAKER 1: Câu hỏi đặt ra là nếu chính là vốn có trong c.
Và có, tất cả các chức năng có chức năng chính.
Đó là loại cần thiết cho máy tính biết bắt đầu từ đâu
chạy mã.
>> TƯỢNG: Vì vậy, bạn sẽ không [không nghe được]?
>> SPEAKER 1: số
Bất kỳ câu hỏi nào khác không?
Mát mẻ.
Vì vậy, cũng giống như bạn có thể sử dụng một chức năng đó là được viết cho bạn, bạn cũng có thể
viết chức năng của riêng bạn.
Đây là một chức năng mà ai đó có thể đã viết để tính toán khối lượng
của một q, ví dụ.
Có một loại trở lại đây, trong trường hợp này int, chúng tôi q tên chức năng và của chúng tôi
danh sách các tham số.
>> Và lưu ý rằng bạn phải viết dữ liệu kiểu của tham số bạn muốn
sử dụng hoặc chức năng khác không biết những loại
thông số tôi nên được chấp nhận.
Vì vậy, trong trường hợp này, chúng tôi muốn một số nguyên như là đầu vào của chúng tôi.
Vì vậy, tại sao chúng ta có thể muốn sử dụng chức năng?
>> Trước hết, tuyệt vời cho tổ chức.
Chúng giúp phá vỡ mã của bạn vào nhiều tổ chức và làm cho khối
nó dễ dàng hơn để đọc.
Đơn giản hóa.
Điều này là tốt cho thiết kế.
Khi bạn đang đọc một đoạn mã và các chức năng chính là thực sự,
thực sự lâu dài, nó có thể là khó khăn hơn để Lý do về những gì đang xảy ra.
Vì vậy, nếu bạn chia nó ra thành các chức năng, nó có thể được dễ dàng hơn để đọc.
Và tái sử dụng, khả năng.
Nếu bạn có một đoạn code đó là được gọi hoặc chạy nhiều lần,
thay vì viết lại mã 10 lần chức năng chính của bạn, có lẽ bạn
muốn tái sử dụng nó.
Và sau đó mỗi khi bạn cần phải sử dụng đoạn mã, gọi hàm.
>> Vì vậy, bây giờ nếu chúng ta nhớ lại đầu, chúng tôi cũng nói về một vài khái niệm,
một trong số đó là luồng.
Chủ đề là khái niệm của nhiều chuỗi mã
thực hiện cùng một lúc.
Vì vậy, nghĩ lại ngày một trong những nơi David đã các bạn cách đếm số lượng
mọi người trong phòng.
>> Về cơ bản, những gì đang diễn ra trên là tất cả các bạn đã
chạy chủ đề riêng biệt.
Và những chủ đề đã được đến với nhau để có được một số loại câu trả lời.
Tương tự, tại Scratch, khi bạn có nhiều họa tiết, có lẽ bạn
có một con mèo và một con chó.
Và họ sẽ cùng một lúc chạy các kịch bản của mình.
Đó là một ví dụ về luồng.
>> Và khái niệm khác đó là giới thiệu trong đầu là sự kiện.
Và sự kiện là khi nhiều bộ phận của mã của bạn giao tiếp với nhau.
Trong Scratch, đây là khi bạn sử dụng kiểm soát và phát sóng Khi tôi
Nhận khối.
>> Và cũng có thể, trong vấn đề Set 4, chúng ta đã thấy một chút của sự kiện là tốt.
Các bạn có thể đã sử dụng thư viện Gevent.
Và có một chức năng waitForClick mà bạn đã chờ đợi
cho người sử dụng nhấn chuột.
Và nhấp chuột của bạn, trong trường hợp này, sẽ là các sự kiện và chờ đợi cú nhấp chuột là bạn
xử lý sự kiện.
>> Và cũng có thể, trong suốt chạy psets của bạn và làm việc trên psets của bạn, bạn
có thể đã tiếp xúc với một số các lệnh này.
Đây là những gì bạn đã gõ vào của bạn cửa sổ thiết bị đầu cuối hoặc bất cứ cửa sổ
mà xuất hiện trên g của bạn để chỉnh sửa, về cơ bản, điều hướng máy tính của bạn.
>> Vì vậy, ví dụ, danh sách các LS nội dung của một thư mục.
Tạo một thư mục tạo ra một thư mục mới.
CD, thay đổi thư mục.
RM, loại bỏ, xóa một tập tin hoặc một số thư mục.
Và sau đó loại bỏ các thư mục loại bỏ một thư mục.
>> TƯỢNG: [không nghe được]?
>> SPEAKER 1: Vâng, chắc chắn.
Xin lỗi, câu hỏi là nếu bạn sẽ đề nghị đặt này
trên bảng cheat.
Nó có thể giúp đỡ.
Nếu bạn có phòng, bạn có thể đặt nó trên.
Nó cũng chỉ nói chung đủ tốt nhớ bởi vì khi bạn sử dụng nó
bạn có thể muốn chỉ có nó nhớ.
Điều đó sẽ làm cho cuộc sống của bạn dễ dàng hơn rất nhiều.
Tôi đã trả lời câu hỏi của bạn?
>> Vì vậy, bây giờ, chúng tôi nói chuyện một chút ngắn gọn về thư viện.
Tuy nhiên, hai người chính mà chúng ta đã sử dụng cho đến nay trong khóa học là
tiêu chuẩn I / O và CS50.
Những loại những thứ được bao gồm trong tôi tiêu chuẩn / thư viện O?
>> Vâng, cho đến nay chúng tôi đã sử dụng printf.
Trong CS50, chúng tôi đã sử dụng getInt và GetString.
Và chuỗi kiểu dữ liệu cũng sẽ xảy ra được khai báo trong thư viện CS50 này.
Chúng ta sẽ nói nhiều hơn một chút sâu về thư viện làm việc như thế nào và làm thế nào họ
tương tác với phần còn lại của mã của bạn.
Tuy nhiên, những người là hai cái chính là chúng ta đã tiếp xúc với cho đến nay trong
quá trình.
>> Các loại.
Đây là tốt để nhớ bao nhiêu từng loại được đại diện bởi hoặc làm thế nào
nhiều byte mỗi loại requires--
int, 4 byte; char, 1 byte.
Float là 4 byte.
Thế nào là một đôi?
>> TƯỢNG: [không nghe được].
>> SPEAKER 1: Vâng, vì vậy một phao nhưng tăng gấp đôi kích thước.
Những gì về một thời gian dài?
>> TƯỢNG: [không nghe được].
>> SPEAKER 1: OK.
Là những gì một thời gian dài?
>> TƯỢNG: [không nghe được].
>> SPEAKER 1: Yeah, tăng gấp đôi một int.
Có.
>> TƯỢNG: [không nghe được].
>> SPEAKER 1: Long [không nghe được].
Và sau đó một thời gian dài dài là gấp đôi.
>> TƯỢNG: Không, không.
Một dài chỉ là một int.
Nó phụ thuộc vào kiến ​​trúc trước khi [không nghe được]
và int có cùng kích thước.
[Không nghe được].
>> SPEAKER 1: Vì vậy, một thời gian dài và một int đều giống nhau.
Và sau đó một thời gian dài dài là gấp đôi int.
Mát mẻ.
Và sau đó, loại cuối cùng là gì?
>> TƯỢNG: Pointer.
>> SPEAKER 1: Vâng, vì vậy chúng tôi đã học được một chút về con trỏ.
Và bất kể những gì một con trỏ chỉ đối với: nó có thể là một ngôi sao char
hoặc một int star--
nó luôn luôn là 4 byte cho một con trỏ.
Các câu hỏi về điều đó?
Có?
>> TƯỢNG: [không nghe được]?
>> SPEAKER 1: Vì vậy, một thời gian dài và là một int giống nhau trong thiết bị CS50 này.
>> TƯỢNG: Thiết bị là hoàn toàn hoán đổi cho nhau.
>> SPEAKER 1: Vâng.
Vì vậy, sau đó một thời gian dài dài gấp đôi một int.
>> TƯỢNG: Đây là 32 bit?
>> SPEAKER 1: 32 bit, yeah.
>> TƯỢNG: Vì vậy, [không nghe được]?
>> SPEAKER 1: Vâng, nếu nó không một cách rõ ràng nói, bạn
nên cho một chút 32.
>> TƯỢNG: Nó sẽ nói điều gì đó như giả định một
kiến trúc như thiết bị.
Đối với 64 bit, điều duy nhất mà thay đổi đang chờ đợi và con trỏ.
Cả hai đều [không nghe được].
>> SPEAKER 1: Có?
>> TƯỢNG: Câu hỏi.
Vì vậy, trên một trong những câu đố thực tế, nó sẽ hỏi về một int unsigned.
Vậy làm thế nào mà sẽ được xác định từ một int [không nghe được]?
>> SPEAKER 1: unsigned trong cũng là 4 byte.
Nhưng những gì là khác nhau về một ký int và unsigned int?
>> TƯỢNG: [không nghe được].
>> SPEAKER 1: Đúng vậy.
Người ta có thể đại diện cho các giá trị âm.
Nhưng làm thế nào nó làm điều đó?
>> TƯỢNG: [không nghe được].
>> SPEAKER 1: Yeah, nó giúp tiết kiệm 1 bit để đại diện cho dấu hiệu.
Đã ký có một chút mà đại diện cho dấu hiệu.
Và unsigned chỉ là tất cả tích cực.
>> TƯỢNG: OK.
Vì vậy, bạn nói rằng một đôi là hai lần kích thước của một phao?
>> SPEAKER 1: đôi là hai lần kích thước của một phao, có.
>> TƯỢNG: Làm thế nào một con trỏ để một lâu dài [không nghe được]?
>> SPEAKER 1: Vì vậy, câu hỏi là làm thế nào con trỏ đến một long-- dài
làm thế nào là chỉ có bốn byte khi một lâu dài 8 byte của nó.
Vì vậy, hãy nhớ một con trỏ là gì, về cơ bản, theo giá trị rất cơ bản.
>> TƯỢNG: [không nghe được].
>> SPEAKER 1: Yeah, do đó, một con trỏ chỉ là một vị trí bộ nhớ.
Vì vậy, nó không quan trọng bao nhiêu không gian con trỏ trỏ tới.
Nó chỉ cần 4 byte để theo dõi trong đó vị trí bộ nhớ.
Bất kỳ câu hỏi nào khác không?
Mát mẻ.
>> Vì vậy, điều cuối cùng tôi có là đầu ra tiêu chuẩn.
Bạn nên sử dụng chúng thường xuyên đủ để bạn có thể nhớ.
Nhưng điều này là khi chúng ta sử dụng printf, ví dụ.
Và chúng tôi có những giữ chỗ đó được gọi là mã định dạng.
>> Vì vậy, phần trăm c char, phần trăm cho tôi int, và chúng tôi cũng có thể sử dụng phần trăm d.
Đó là điều tương tự.
Nhưng, nói chung, trong CS50 chúng tôi cố gắng sử dụng phần trăm tôi.
Phần trăm f cho phao.
Phần trăm ld lâu dài và phần trăm của các chuỗi.
>> Tương tự như vậy, chúng tôi đã sử dụng một vài các trình tự thoát ra.
Ví dụ, dấu gạch chéo ngược n cho dòng mới.
Đây chỉ là khi bạn đang định dạng mã của bạn để in f.
Có?
>> TƯỢNG: phần trăm d là gì?
>> SPEAKER 1: Vậy câu hỏi là phần trăm d là để làm gì?
Phần trăm d là cho ints.
Phần trăm d và phần trăm tôi đều giống nhau.
>> TƯỢNG: Sự khác nhau giữa là gì dấu gạch chéo ngược n và dấu gạch chéo ngược r?
>> SPEAKER 1: Vậy câu hỏi là những gì các Sự khác biệt giữa phản ứng dữ dội và n
r phản ứng dữ dội?
Tôi nghĩ rằng dấu gạch chéo ngược r is--
>> TƯỢNG: Vì vậy, dấu gạch chéo ngược r chỉ có nghĩa trở về đầu dòng
mà không thực sự đi đến một dòng mới.
Vì vậy, nếu bạn in một dấu gạch chéo ngược r và bạn trở về đầu dòng
sau đó bạn in nhiều công cụ, bạn ghi đè lên những thứ đó là đã có trên
[Không nghe được].
Trong khi đó, n thực sự đi vào một mới đường và đi đến [không nghe được].
>> SPEAKER 1: Vâng, bất kỳ câu hỏi nào khác không?
Tất cả các quyền.
Tôi sẽ đưa nó ra để Dan, những người sẽ tiếp tục.
>> [Vỗ tay]
>> DAN: Tất cả chơi tay phải.
Vì vậy, tôi sẽ nói về một rộng loạt các ý tưởng từ các lớp học đó là
khoảng đại diện của tuần thứ hai và đầu tuần ba bắt đầu giảm
với đúc, mà chỉ là một cách để điều trị một giá trị của một loại nhất định như
một giá trị của một loại khác nhau.
Vì vậy, chúng ta có thể làm điều này với ký tự để ints, phao để int, và
chờ đợi lâu để tăng gấp đôi.
>> Tất cả những điều này có thể được sử dụng như cách điều trị một số giá trị số
trừ char như một số khác giá trị số.
Vì vậy, có một số vấn đề với điều này, các Tất nhiên, mà đi kèm khi bạn cast
những thứ như phao để int.
Vì vậy, đây là một chút lạ.
Chúng tôi có một phao đó là 1,31.
Chúng tôi nhân với 10.000.
Và sau đó chúng tôi in nó như là một int.
Những gì hiện ra điều này?
10.000 lần 1,31.
Vì vậy, 13.000, là đoán?
>> TƯỢNG: Tôi nghĩ đó là 10.000.
>> DAN: Vì vậy, tôi nhân nó bằng 10.000 trước khi tôi đúc nó.
>> TƯỢNG: Oh.
Sẽ không có là một trong 9 và một số con số 0?
>> DAN: Bạn có thể có một số chữ số kỳ lạ.
Vì vậy, ngay, đó là 1,3 lần 10.000.
Vì vậy, đó là 13.000.
Và weird-- thêm này
>> TƯỢNG: 13.100.
>> DAN: 13.100.
Cảm ơn bạn, Rob.
Và weirdness-- thêm này
này 9,9--
chỉ đơn giản là vì đúc này đã kết thúc làm tròn xuống nơi
nó không nên có.
Yeah.
>> ĐỐI TƯỢNG: Các đúc xảy ra sau khi bất cứ điều gì khác?
>> DAN: Vì vậy, bởi vì tôi có điều này trong in ấn, nó thực hiện phép nhân này trước khi nó
không đúc này.
>> TƯỢNG: [không nghe được].
>> DAN: Tôi nghĩ rằng nó sẽ cast đầu tiên, yeah, đó sẽ là 10.000.
Bất cứ điều gì khác?
Mát mẻ.
Vì vậy, đây là 13.099.
Tại sao điều này xảy ra?
Không chính xác.
>> Nổi không phải là hoàn hảo.
Họ chỉ có thể đại diện cho số một số lượng nhất định các con số đáng kể.
Vì vậy, nếu chúng ta in ra 8 sung sig trên float này, chúng tôi có được một loại
xấu số tìm kiếm.
Và đó là bởi vì 1,31 có thể không chính xác được đại diện bởi đơn giản
quyền hạn của hai trong máy.
Vì vậy, nó kết thúc lên tham gia gần nhất đoán, mà kết thúc
là một ít thấp.
Có ý nghĩa?
OK.
>> Bây giờ, chuyển sang là một cách khác nhau làm câu điều kiện, nơi tất cả
chúng tôi quan tâm là một biến duy nhất.
Vì vậy, trong ví dụ này, chúng tôi nhận được một số nguyên từ người sử dụng.
Và sau đó chúng tôi đang tìm kiếm những số nguyên là.
Có lẽ, đó là số từ một đến bốn.
Đó là những gì chúng tôi đang yêu cầu.
>> Vì vậy, bạn làm một công tắc tên biến.
Sau đó, bạn thiết lập các trường hợp có thể giá trị có thể.
Vì vậy, là trường hợp một, nói rằng đó là thấp.
Và sau đó bạn phá vỡ ra khỏi về điều kiện chuyển đổi để
bạn không tiếp tục đi.
>> Trong case-- tiếp theo
vì vậy trường hợp hai trường hợp three--
nếu đó là trường hợp hai nó chỉ giảm xuống các dòng mã đầu tiên mà họ coi là có
là trường hợp ba cho đến khi nó thấy được nghỉ ngơi.
Vì vậy, lý do bạn nhận được một trường hợp để chỉ in thấp là bởi vì tôi
có nghỉ này ở đây.
Nếu tôi, nói rằng, bỏ qua break-- này nếu tôi ném breakaway-- này
nó sẽ in thấp, và sau đó nó sẽ in trung bình, và sau đó nó sẽ phá vỡ.
>> Vì vậy, nghỉ ngơi là một phần quan trọng chuyển đổi của các điều kiện và
họ cần phải có.
Bất kỳ trường hợp không được quy định rõ ràng được xử lý bởi mặc định
trường hợp trong chuyển đổi và nên được đúc.
>> TƯỢNG: Vì vậy, 1, 2, 3, và 4 sẽ là n?
>> DAN: Các giá trị đó n có thể được.
Có.
Vâng?
>> TƯỢNG: Vì vậy, khi bạn có rằng [không nghe được]?
>> DAN: Bạn sẽ in thấp, và sau đó nó sẽ in trung bình, và
sau đó nó sẽ phá vỡ.
>> TƯỢNG: Tại sao nó có thể in trung nếu [không nghe được]?
>> DAN: Vì vậy, tất cả mọi thứ trong một trường hợp trước khi nghỉ thuộc.
Vì vậy, trường hợp một in là trường hợp bên dưới một như là in sau này.
Vâng?
>> TƯỢNG: [không nghe được]?
>> DAN: Vì vậy, con số này chỉ là một đặc biệt giá trị biến này
có thể mất, phải không?
Điều đó có ý nghĩa?
Yeah.
>> TƯỢNG: [không nghe được]?
>> DAN: Vâng, trường hợp hai sẽ in giữa và sau đó phá vỡ.
>> TƯỢNG: [không nghe được]?
>> DAN: Tôi nghĩ rằng bất kỳ?
Những loại dữ liệu khác bạn có thể chuyển qua?
>> TƯỢNG: Bạn có thể chuyển đổi hơn bất kỳ loại dữ liệu.
Tuy nhiên, nó chỉ có nghĩa là bất cứ điều gì trên ký tự và ints và công cụ như thế, bởi vì
nếu bạn đang chuyển qua một con trỏ điều đó không thực sự có ý nghĩa,
chuyển qua tải, nếu nó thậm chí chúng ta hãy bạn làm điều đó, bởi vì các dấu chấm động
độ chính xác, bạn sẽ không thực sự muốn làm điều đó anyway.
Vì vậy, khá nhiều, chỉ cần ints và ký tự và các công cụ như thế.
>> DAN: Vâng, đó là khi bạn phải rõ ràng giá trị mà bạn biết, tôi nghĩ rằng, có thể là
rằng một chuyển đổi là thực sự hữu ích.
Tốt?
OK.
>> Phạm vi là phạm vi mà một tuyên bố biến kéo dài.
Vì vậy, trong đoạn này ít mã tôi có, nó sẽ được đầy đủ các lỗi.
Và lý do là tôi tuyên bố int này i trong phạm vi này trong vòng lặp.
Và sau đó tôi đang cố gắng để tham khảo mà i bên ngoài mà cho phạm vi vòng lặp.
>> Vì vậy, về cơ bản, bạn có thể suy nghĩ về phạm vi như bất cứ điều gì mà bạn khai báo
với bên trong một tập hợp các dấu ngoặc nhọn chỉ tồn tại trong những dấu ngoặc nhọn.
Và nếu bạn cố gắng và sử dụng biến ngoài những dấu ngoặc nhọn, bạn sẽ
nhận được một lỗi từ trình biên dịch.
Vâng?
>> TƯỢNG: Vì vậy, một điều này không làm việc?
>> DAN: Điều này không làm việc, có.
Strings.
Chuỗi char *.
Chúng giống hệt nhau.
Họ chỉ là con trỏ đến ký tự.
Và bất kỳ dây mà bạn có nên kết thúc với dấu gạch chéo ngược không, mà chỉ là
một quy ước c.
>> Nó được gọi là terminator NULL.
Và NULL--
vốn N, chữ U, vốn L, vốn L--
là không giống như các Terminator NULL.
Đây là một con trỏ.
Đây là một nhân vật.
Họ rất khác nhau.
Ghi nó.
Nó sẽ được trên các bài kiểm tra, có lẽ.
Tôi chưa thấy các bài kiểm tra.
Vâng?
>> TƯỢNG: Vì vậy, NULL là, nói, con trỏ?
>> DAN: Có.
>> TƯỢNG: gì [không nghe được]?
>> DAN: Nếu, nói, malloc được gọi là khi bạn không có đủ bộ nhớ để có được
bất cứ kích thước bạn đang yêu cầu, malloc sẽ trở về NULL.
Đó là, về cơ bản, bất cứ khi nào một chức năng là phải trả về một con trỏ, bạn
cần phải kiểm tra lại vì NULL NULL là một good-- khá
đó là, loại, giá trị rác.
Đó là một số không như xa như con trỏ đi.
>> Bất cứ khi nào bạn gọi một chức năng, mà trả về một con trỏ.
Bạn sẽ muốn kiểm tra để chắc chắn rằng con trỏ đó không phải là NULL
vì NULL là rất phổ biến.
Đó là loại rác thải trở lại.
Vì vậy, nếu một cái gì đó đã không đi bên phải, chỉ trở về NULL thay thế.
>> TƯỢNG: [không nghe được]?
>> DAN: Vâng, và đó là lý này.
>> TƯỢNG: [không nghe được]?
>> DAN: chính tả nó như thế này.
Đó là terminator NULL.
Đó là chữ thường N-U-L-L nếu bạn đang đánh vần nó.
>> TƯỢNG: Và tôi chỉ đi trở lại và thử nghiệm nó.
Và nếu bạn thử đặt một dấu chấm động giá trị vào một chuyển đổi, nó sẽ hét vào mặt bạn
nói rằng, tuyên bố yêu cầu biểu các loại nguyên.
>> DAN: Có bạn đi.
Nhưng yeah, là những gì các câu hỏi một lần nữa?
>> TƯỢNG: [không nghe được]?
>> DAN: Vì vậy, vốn N, chữ U, vốn L, L vốn là một điều thực tế c.
Đây là con trỏ NULL và sẽ chỉ được đối xử như vậy.
Bạn sẽ không bao giờ thử và đánh vần Nhân vật NULL và thấy bất kỳ
cách nào khác hơn này.
Vâng?
>> TƯỢNG: Vì vậy, trở về char tối đa hoặc một cái gì đó trong phần thuyết minh, đúng không
thể hiện các chức năng tương tự như [không nghe được]?
>> TƯỢNG: Vì vậy, bạn có đề cập đến trở về tối đa char từ getchar, hoặc
bất cứ điều gì?
>> TƯỢNG: Vâng.
>> TƯỢNG: Vâng, vì vậy nói chung hạn cho tất cả những điều
là những giá trị trọng điểm.
Vì vậy, như trở về int max từ getInt và char tối đa từ getchar, đó là
phải được như thế, tất cả các quyền, nếu những điều này đang quay trở lại với chúng tôi,
một cái gì đó đã đi sai.
>> Đối với con trỏ, chúng tôi chỉ xảy ra để có giá trị trọng điểm này mà tất cả mọi người
đồng ý theo.
Và đây là điều bạn quay trở lại khi mọi thứ đi sai.
Vì vậy, tối đa char là những gì chúng ta đang sử dụng để đại diện cho một cái gì đó
như NULL hoặc getchar.
>> TƯỢNG: Vì vậy, nếu bạn đang thử nghiệm getchar, có thể bạn chỉ cần đặt NULL?
Đó sẽ làm cho một sự khác biệt?
>> DAN: Bạn có thể không chỉ cần kiểm tra NULL.
Bạn sẽ phải kiểm tra char max vì giá trị trả về từ hàm là
một nhân vật không phải là một con trỏ.
Vâng?
>> TƯỢNG: Câu hỏi này yêu cầu cho chiều dài chuỗi.
Điều đó bao gồm các nhân vật NULL?
>> DAN: số
Và đó thực sự là như thế nào chiều dài chuỗi biết dừng lại vì nó đi qua
mảng của bạn của các nhân vật cho đến khi nó thấy một nhân vật NULL.
Và sau đó nó như thế nào, tất cả Được rồi, tôi đang thực hiện.
>> TƯỢNG: [không nghe được] năm?
>> DAN: Xin chào sẽ là năm.
Đúng.
Vì vậy, mảng là liên tục khối của bộ nhớ.
Họ có thể truy cập ngay lập tức bằng cách nói tên của mảng và sau đó, trong xoăn
niềng răng, bất cứ điều gì chỉ số bạn muốn đi để, họ đang lập chỉ mục từ con số không thông qua
chiều dài của mảng trừ đi 1.
>> Và chúng được khai báo theo loại của điều mà bạn đang lưu trữ trong
mảng, tên mảng, và sau đó bất cứ điều gì kích thước của mảng đó.
Vì vậy, đây là một mảng char chiều dài sáu có những giá trị này.
Vâng?
>> TƯỢNG: [không nghe được]?
>> DAN: Vâng.
>> TƯỢNG: [không nghe được]?
>> DAN: Nếu bạn có những gì đang xảy ra vào mảng đó đã được thực hiện.
Vì vậy, bạn có thể chỉ định này thay vào đó là, nói, char, bất kể tên của bạn
mảng, khung trống bằng xoăn cú đúp H E dấu phẩy phẩy phẩy L L dấu phẩy
O dấu phẩy NULL nhân vật và cú đúp xoăn.
Điều đó cũng sẽ làm việc như một tuyên bố.
>> TƯỢNG: [không nghe được]?
>> DAN: Sau đó, bạn cần phải có kích thước đã được thực hiện.
>> TƯỢNG: [không nghe được]?
>> DAN: Có.
Tất cả chơi tay phải.
Đối số dòng lệnh là một cách nhận được thông tin từ người sử dụng như
đối số chính.
Chính nhận hai đối số.
Số lượng các đối số đó là được thông qua cùng dòng lệnh và một
vector chuỗi hoặc một mảng chuỗi của tất cả các đối số.
>> Vì vậy, nếu tôi, nói rằng, gọi là một chức năng như: một dấu chấm ra 1 không gian, không gian 2, ba,
argc sẽ là 4.
Và argv 0 sẽ là một dấu chấm ra.
Argv1 sẽ là 1.
argv2 sẽ là 2 argv3 sẽ 3, trong trường hợp cụ thể.
Vâng?
>> TƯỢNG: [không nghe được]?
>> DAN: Yếu tố cuối cùng trong mảng vì mảng là chiều dài cộng với argc
một trong ARGB, yếu tố cuối cùng là con trỏ NULL.
Đó là argc cộng với 1.
Vì vậy, trong trường hợp đó tôi chỉ nói, nó sẽ được argv 0 là một dấu chấm ra.
argv 1 là 1 argv2 là 2 argv 3 là 3.
argv 4, đó là một trong lớn hơn hơn argc sẽ là NULL.
>> Và đó là con trỏ NULL.
Có.
Và đó là bởi vì chuỗi là một ngôi sao char là một con trỏ.
Vì vậy, nó có phải là cùng loại.
Vâng?
>> TƯỢNG: Hai câu hỏi.
Vì vậy, một, sự khác biệt giữa những gì này và GetString khác hơn một loại
trong động cơ sử dụng?
Và thứ hai, là nó được lưu trữ trong bộ nhớ gần đây của bạn?
Vì vậy, như thế, sẽ GetString được [không nghe được]?
>> DAN: là nó được lưu trữ ở đâu?
Tôi không biết nơi nó được lưu trữ.
>> TƯỢNG: Vì vậy, trên thực tế, bạn biết làm thế nào bất kỳ chức năng bạn gọi đó là tranh luận
được lưu trữ trong ngăn xếp?
Vì vậy, argc và argv là đối số chính và họ đang ở trên đống, hoặc thực sự
ngay phía trên những gì bạn nghĩ là sự bắt đầu của stack.
Là những gì các phần khác của câu hỏi?
>> TƯỢNG: Vậy điều gì là [không nghe được]?
>> DAN: Vâng, nó chỉ là một cách khác nhau nhận đầu vào từ người sử dụng.
Hiệu quả hơn một chút và của Điều này nó handier cho các kịch bản bởi vì bạn
chỉ có thể truyền tham số chính của bạn chức năng thay vì phải chờ đợi
cho người sử dụng nếu bạn không có bất kỳ người sử dụng.
>> TƯỢNG: Và yeah, có những chuỗi sẽ là [không nghe được].
Nó sẽ lưu trữ những thứ bạn cần.
>> DAN: Vâng?
>> TƯỢNG: [không nghe được]?
>> DAN: Vâng, argv 0 luôn luôn bao gồm các dot cắt giảm các cuộc gọi chức năng.
Vâng?
>> TƯỢNG: [không nghe được]?
>> DAN: Vâng, mỗi người trong số các đối số là kết thúc vào nhân vật NULL vì họ
là chuỗi.
>> TƯỢNG: [không nghe được]?
>> DAN: Vâng, argv argc là một con trỏ NULL.
>> TƯỢNG: [không nghe được]?
>> DAN: Oh yeah.
Vâng, xin lỗi.
>> TƯỢNG: Vì vậy, [không nghe được]?
>> DAN: Vậy câu hỏi là nếu bạn có dòng lệnh chấm giảm một dấu chấm ra 1, 2,
sẽ số dòng lệnh đối số có hai hoặc nó sẽ là ba?
>> TƯỢNG: Tôi nghĩ rằng nó không thực sự quan trọng.
Tôi có xu hướng nói, oh, bạn đã không vượt qua bất kỳ đối số dòng lệnh khi,
rõ ràng, bạn được gọi là chức năng.
Vì vậy, tôi có xu hướng loại trừ những lời nói chức năng từ dòng lệnh
đối số mặc dù nó bao gồm trong argv.
>> DAN: Nhưng nếu nó đã được trên test--
yeah-- và còn nếu bạn nói điều gì đó như argc bằng 3,
bạn đang ở trong vị thế an toàn.
Vâng?
>> TƯỢNG: [không nghe được]?
>> DAN: Tôi nghĩ rằng nếu thay vì gọi này trong argc và argv chuỗi dấu ngoặc
nhưng vẫn giữ cùng loại và chỉ được gọi là họ một cái gì đó khác nhau như một
và b, nó sẽ vẫn làm việc?
Và nó vẫn sẽ làm việc, bạn sẽ just--
thay vì sử dụng argc-- bạn muốn sử dụng a và b.
Vâng?
>> TƯỢNG: [không nghe được]?
>> DAN: Vậy câu hỏi là GetString là đi để lưu trữ bộ nhớ trong heap
vì GetString là char *.
Nó lưu trữ bộ nhớ trong đống vì nó cuộc gọi tại malloc trong thực tế
thực hiện GetString.
OK, di chuyển trên.
>> An ninh.
Vì vậy, để thực sự an toàn, bạn dựa vào không một và bạn cho phép ai truy cập vào bất kỳ
thông tin của bạn, đó là lý do tại sao tất cả mọi người xây dựng máy riêng của họ,
hệ điều hành riêng của họ, tất cả họ chương trình từ đầu, và rõ ràng
không kết nối với bất kỳ máy khác thông qua internet.
Vì vậy, máy tính là không an toàn.
Họ thực sự là.
Chúng ta phải tin tưởng người khác.
>> Và ý tưởng về an ninh là bạn đang cố gắng hạn chế số lượng
niềm tin mà bạn cần.
Và một trong những cách bạn làm điều đó là thông qua mật mã.
Mật mã là, về cơ bản, chúng tôi có bí mật.
>> Đôi khi chúng ta phải vượt qua những bí mật của chúng tôi cùng thông qua, nói rằng, mạng Internet hoặc
những thứ khác.
Và chúng tôi không muốn mọi người để biết những bí mật.
Vì vậy, chúng tôi mã hóa bí mật của chúng tôi vào một cách mà chúng tôi hy vọng không ai có thể tìm ra.
>> Vì vậy, chúng tôi used--
thông qua quá trình này class--
những thứ như mật mã Caesar và [Không nghe được], cả hai đều rất, rất
cách an toàn mã hóa mọi thứ.
Chúng dễ dàng để tìm ra những gì họ và những gì bí mật của bạn.
Thế giới thực sử dụng nhiều hơn nữa chương trình mã hóa phức tạp.
Và chúng ta sẽ không nhận được vào nhiều hơn thế.
>> Debugging.
GDB là tốt nhất.
Tôi sẽ nhấn mạnh điều này một lần nữa.
Sử dụng GDB tất cả các thời gian mỗi khi bạn có một vấn đề.
Các lệnh hữu ích trong GDB là phá vỡ, mà một trong hai bạn vượt qua một dòng
số lượng, một tên chức năng, về cơ bản nơi trong mã của bạn, bạn muốn dừng lại,
và có thể kiểm soát.
>> In có một biến và in ra bất cứ điều gì biến là ở đó
điểm thi của bạn.
Tiếp theo thực hiện di chuyển của bạn cùng một bước.
Và bước bước bên trong một hàm trong thực hiện của bạn.
>> Những điều khác đang chạy, đó là cách bạn thực sự chạy mã của bạn.
Tiếp tục lấy tất cả các bước cần thiết để có được điểm break tiếp theo.
Và có rất nhiều, nhiều người khác.
Nhìn chúng.
Họ đang tuyệt vời.
Vâng?
>> TƯỢNG: [không nghe được]?
>> DAN: Vâng, đó là một chương trình gỡ rối.
Vì vậy, một chương trình gỡ rối là một chương trình cho phép bạn gỡ lỗi chương trình của bạn.
Nó không phải là một chương trình tìm lỗi cho bạn, mặc dù đó sẽ là tuyệt vời.
>> Và cuối cùng đối với tôi là tìm kiếm.
Vì vậy, các loại tìm kiếm mà chúng tôi nói chuyện trong lớp này là tìm kiếm tuyến tính,
mà chỉ là bạn hãy kiểm tra mỗi phần tử của không gian tìm kiếm, một
yếu tố tại một thời gian, cho đến khi bạn tìm thấy những gì bạn đang tìm kiếm hoặc cho đến khi bạn đạt đến
kết thúc của không gian tìm kiếm của bạn mà chỉ cho bạn nói rằng bạn không thể tìm thấy
các yếu tố mà bạn đang tìm kiếm.
Và điều này cần có thời gian tốt nhất không đổi, mà là 0 của 1 và tuyến tính tồi tệ nhất
thời gian, mà là 0 n.
>> Tìm kiếm nhị phân, trong đó nhu cầu yếu tố bẩn thỉu.
Bạn hãy vào giữa các yếu tố của bạn, thấy nếu các yếu tố bạn đang tìm kiếm
là lớn hơn hoặc nhỏ hơn so với các phần tử rằng bạn đang ở giữa.
Nó nó lớn hơn, bạn nói rằng phía dưới tìm kiếm của bạn không gian của bạn
vị trí hiện tại, giữa, và bạn khởi động lại quá trình này.
Nếu nó nhỏ, bạn nhìn nói mà gì-- yeah, có chuyện gì thế?
>> TƯỢNG: [không nghe được]?
>> DAN: Có.
Bất kỳ loại loại đó là được giảng dạy trong lớp học là trò chơi công bằng cho kỳ thi này.
>> [Cười]
>> DAN: Và thực tế là bạn không có để làm điều đó cho một bộ vấn đề, đó là công bằng
trò chơi cho các thử nghiệm.
>> TƯỢNG: Chúng ta có thể đi qua nó như thế nào đối với:
>> DAN: Nó sẽ được đi qua.
>> SPEAKER 2: mã thực tế cho [Không nghe được] là study.cs50.net.
Vì vậy, nếu bạn nhìn vào các vấn đề thực tế trong trang kết hợp loại
study.cs50.net, có mã thực hiện hợp nhất phân loại.
Vì vậy, bạn không cần phải thực hiện điều đó cho mình tối nay.
Nhưng chắc chắn rằng bạn hiểu nó khá hơn là chỉ học thuộc lòng nó.
>> TƯỢNG: [không nghe được]?
>> SPEAKER 2: Trang sắp xếp hợp nhất vào study.cs50.net, có một thực tế
vấn đề đó, nếu bạn nhấp qua các vấn đề, ở cuối có một
giải pháp, đó là hợp nhất loại thực hiện.
Nhưng chắc chắn rằng bạn hiểu nó chứ không phải chỉ học thuộc lòng nó
hoặc sao chép nó xuống.
>> TƯỢNG: Và một hoàn toàn hợp lệ vấn đề cho kỳ thi sẽ được
một cái gì đó giống như đây là một danh sách.
Những gì hiện danh sách này như thế nào sau khi một bước các lựa chọn sắp xếp hoặc
sắp xếp chèn hoặc bất cứ điều gì.
Một sự lặp lại đầy đủ danh sách.
Vì vậy, ngay cả khi bạn không kết thúc cần phải mã cho nó, bạn cần phải hiểu nó
đủ để biết làm thế nào nó sẽ được sửa đổi mảng này.
>> DAN: Đó là nó cho tôi.
>> [Vỗ tay]
>> Lucas: Chào tất cả mọi người.
Tên tôi là Lucas.
Tôi sẽ nói về đệ quy, tất cả những loại mà chúng tôi đã học được, và một
chút của tất cả các con trỏ.
OK?
Vì vậy, trước hết, đệ quy.
Có nghĩa là gì khi nói rằng một chức năng là đệ quy?
>> TƯỢNG: cuộc gọi của chính nó.
>> Lucas: OK, tự gọi mình, yeah.
Vì vậy, giống như hình ảnh này, ví dụ.
Nó giống như hình ảnh bên trong của một bức tranh và như vậy.
Vì vậy, ví dụ, bạn có thể have-- khi Dan đã được nói về tìm kiếm nhị phân.
Một trong những cách đó là tìm kiếm nhị phân đệ quy là một thực tế rằng bạn đang
cố gắng để tìm thấy một số.
Vì vậy, bạn đi đến giữa.
Và sau đó bạn kiểm tra xem những con số có ở bên trái và bên phải.
>> Và sau đó nếu bạn tìm ra số là sẽ được ở bên trái, đó là cùng
điều là làm việc tìm kiếm một lần nữa nhưng chỉ ở bên trái của danh sách.
Vì vậy, đó là cách nó âm thanh như đó là đệ quy.
Vì vậy, đó là lý do tại sao các bạn có đệ quy giải pháp cho sắp xếp hợp nhất.
>> OK, vì vậy đây là một ví dụ.
Vì vậy, hãy nói rằng tôi muốn chọn tất cả các số từ 1 đến n.
Tôi có thể nhận ra rằng tổng của n số là n cộng với n trừ đi 1 đến 1.
Nhưng sau đó, nếu tôi nhìn vào n trừ đi 1 cộng n trừ 2 cộng với 1, đó là cùng một
điều là con số tổng hợp đến n trừ đi 1.
Vì vậy, tôi có thể nói rằng tổng của một số tiền tương đương bằng n cộng với tổng của n trừ đi 1.
Điều đó có ý nghĩa?
>> Và tôi cũng sẽ có một cái gì đó khác được gọi là trường hợp cơ sở, đó là
tổng số lên bằng không sẽ là không.
Vì vậy, ngay sau khi tôi nhận được với số bằng không, tôi dừng đếm.
Điều đó có ý nghĩa?
>> Vì vậy, đây là một ví dụ về cách Tôi có thể thực hiện điều đó.
Vì vậy, tôi có chức năng này trong một số.
Mà phải mất một số nguyên n.
Vì vậy, đây lần đầu tiên tôi kiểm tra nếu n là ít hơn hoặc bằng số không.
Vì vậy, nếu nó ít hơn hoặc bằng số không, tôi trở lại không, đó là trường hợp cơ sở của chúng tôi.
Nếu không, tôi chỉ có thể trở lại cộng với n tổng các số từ
một đến n trừ đi một.
Có ý nghĩa?
OK.
>> Vì vậy, đây là những gì nó trông như thế nào.
Bạn có tổng của 2 bình đẳng 2 cộng với số tiền 1.
Và một số 1 là 1 cộng với tổng số 0, mà là 0.
Có ý nghĩa?
Vì vậy, nếu chúng ta nhìn vào chồng của bạn chương trình, đây là những gì nó trông như thế nào.
>> Đầu tiên, chúng tôi có các chức năng chính.
Và sau đó các chức năng chính gọi là tiền 2.
Và sau đó tổng hợp 2 sẽ nói, oh, tổng hợp 2 bằng 2 cộng với số tiền của một.
Vì vậy, tôi thêm khoản 1 vào stack.
Và tổng số 1 là sẽ gọi cho tổng của 0, có cũng sẽ được bổ sung
để ngăn xếp.
Và sau đó mỗi người có trên đầu trang của người khác phải trả lại
trước khi những người khác có thể tiếp tục đi.
>> Vì vậy, ví dụ, ở đây, tổng số 0, đầu tiên, sẽ trở về 0.
Và sau đó chọn số tiền 1.
Sau đó, tổng số 1 đang tiến hành trả lại 1 tổng hợp 2.
Và cuối cùng, tổng của 2 sẽ trở lại từ 3 đến chính.
Điều đó có ý nghĩa?
>> Nó thực sự quan trọng để hiểu làm thế nào ngăn xếp được làm việc và cố gắng
xem nó có ý nghĩa.
OK, vì vậy phân loại.
Vì vậy, tại sao sắp xếp quan trọng, trước hết?
Tại sao chúng ta phải quan tâm?
Bất cứ ai?
Hãy cho tôi một ví dụ?
Vâng?
>> TƯỢNG: [không nghe được].
>> Lucas: Vâng, OK.
Vì vậy, bạn có thể tìm kiếm hiệu quả hơn.
Đó là một cách tốt.
Vì vậy, ví dụ, chúng ta có rất nhiều điều, trên thực tế, trong cuộc sống của chúng tôi
đều được sắp xếp.
Ví dụ, từ điển.
>> Nó rất quan trọng để có tất cả các từ một số loại để chúng ta
có thể truy cập dễ dàng.
Vì vậy, đó là những gì ông đã nói.
Bạn có thể tìm kiếm hiệu quả hơn.
Hãy suy nghĩ về cách cứng nó sẽ có một từ điển trong đó các từ trong
thứ tự ngẫu nhiên.
Bạn sẽ phải nhìn vào, khá nhiều, mỗi từ duy nhất cho đến khi bạn tìm thấy
từ mà bạn đang tìm kiếm.
>> Nếu bạn đang sử dụng Facebook cũng có khi, bạn đang tìm kiếm bạn bè của bạn, bạn
sẽ thấy rằng Facebook đặt của bạn người bạn gần gũi hơn là trên đầu trang của những người
bạn không nói chuyện với nhiều.
Nếu bạn đi tất cả các cách để dưới cùng của danh sách bạn bè của bạn, bạn sẽ thấy
những người mà bạn có thể thậm chí không hãy nhớ rằng bạn là bạn của.
Và đó là bởi vì các loại Facebook bạn bè của bạn dựa trên cách
đóng bạn cho họ.
>> Vì vậy, tổ chức dữ liệu.
Ngoài ra Pokemon.
Vì vậy, bạn thấy rằng tất cả Pokemon có số lượng.
Và đó là như một cách dễ dàng cách truy cập dữ liệu.
>> TƯỢNG: Truy cập Pokemon.
>> Lucas: Vâng.
>> TƯỢNG: [không nghe được].
>> Lucas: Đúng.
OK, vì vậy lựa chọn sắp xếp.
Loại lựa chọn sẽ chọn không được phân loại giá trị nhỏ nhất của một danh sách mỗi
thời gian trong mỗi lần lặp.
Đó là loại giống như các loại mà bạn làm trong đầu của bạn khi bạn đang cố gắng để
sắp xếp một danh sách trên tay.
>> Về cơ bản, tất cả các bạn làm là bạn nhìn cho số nhỏ nhất.
Bạn đặt nó trong danh sách được sắp xếp.
Và sau đó bạn tìm tiếp theo số nhỏ nhất.
Và sau đó bạn tiếp tục làm đó và như vậy.
>> Vì vậy, lựa chọn loại cơ bản là bạn chọn mỗi khi nhỏ nhất
giá trị phân loại.
Đặt ở cuối sắp xếp một phần của danh sách.
Và tiếp tục làm điều đó.
Vì vậy, hãy nhanh chóng xem những gì này như thế nào.
Vì vậy, đây là sắp xếp và danh sách phân loại.
>> Vì vậy, cho sắp xếp danh sách, đó là ban đầu trống rỗng.
Và sau đó tôi sẽ chọn số lượng nhỏ nhất ở đây, đó là 2.
Vì vậy, tôi có được số 2 và tôi đặt ở phía trước của danh sách.
Và sau đó tôi tìm kiếm nhỏ nhất tiếp theo yếu tố, đó là 3.
Vì vậy, tôi đặt nó ở cuối của danh sách được sắp xếp.
Và sau đó tôi tiếp tục làm điều đó.
Tôi tìm thấy 4 và đặt nó ở cuối.
Tìm 5 và đặt nó ở cuối.
>> Và xem làm thế nào tất cả những lần Tôi nói đặt nó ở cuối cùng là,
về cơ bản, trao đổi hai giá trị.
OK?
Và rồi cuối cùng, bạn chỉ cần có một yếu tố hơn.
Vì vậy, nó đã được sắp xếp.
>> OK, vì vậy sắp xếp chèn.
Sắp xếp chèn bạn sẽ có cũng rằng vấn đề của việc có một sắp xếp và
một danh sách phân loại.
Điều duy nhất là mỗi khi bạn đang thêm một yếu tố để các sắp xếp
danh sách, bạn chỉ cần chọn các yếu tố đó là ở phía trước của danh sách phân loại.
Và sau đó bạn sẽ tìm thấy những gì vị trí của nó phải ở trong sắp xếp
một phần của danh sách.
>> Hãy xem những gì này là như vậy điều này làm cho ý nghĩa hơn.
Vì vậy, ban đầu, ví dụ, tôi đang cố gắng chèn số ba trong
một phần được sắp xếp trong danh sách.
Vì vậy, danh sách này không có bất cứ điều gì.
Vì vậy, tôi chỉ có thể đưa ra con số 3.
>> Bây giờ, tôi muốn thêm số 5 phần được sắp xếp trong danh sách.
Vì vậy, tôi nhìn vào số lượng 5.
Tôi nhận thấy rằng nó lớn hơn 3.
Vì vậy, tôi biết rằng nó đã được sau 3.
Vì vậy, tôi đặt 3 và 5.
>> Sau đó, tôi muốn chèn số 2.
Tôi nhận thấy rằng số 2 là thực sự cuối cùng thì cả 3 và 5.
Vì vậy, tôi thực sự phải đặt nó tất cả các cách vào đầu danh sách.
Vì vậy, tôi phải, loại, chuyển tất cả các các yếu tố trong danh sách được sắp xếp để tôi có thể
nhường chỗ cho số 2.
>> Sau đó, tôi nhìn thấy số 6.
Tôi thấy rằng nó phải là sau 5.
Vì vậy, tôi đặt nó ở đó.
Và cuối cùng, tôi nhìn vào số 4.
Và tôi nhận thấy là cần là giữa 3 và 5.
Và sau đó tôi đặt nó ở đó và thay đổi tất cả các yếu tố khác.
Có ý nghĩa?
>> Phân loại Bubble.
Vì vậy, bong bóng sắp xếp về cơ bản là những gì bạn đang sẽ do-- chúng tôi gọi nó là bong bóng
loại vì bạn đi qua các list-- nó thực sự tốt hơn nếu tôi chỉ hiển thị
bạn thích this--
và bạn sẽ so sánh số liền kề.
Và bạn sẽ trao đổi của họ vị trí nếu họ không
theo thứ tự đúng.
>> Vì vậy, về cơ bản, những gì đang xảy đến xảy ra là ở đây, ví dụ,
bạn có 8 và 6.
Bạn có biết rằng thứ tự sắp xếp sẽ thực sự là 6 và 5, phải không?
Vì vậy, bạn sẽ trao đổi các đơn đặt hàng.
Sau đó, tôi nhìn thấy 8 và 4 ở đây.
Và tôi làm điều tương tự.
Tôi trao đổi một lần nữa.
Và cuối cùng, 2 và 8.
Tôi cũng trao đổi chúng.
>> Nó được gọi là Phân loại Bubble bởi vì sau khi mỗi lần lặp lại, trên thực tế,
số lượng lớn nhất trong danh sách được tất cả đường đến cuối danh sách.
Điều đó có ý nghĩa?
Bởi vì nó giữ nó trao đổi và di chuyển nó sang bên phải.
>> OK, vì vậy đây là phiên thứ hai.
Nó sẽ là điều tương tự.
Tôi sẽ làm một trao đổi và sau đó người cuối cùng.
Tôi rằng không có giao dịch hoán đổi và danh sách được sắp xếp.
Vì vậy, trong bong bóng theo, chúng tôi về cơ bản giữ sẽ thông qua danh sách và trao đổi
thứ cho đến khi tôi nhận thấy rằng tôi đã không làm bất kỳ giao dịch hoán đổi làm lặp đi lặp lại rằng, đó
có nghĩa là danh sách đã được sắp xếp.
Có ý nghĩa?
>> Hãy nói một chút về thời gian chạy.
Vì vậy, các bạn nhớ Big O, Omega, và Theta?
Vâng?
OK, Big O là gì, trước hết?
>> TƯỢNG: [không nghe được].
>> Lucas: Vâng, nó được gọi là một trường hợp xấu nhất thời gian chạy, mà chỉ có nghĩa là nó
bao nhiêu bạn mong đợi chương trình để chạy.
Giống như, về of--
trong case-- n này.
Số lượng các yếu tố trong danh sách trong trường hợp xấu nhất.
Giống như, trong trường hợp xấu nhất có thể.
>> Vì vậy, cho bong bóng theo, ví dụ, chúng tôi có Big O n vuông.
Tại sao chúng ta không?
Tại sao bong bóng theo Big O n vuông?
>> TƯỢNG: [không nghe được].
>> Lucas: Vâng, vì vậy trường hợp xấu nhất sẽ là rằng tôi sẽ phải làm n lần lặp lại.
Vì vậy, mỗi lần lặp lại sẽ mang yếu tố lớn nhất để kết thúc
danh sách.
Vì vậy, trường hợp xấu nhất là tôi có để làm điều đó điều n lần.
Và đối với mỗi người trong những lần, tôi phải làm n giao dịch hoán đổi bởi vì tôi có thể so sánh
mỗi hai yếu tố.
Vì vậy, đó là lý do tại sao nó n bình phương bởi vì nó n lần n.
>> Sau đó, lựa chọn loại cũng n vuông là bởi vì, mỗi lần lặp, tôi phải
nhìn vào tất cả các yếu tố duy nhất trong danh sách.
Và sau đó tìm nhỏ nhất, có nghĩa là tôi phải
xem xét thông qua các yếu tố n.
Và tôi phải làm điều đó n lần vì Tôi phải chọn tất cả các yếu tố n.
>> Một loại chèn cũng n vuông là vì trường hợp xấu nhất sẽ
là, một, tôi phải chèn số n, phải không?
Vì vậy, tôi đã biết rằng tôi sẽ có n lần lặp lại.
Nhưng đối với mỗi người trong số những con số, nếu tôi đã có nhìn vào tất cả các con số trong
danh sách được sắp xếp và đặt nó tất cả các cách ở phía trước, đó sẽ là n vuông
bởi vì nó sẽ là n lần n nữa.
Có ý nghĩa?
Những gì về omega?
>> TƯỢNG: [không nghe được].
>> Lucas: Đó là trường hợp kịch bản tốt nhất.
Vì vậy, nó là như thế, trong rất nhiều lần cho phân loại, trường hợp kịch bản tốt nhất là
khi danh sách đã được sắp xếp.
Vì vậy, bạn không thực sự có để làm bất cứ điều gì.
Phân loại Bubble có sản phẩm tốt nhất trường hợp kịch bản của n.
Các bạn có biết tại sao?
>> TƯỢNG: [không nghe được].
>> Lucas: Vâng, nếu bạn theo dõi cho dù dữ liệu khẩu phần có bất kỳ giao dịch hoán đổi hoặc
không, nếu bạn có một cái gì đó giống như thiết lập để thật sự nếu có một sự lặp lại, nếu
danh sách đã được sắp xếp, về cơ bản, những gì sẽ xảy ra là tôi sẽ
cố gắng để trao đổi mỗi hai các yếu tố xung quanh.
Tôi sẽ thấy rằng không có giao dịch hoán đổi.
Và tôi chỉ trả lại ngay lập tức.
>> Vì vậy, nó có nghĩa là tôi chỉ cần có để đi qua danh sách một lần.
Vì vậy, nó n vì tôi nhìn tại n phần tử.
Tại sao lựa chọn loại n vuông?
>> Vâng, ngay cả khi danh sách được sắp xếp, cho mỗi lần lặp lựa chọn sắp xếp, tôi
phải chọn các yếu tố tối thiểu.
Vì vậy, điều đó có nghĩa là tôi phải ra ngoài để tìm ở tất cả các yếu tố trong không được phân loại
liệt kê và tìm ra tối thiểu cho mỗi lần lặp.
Điều đó có ý nghĩa?
>> Và chèn thanh kiếm được n bởi vì trong trường hợp đó tôi đang cố gắng để chèn
số điện thoại và tất cả các con số, khi tôi cố gắng để chèn chúng, tôi thấy rằng họ
đang ở vị trí bên phải.
Tôi không cần phải đi kiểm tra tất cả các khác số trong danh sách được phân loại.
Vì vậy, đó là lý do tại sao nó sẽ được n.
Có ý nghĩa?
Và theta là gì?
>> TƯỢNG: [không nghe được].
>> Lucas: gì, xin lỗi?
Nói lại lần nữa.
>> TƯỢNG: [không nghe được].
>> Lucas: Chính xác.
Vì vậy, bạn có thể thấy rằng lựa chọn duy nhất lưu trữ trong Merge loại có thetas.
Và đó là bởi vì bạn chỉ có theta nếu cả hai Big O và Omega đều giống nhau.
OK.
Và cuối cùng, hợp nhất phân loại là trong nhật ký n.
>> Và sau đó, như Dan đã nói, Hợp nhất loại là loại giống như cùng một cách mà
bạn thực hiện tìm kiếm nhị phân.
Vì vậy, bạn sẽ có được danh sách.
Và bạn sẽ giảm đi một nửa.
Và sau đó bạn cắt chúng trong nửa nhỏ hơn.
Và sau đó bạn kết hợp chúng.
Các bạn hãy nhớ rằng, phải không?
OK, như ông đã nói.
>> OK, con trỏ.
Vì vậy, một con trỏ là gì?
>> TƯỢNG: [không nghe được].
>> Lucas: Một địa chỉ.
OK.
Tôi biết rằng David cho thấy một loạt các video của Binky và những thứ chỉ
nhau.
Nhưng tôi thích nghĩ về con trỏ như chỉ đơn thuần là một địa chỉ.
Vì vậy, nó là một biến đang diễn ra để lưu trữ một địa chỉ.
>> Vì vậy, nó chỉ là biến đặc biệt này đó là dài bốn byte.
Nên nhớ rằng con trỏ đến bất cứ điều gì dài 32-bit của chúng tôi luôn luôn bốn byte
máy nên trường hợp thiết bị.
Và nó chỉ có vị trí của một biến bên trong của nó.
>> OK, do đó, bộ nhớ này, về cơ bản.
Vì vậy, mỗi khối bộ nhớ thực sự có một nhãn, đó là địa chỉ của
bộ nhớ slotty.
Vì vậy, đó có nghĩa là tôi có thể có một con trỏ trỏ tới
bất kỳ của các địa chỉ.
Vì vậy, lý do tại sao chúng tôi sẽ sử dụng con trỏ là nếu tôi phải nhớ vị trí
một biến cụ thể là một bộ nhớ.
>> Và các bạn hãy nhớ rằng một trong những trường hợp là nếu tôi có một chức năng
nếu tôi có thực sự muốn bạn hoán đổi cho số thực, tôi thực sự
phải gửi một con trỏ.
Không biến.
Các bạn có nhớ không?
Các between-- sự khác biệt
tên là gì?
Gọi giá trị và gọi tham khảo, phải không?
>> OK, yeah.
Vì vậy, gọi theo giá trị.
Khi bạn chỉ cần gửi một biến hoạt động bạn chỉ cần gửi một giá trị.
Vì vậy, bạn đang thực sự gửi một bản sao của biến.
Và chương trình của bạn không quan tâm về nếu cùng một biến thực sự
làm cho một bản sao.
>> Và kêu gọi bằng cách tham chiếu có nghĩa là Tôi thực sự gửi một bản sao của
con trỏ đến biến đó.
Vì vậy, nó có nghĩa là tôi đang gửi vị trí của biến đó.
Vì vậy, tôi đã cảm nhận được vị trí của biến, khi tôi gọi hàm
với con trỏ, tôi có thể thực sự thay đổi dữ liệu đó là trong chính.
Có ý nghĩa?
>> Mặc dù, con trỏ là một bản sao, con trỏ vẫn có địa chỉ thực sự của
biến mà tôi muốn thay đổi.
Có ý nghĩa?
>> Vì vậy, việc tạo ra con trỏ.
Hãy nhớ rằng, con trỏ luôn luôn có loại mà nó chỉ
để và sau đó một ngôi sao.
Và sau đó bạn đặt tên.
Vì vậy, hãy nhớ rằng bất cứ khi nào bạn có bất cứ điều gì sao, nó giống như một con trỏ đến
rằng bất cứ biến gõ mà bạn đã có.
>> Vì vậy, đây tại sao, ví dụ, đó là một con trỏ và một số nguyên.
Và sau đó char sao là một con trỏ sao char và vv.
Vâng?
>> TƯỢNG: Nếu chúng ta có một con trỏ đến n ngôi sao x.
Tôi biết rằng tạo ra một con trỏ đến x.
Liệu nó cũng khai báo x là một số nguyên?
>> Lucas: OK, vì vậy khi bạn nói sao x n, bạn không tạo ra một con trỏ đến một
biến x.
Bạn đang tạo ra một con trỏ tên x.
>> TƯỢNG: [không nghe được].
>> Lucas: Vì vậy, khi tôi nói n x sao, tôi nói, hey, trong bộ nhớ, tôi sẽ
nhận được một trong ba hộp.
Và tôi sẽ nói rằng đó sẽ là x, đó là
sẽ là một con trỏ.
Và một điều thú vị về con trỏ là chúng ta nói rằng họ có
4 byte cho một máy tính 32-bit.
Và lý do cho điều đó là bởi vì 4 byte là 32-bit.
>> Và các máy tính 64 bit thực sự có địa chỉ con trỏ
có dài 64 bit.
Vì vậy, nó chỉ có nghĩa là kích thước của địa chỉ trong máy là khác nhau.
>> Vì vậy, Tham khảo và dereferencing.
Có hai nhà khai thác các bạn nên nhớ.
Đầu tiên là ký hiệu.
Thứ hai là ngôi sao.
Đừng nhầm lẫn bởi ngôi sao và điều này sao vì nhớ rằng, trong
trường hợp này, bạn có n sao.
>> Nó giống như một toàn bộ điều với nhau.
Không có sao n không gian.
Vì vậy, nó có nghĩa là nó là loại.
Nên nhớ rằng khi bạn có ngôi sao biến, bạn
nói về các loại.
>> Khi bạn chỉ có ngôi sao và sau đó tên của biến, nó có nghĩa là
bạn đang dereferencing con trỏ, mà có nghĩa là bạn đang nhìn vào
con trỏ, việc tìm kiếm địa chỉ đó là trỏ đến, đi đến địa chỉ đó,
và nhìn vào bất cứ khi nào bạn có ở đó.
Vì vậy, tôi nói với sinh viên của tôi rằng khi bạn có sao, bạn nên nghĩ rằng đó là
chữ viết tắt của nội dung.
>> Vì vậy, nếu bạn có một con trỏ và bạn làm sao con trỏ, đó là
nội dung của con trỏ.
Vì vậy, bạn đi đến bất cứ điều gì nó trỏ đến và xem xét các nội dung liên tục.
Và các ký hiệu tương tự điều như địa chỉ.
>> Vì vậy, nếu tôi có một biến a-- như thế, chúng ta hãy nói rằng tôi đã làm một int bằng 3--
nếu tôi muốn tìm địa chỉ đó biến một bộ nhớ, tôi chỉ có thể làm
ký hiệu a.
Vì vậy, nó là địa chỉ của một.
Có ý nghĩa?
>> Vì vậy, đây là một ví dụ.
Đây là mất tích int b, int c.
Vì vậy, int một bằng 3 phương tiện Tôi sẽ đi vào bộ nhớ.
Và tôi sẽ tìm thấy một khe cắm và đưa số 3 ở đây.
>> Và sau đó int b bằng 4.
Tôi sẽ làm điều tương tự.
Tới bộ nhớ và đặt một số 4 trong một trong các hộp.
Và int bằng 5.
Tìm hộp khác và đặt một số 5.
>> Vì vậy, dòng này làm ra là gì? n sao pa bằng một ký hiệu.
Vì vậy, trước hết, n sao pa.
Là nó làm gì?
>> TƯỢNG: [không nghe được].
>> Lucas: Vâng, vì vậy n sao pa, đầu tiên, khai báo một con trỏ được gọi là pa.
Và sau đó nó gán giá trị của con trỏ đó là địa chỉ của một.
Vì vậy, một ký hiệu.
Sau đó, nếu tôi làm sao pb, một pb sao là gì?
>> Ồ, xin lỗi.
Đây cũng là mất tích. n pb sao.
Ý tôi là sao máy tính.
Tôi rất xin lỗi.
Đó là điều tương tự.
Nhưng bây giờ tôi tốt ar tạo ra một con trỏ b và sau đó một con trỏ đến c.
Vâng?
>> TƯỢNG: [không nghe được]?
>> Lucas: Có.
Vì vậy, nếu bạn đi đến bộ nhớ và bạn đi đến hộp đó là vấn thiết kế cho pa,
bạn đang thực sự sẽ thấy một địa chỉ của một.
OK?
Vâng?
>> TƯỢNG: [không nghe được]?
>> Lucas: Vâng, con trỏ là một địa chỉ.
Không bao giờ quên điều đó.
Nó giống như là quan trọng nhất một phần về con trỏ.
Có lưu trữ và địa chỉ một số biến.
Bất cứ điều gì khác?
Bất kỳ câu hỏi nào khác không?
OK.
>> Vì vậy, Con trỏ và mảng.
Hãy nhớ rằng khi tôi làm int mảng 3, về cơ bản, tôi là, loại gì tôi đang làm là
của, tuyên bố trong một con trỏ.
Vì vậy, mảng là loại giống như một con trỏ đến một nơi cụ thể trong bộ nhớ trong mà tôi
phân bổ ba khe cắm cho các số nguyên.
Điều đó có ý nghĩa?
>> Vì vậy, khi tôi làm int mảng 3, những gì tôi làm, về cơ bản, được tạo ra ba
khe trong bộ nhớ.
Vì vậy, tôi chỉ tìm thấy ba khe trong bộ nhớ.
Vì vậy, nếu tôi làm, sau đó, một loạt ngôi sao, nó về cơ bản có nghĩa là nội dung của mảng,
có nghĩa là tôi xóa các con trỏ, tôi đi với nơi mà nó trỏ đến,
và tôi đặt một số.
>> Và sau đó, nếu tôi làm mảng sao cộng với 1, đó là điều tương tự như làm mảng
ngoặc đơn, mà chỉ có nghĩa là tôi đi đến nơi mà nó chỉ vào.
Và sau đó là làm cho cộng 1 tôi chuyển sang một vị trí.
Vì vậy, tôi đi đến vị trí này, trên thực tế, và đưa số hai.
>> Và sau đó, cuối cùng, khi tôi làm mảng cộng với 2, tôi đi đến nơi
trỏ mảng tại.
Và sau đó tôi chuyển sang các khối bộ nhớ.
Và sau đó tôi đưa số ba ở đây.
Vâng?
>> TƯỢNG: mảng Vì vậy, chỉ đơn giản là sao nói điểm đầu tiên.
Và bạn có thể thêm 1, chỉ vì chúng tôi chỉ thực sự
tham khảo địa chỉ đầu tiên.
>> Lucas: Vâng.
Tại sao chúng ta, ví dụ, nói mảng 0, 1 mảng và mảng 2?
Tôi nói, tại sao bạn làm 0, 1, 2, 3 thay vì 1, 2, 3?
Một trong những lý do là, một, máy tính lập trình thích để bắt đầu
kể từ 0.
Hai là bởi vì khi bạn làm mảng 0, đó là điều tương tự như làm mảng
cộng với 0, có nghĩa là tôi đi đến vị trí đó, và tôi không
bỏ qua bất kỳ các khối bộ nhớ.
Vì vậy, tôi không di chuyển bất kỳ khối bộ nhớ.
Vâng?
>> TƯỢNG: [không nghe được]?
>> Lucas: Vì vậy, cô ấy hỏi là gì sự khác biệt giữa làm
này hoặc làm malloc.
Một trong những sự khác biệt là int mảng 3 là tạo ra một
mảng trên stack.
Và khi tôi làm malloc, nó tạo ra trên heap.
Điều đó có ý nghĩa?
>> Vì vậy, làm thế nào để malloc thực sự làm việc?
Vì vậy, tại sao chúng ta thậm chí cần phải sử dụng malloc?
Loại trình biên dịch của con số ra tất cả các biến mà bạn đã khai báo.
Và ông đã tạo ra không gian cho tất cả của chúng trong ngăn xếp.
Vì vậy, tất cả các biến của bạn sẽ một nơi nào đó trong ngăn xếp.
Vì vậy, đây là biến môi trường.
>> Vì vậy, về cơ bản, không gian cho các biến trong bộ nhớ được phân bổ vào
thời gian biên dịch.
Vì vậy, nó có nghĩa là máy tính của bạn có biết tất cả những biến
trước.
Nó không cần biết giá trị bạn sẽ đặt trong đó.
Nhưng nó cần phải biết làm thế nào nhiêu bộ nhớ bạn cần.
>> Nhưng bây giờ chúng ta hãy nói rằng, ví dụ, bạn đang tạo ra một mảng hoặc tham gia một
chuỗi mà bạn đang dùng từ người sử dụng.
Bạn không biết làm thế nào dài chuỗi là có được, ví dụ.
Vì vậy, bạn không biết chính xác có bao nhiêu các khối bộ nhớ bạn phân bổ, phải không?
>> Vì vậy, nó không thực sự có ý nghĩa cho bạn nói đưa 100 ký tự.
Và sau đó những gì nếu người dùng viết 150?
Bạn sẽ được vặn.
>> Vì vậy, về cơ bản, bạn không thể chắc chắn như thế nào nhiêu bộ nhớ bạn cần phải phân bổ
khi bạn biên dịch chương trình.
Bạn chỉ cần biết rằng vào thời gian chạy.
Vì vậy, đó là lý do tại sao bạn có đống.
Vì vậy, các đống sẽ có bộ nhớ rằng bạn đang phân bổ trong
thời gian của chương trình đang chạy.
>> Vì vậy, về cơ bản, khi bạn làm malloc, những gì bạn đang làm là phân bổ bộ nhớ
thời gian chạy, có nghĩa là bạn quyết định ngay tại thời điểm đó mà bạn
nên có bộ nhớ đó.
Vì vậy, đó là khi bạn đang phân bổ nó.
Điều đó có ý nghĩa?
>> Vì vậy, hãy nhớ rằng, chồng có biến được tạo ra vào thời gian biên dịch.
Và sau đó các đống có biến được tạo ra khi bạn đi
với malloc, ví dụ.
>> TƯỢNG: [không nghe được]?
>> Lucas: Vậy là GetString sẽ gọi malloc.
Hãy để tôi nói về malloc, và Tôi sẽ giải thích GetString.
Vì vậy, malloc là điều tương tự như cấp phát bộ nhớ.
Vì vậy, nó sẽ phân bổ bộ nhớ trên heap.
Và nó sẽ trả về một con trỏ đến nơi mà bộ nhớ được phân chia.
>> Vì vậy, khi bạn do--
đây để example--
n con trỏ sao.
Và sau đó con trỏ bằng malloc kích thước của 10 inch lần.
Tôi là tạo ra một con trỏ.
Và sau đó tôi chỉ định rằng con trỏ đến giá trị của con trỏ mà malloc
đem lại cho tôi.
>> Vì vậy, tôi yêu cầu malloc bạn có thể phân bổ không gian cho 10 số nguyên.
Đó là những gì nó nói.
Và malloc mang lại cho tôi trở lại một con trỏ đến nơi đó.
Có ý nghĩa?
OK.
Và tôi GetString được, về cơ bản, làm một gọi đến malloc để bạn có thể phân bổ
bộ nhớ trong thời gian chạy.
>> Luôn luôn nhớ để kiểm tra null vì malloc sẽ trả về null
nếu nó không thể cấp phát bộ nhớ.
Hãy nói rằng bạn yêu cầu vô lý số lượng bộ nhớ.
Máy tính của bạn không phải là có được có thể phân bổ nhiều.
>> Vì vậy, malloc là chỉ cần đi để trả về null.
Vì vậy, luôn luôn ghi nhớ để kiểm tra xem con trỏ mà bạn nhận được từ malloc
null hay không bởi vì, nếu có, có lẽ bạn được dereferencing một con trỏ và
gây ra lỗi bên.
Và cuối cùng, đừng quên bộ nhớ của bạn.
>> Malloc được tạo ra bộ nhớ trong heap.
Và bạn phải giải phóng bộ nhớ trước khi chương trình kết thúc.
OK, đó là tất cả đối với tôi.
Xin lỗi, Rob.
Cảm ơn.
>> [Vỗ tay]
>> Lucas: Bất kỳ câu hỏi cuối cùng trước khi Rob đến?
Không có?
Vâng?
>> TƯỢNG: Tôi không thấy này một trực tuyến.
Bạn đã tải lên nó chưa?
>> Lucas: Tôi nghĩ là Dave tải lên nó sớm.
>> DAVE: Nó sẽ được đăng.
>> Lucas: Nó sẽ được trực tuyến.
>> TƯỢNG: Đó là lên.
>> Lucas: Đó là lên?
OK.
Vâng?
>> TƯỢNG: [không nghe được]?
>> Lucas: Có, bạn nên thoát tất cả các bộ nhớ được đặt trong heap.
>> TƯỢNG: [không nghe được]?
>> Lucas: Có.
Bất cứ lúc nào bạn có một malloc văn hóa, bạn cần phải có một nền văn hóa miễn phí
sau khi bạn ngừng sử dụng biến đó.
Vì vậy, malloc và miễn phí là luôn bên nhau.
Người bạn tốt nhất của họ.
Yeah.
Rob?
>> ROB: Tôi sẽ đi một cách nhanh chóng.
Và cũng là video sẽ được đưa lên.
Tôi có mic trên.
>> OK, vì vậy tuần thứ năm.
Điều đầu tiên chúng ta có là chồng.
Vì vậy, hãy nhớ rằng chỉ có một chồng khung cho mỗi cuộc gọi chức năng hoạt động.
Chúng ta sẽ thấy rằng trong một giây.
Và cũng có thể nhớ những gì thực sự đi trong mỗi khung ngăn xếp sẽ được
các biến địa phương của các chức năng của chúng tôi, các đối số được truyền vào chúng tôi
chức năng, cùng với một vài những thứ khác bạn không thực sự
cần phải lo lắng.
>> Vì vậy, đây là một chương trình ví dụ ở đâu, thông báo, chính là sự trở lại printfing
giá trị của foo 4.
foo là chỉ cần đi để trả lại giá trị của thanh 4 dấu phẩy 6.
Và thanh sẽ thiết lập một số địa phương n biến bằng 4 lần 6.
Và sau đó trở về n.
>> Vì vậy, chúng ta hãy nhìn vào ngăn xếp trong suốt lặp đi lặp lại thực tế của chương trình này.
Vì vậy, có dưới cùng của ngăn xếp của chúng tôi.
Hãy nhớ rằng chồng lớn lên.
Vì vậy, ở dưới cùng của ngăn xếp của chúng tôi, chúng tôi có một khung stack cho chính.
Khi chương trình bắt đầu, chính luôn luôn là sẽ có mặt tại
dưới cùng của ngăn xếp của chúng tôi.
>> Và những gì là bên trong của chúng tôi ngăn xếp khung cho chính?
Vì vậy, mặc dù không có địa phương biến chính, như tôi đã nói trước đây,
chúng tôi đã argc và RGV chiếm không gian bên trong của chính stack frame.
Vì vậy, chính hiện nay sẽ gọi hàm foo.
Và điều đó có nghĩa là foo sẽ có stack frame riêng của mình.
>> Vì vậy, bây giờ chúng tôi đang ở trong các foo chức năng.
Và những gì cần phải đi stack frame foo không?
Vâng, foo có một đối số n.
Và n bằng 4 vì đó là những gì chính là đi qua như là đối số của foo.
>> Vì vậy, bây giờ foo sẽ gọi thanh.
Thanh là những gì sẽ có trong của 'stack frame của nó?
Nó có x bằng 4 y bằng sáu.
Đó không phải là tất cả những gì chúng ta sẽ có trong khung ngăn xếp vì thanh
cũng có một biến n địa phương.
Và n chúng ta sẽ thiết lập bằng 24.
>> Vì vậy, bây giờ thanh sẽ trở lại n.
Vì vậy, thanh đang trở lại từ 24 đến ngăn xếp khung foo.
Và bởi vì thanh bây giờ quay trở lại, mà có nghĩa là chúng ta đang xuất hiện các khung stack
cho thanh tắt của chồng.
Vì vậy, tất cả các bộ nhớ mà thanh đã sử dụng hiện nay là ra khỏi ngăn xếp.
>> Bây giờ, foo cũng sẽ trở lại từ 24 đến chính.
Vì vậy, bây giờ foo được trở về, bộ nhớ foo đã được sử dụng trong 'của nó
stack frame cũng đã biến mất.
Và bây giờ, chính là sẽ gọi printf.
Vì vậy, printf chỉ là một chức năng.
Khi chúng tôi gọi printf, nó sẽ được một khung stack cho printf
chức năng gọi.
>> Chúng ta đang đi qua printf?
Đó là những gì đang xảy ra đi trên khung ngăn xếp của nó.
Ít nhất, chúng tôi đang đi qua rằng phần trăm i n và dấu gạch chéo ngược
đối số 24.
Nó có thể có nhiều trong đó là stack frame nếu printf xảy ra để được sử dụng một số
biến địa phương.
Chúng tôi không biết.
>> Nhưng tất cả những gì đi vào của printf ngăn xếp khung.
Nó sẽ thực hiện printf.
Sau đó printf được thực hiện.
Nó sẽ trở lại.
Cuối cùng, chính được thực hiện.
Chính sẽ trở lại.
Và sau đó chương trình của chúng tôi được thực hiện.
Vâng?
>> TƯỢNG: Bạn có nhìn thấy [không nghe được]
lập luận [không nghe được]
các thông số?
>> ROB: Như vậy, có một sự khác biệt tinh tế giữa lý luận và các thông số.
Và thực sự, trong nói chuyện thông thường, mọi người có xu hướng chỉ cần trộn chúng lên tất cả các thời gian.
Tuy nhiên, các thông số là chính thức tên các sự vật.
>> Vì vậy, argc và argv là tham số cho chính.
Đối số là những gì bạn thực sự vượt qua trong khi các thông số.
Vì vậy, khi tôi gọi foo 4, 4 là tham số tôi đi qua trong.
Và tham số n, bên trong foo, mang giá trị 4
kể từ 4 là lập luận.
>> TƯỢNG: [không nghe được]?
>> ROB: n là một biến địa phương để thanh.
n vẫn còn địa phương để foo, nhưng đó là một tham số foo.
Nó không phải là một biến địa phương.
Vâng?
>> TƯỢNG: [không nghe được]?
>> ROB: foo chỉ được gọi thanh và trở về bất cứ điều gì trở lại quán bar.
>> TƯỢNG: [không nghe được]?
>> ROB: Vâng, chỉ để xem nhiều ngăn xếp khung.
Vâng?
>> TƯỢNG: Tại sao foo được gọi là trước khi printf?
>> ROB: Tại sao gọi là foo trước khi printf?
Vì vậy, tôi có thể có, thay vào đó, làm điều gì đó như int x bằng foo của 4
và sau đó in x.
Nhưng thay vào đó, tôi kết hợp các chức năng gọi vào đối số printf.
>> Nhưng chú ý rằng chúng tôi có thể không thực sự thực hiện các cuộc gọi đến printf đến khi chúng tôi
tìm ra những gì là foo 4.
Vì vậy, chúng ta sẽ đánh giá này.
Và chỉ một lần thực hiện xong sẽ trở lại và đánh giá này.
Vâng?
>> TƯỢNG: Bởi vì cả hai thanh [không nghe được]
giá trị, tại sao chúng ta không có [không nghe được]?
>> ROB: Họ hoàn toàn phải là int.
Đó không phải là bắt hơn nhiều đường.
Vì vậy, nó phải được thanh int và int foo kể từ khi cả hai của những
đang quay trở lại các số nguyên.
Void duy nhất là nếu họ sẽ không để trở về giá trị thực tế.
Vâng?
>> TƯỢNG: Nếu bạn đã có một dòng trên sự trở lại, [không nghe được]?
>> ROB: Một dòng trên sự trở lại?
>> TƯỢNG: Vâng.
Cũng giống như nếu bạn đã làm printf và [không nghe được], nó sẽ in hai lần?
>> ROB: Vì vậy, bên trong foo?
Nếu chúng ta có một printf ngay tại đây?
>> TƯỢNG: Vâng.
>> ROB: Vì vậy, nếu chúng ta có quyền printf ở đây, nó sẽ in một lần.
Vì chúng ta đang gọi foo một lần ngay ở đây, sau đó chúng tôi sẽ nhấn printf.
Sau đó, chúng ta sẽ gọi thanh.
Và sau đó foo sẽ trở lại.
Và đó là nó.
Chúng tôi chỉ có bao giờ gặp phải printf một lần.
Vâng?
>> TƯỢNG: [không nghe được]
printf gọi foo bởi vì chúng tôi đầu tiên gọi printf và sau đó chúng tôi đang đi qua
các đối số.
>> ROB: Vì vậy, về mặt lý thuyết, không phải là printf gọi foo?
Vì vậy, không có.
Chỉ cần theo thứ tự mà c sẽ thực hiện những điều này là, trước khi chúng ta có thể
gọi một chức năng, tất cả các đối số với chức năng phải
được đánh giá hoàn toàn.
Vì vậy, điều này hoàn toàn được đánh giá?
Vâng, nó chỉ là một chuỗi.
Nó chỉ là một giá trị.
>> Sau đó, chúng ta phải hoàn toàn đánh giá này.
Một khi điều này được thực hiện, bây giờ tất cả đối số của nó được đánh giá.
Và bây giờ chúng tôi có thể làm cho gọi printf.
Vâng?
>> TƯỢNG: Một câu hỏi.
Nếu bạn có một chức năng vô hiệu, phải bạn có dấu chấm phẩy trở lại?
>> ROB: Bạn làm không phải là một dấu chấm phẩy trở lại nếu bạn có một chức năng vô hiệu.
OK.
Vì vậy, tại một số công cụ đống.
Vì vậy, đống là làm thế nào chúng ta sẽ đối phó với quản lý bộ nhớ động.
Và điều này trực tiếp trái ngược với ngăn xếp mà chúng ta gọi là tự động
quản lý bộ nhớ.
>> Vì vậy, trên stack, bạn không bao giờ thực sự có làm thế nào để đối phó với các biến địa phương
đang bị đẩy và bật tắt tất cả các khung stack và tất cả những thứ đó.
Bạn không cần phải lo lắng về nó.
Nó tự động.
Vì vậy, các đống là thủ công.
Và [không nghe được]
xuất phát từ các chức năng này malloc và miễn phí.
>> Vì vậy, đây là một chương trình khác.
Tất cả chúng ta đang làm là mallocing một số nguyên.
Chúng tôi đang lưu trữ nó trong sao x.
Tất nhiên, chúng ta phải kiểm tra để xem nếu x là null.
Sau đó, chúng ta sẽ chỉ cần thiết lập gì x được trỏ đến đến 50.
In những gì x được trỏ đến, in x, và sau đó miễn phí x.
>> Vì vậy, làm thế nào là thực sự sẽ xem xét nếu chúng ta nhìn vào stack và heap của chúng tôi?
Vì vậy, chúng tôi sẽ bắt đầu lại.
Dưới cùng của ngăn xếp của chúng tôi như trước.
Hãy nhớ rằng ngươi đống trực tiếp phản đối việc chồng?
Vì vậy, chúng ta sẽ có đầu đống của chúng tôi ở đó.
>> Vì vậy, dưới cùng của ngăn xếp của chúng tôi, chúng tôi có stack frame của chúng tôi cho chính.
Nó có không gian cho argc, argv, và chúng tôi bây giờ có một biến địa phương x,
là một ngôi sao int.
Vì vậy, chúng ta sẽ lặp thông qua chương trình này.
Điều đầu tiên chúng ta có là một cuộc gọi đến malloc.
>> Vì vậy, chúng tôi đang thực hiện một cuộc gọi đến malloc.
Malloc là một chức năng.
Nó sẽ có được một khung stack.
Chúng ta đang đi qua để malloc?
Điều đó sẽ đi vào bên trong của khung stack.
Chúng tôi đang đi qua kích thước của n, mà là 4.
Vì vậy, đó là thông qua malloc.
>> Không malloc làm gì?
Nó lấy chúng tôi một số không gian trên heap.
Vì vậy, chúng ta sẽ đi đến đống.
Và chúng ta sẽ lấy 4 byte từ đống.
Vì vậy, chúng ta hãy chỉ cho rằng một địa chỉ tùy ý.
0x123 Chỉ cần giả vờ đó là một địa chỉ đó là trên heap.
>> Vì vậy, những gì thực sự là bên trong đó khu vực bộ nhớ tại địa chỉ Ox123?
Rác thải.
Vì vậy, chúng tôi đã không lưu trữ bất cứ điều gì trong đó.
Vì vậy, theo chúng tôi được biết, nó có thể là bất cứ điều gì.
Bạn không nên cho rằng đó là số không.
Đó là không có khả năng không nhất.
>> Lợi nhuận vì vậy bây giờ malloc.
Và chúng ta làm gì khi malloc lợi nhuận?
Chúng tôi thiết lập những gì nó trở về.
Chúng tôi thiết lập x bằng gì nó đang trở lại.
Vì vậy, những gì là nó trở về?
Nó trở về 0x123 vì đó là địa chỉ của khối bộ nhớ rằng nó
chỉ phân bổ trong đống.
>> Vì vậy, trở lại 0x123 x bây giờ sẽ được thiết lập bằng 0x123 đó, những bức tranh,
chúng tôi thường xuyên vẽ như x có một thực tế mũi tên chỉ vào khối đó.
Nhưng x chỉ được lưu trữ địa chỉ đó.
Vì vậy, bây giờ chúng tôi phải kiểm tra xem x là null.
Đó không phải là null.
Chúng tôi giả vờ rằng malloc đó đã thành công.
>> Vì vậy, tại sao x bằng 50.
Vì vậy, nó có nghĩa là sao nhớ đi đến địa chỉ đó.
Vì vậy, 0x123 Chúng ta sẽ đi đến địa chỉ đó.
Vì vậy, đưa chúng ta lên đó.
Chúng tôi đang làm gì tại địa chỉ đó?
Chúng tôi đang lưu trữ 50.
>> Vì vậy, sau khi dòng này, đó là những gì mọi thứ sẽ như thế nào.
Vì vậy, bây giờ nó không còn rác trên đó.
Bây giờ chúng ta biết rằng 50 là ở chỗ địa chỉ cụ thể vì
chúng tôi đặt nó vào đó.
OK?
Vì vậy, bây giờ chúng ta sẽ in f.
>> Vì vậy, đầu tiên chúng ta sẽ in sao x.
Vì vậy, sao x là gì?
Một lần nữa, ngôi sao x có nghĩa là đi đến điều mà x được trỏ đến.
Vì vậy, x được lưu trữ 0x123 Tới đó.
Chúng tôi nhận được 50.
Vì vậy, in f.
Và điều đó có nghĩa là nó sẽ in 50.
Và sau đó trả về.
>> Và sau đó chúng ta có printf thứ hai.
Chúng tôi bây giờ phần trăm p.
Nếu bạn không nhìn thấy nó, đó là như thế nào bạn in một con trỏ.
Vì vậy, chúng tôi có phần trăm tôi, phần trăm f, và tất cả những người đã có.
Vì vậy, phần trăm trang, in một con trỏ.
>> Vì vậy, x là một con trỏ.
Vì vậy, nếu chúng ta sẽ in x chính nó, chúng tôi đang in những gì là thực sự bên trong
x, đó là 0x123 Vì vậy, lần đầu tiên f in sẽ in 50.
In thứ hai f sẽ in 0x123 Yeah?
>> TƯỢNG: Bạn có sử dụng phần trăm x để in một con trỏ?
>> ROB: Vì vậy, bạn sử dụng phần trăm x để in một con trỏ?
Vì vậy, bạn có thể nhưng phần trăm x chỉ là, nói chung, cho như thế nào nếu bạn có một số
số nguyên và bạn muốn in nó như là một hệ thập lục phân.
Đó chỉ là cách bạn làm điều đó.
>> Trong khi đó, phần trăm d sẽ in như số thập phân.
Đó là đã được chúng tôi có được phần trăm d. tôi chỉ là số nguyên.
phần trăm p là đặc biệt cho con trỏ.
>> Vì vậy, x là một con trỏ.
Chúng tôi muốn sử dụng phần trăm p.
Nhưng phần trăm x có thể làm việc.
Vâng?
>> TƯỢNG: [không nghe được]?
>> ROB: Vâng.
Ít nhất cho điều này call-- vì vậy tôi không bao gồm nó ở đây.
Tuy nhiên, hai đối số này là cần thiết bên trong khung stack này
cùng với bất kỳ biến địa phương printf xảy ra để được sử dụng.
Và sau đó các cuộc gọi tiếp theo để printf giờ bên trong printf stack frame là
phần trăm p n dấu gạch chéo ngược và bất cứ điều gì giá trị của x là, đó là 0x123.
Vâng?
>> TƯỢNG: [không nghe được]?
>> ROB: Nó sẽ in một cái gì đó trông như thế này.
>> TƯỢNG: [không nghe được].
>> ROB: Vì vậy, nó in nó ở dạng địa chỉ.
Nó trông giống như một địa chỉ.
Vâng?
>> TƯỢNG: [không nghe được]?
>> ROB: Tại sao là gì?
>> TƯỢNG: [không nghe được]?
>> ROB: Tại sao con trỏ này 4 byte?
Vì vậy, có cả một bó 0 ở phía trước này.
Vì vậy, nó thực sự 0x0000000123.
Trên hệ thống 64-bit, sẽ có một bó toàn bộ nhiều hơn số không.
Vâng?
>> TƯỢNG: [không nghe được].
>> ROB: Vì vậy, các printf đầu tiên sẽ print--
>> TƯỢNG: [không nghe được].
>> ROB: Vâng, nó sẽ in những gì x được trỏ đến.
Sao nói điều này là Điều trỏ đến.
Lấy nó.
Vì vậy, những gì là nó chỉ vào?
50.
Lấy nó.
Đó là những gì chúng ta sẽ in.
Trong khi đó, một trong những tiếp theo, chúng tôi chỉ cần in x chính nó.
Bên trong của e là gì?
0x123.
OK.
>> Và sau đó, cuối cùng, chúng ta có tự do.
Chúng ta đang đi qua để giải phóng?
Chúng tôi đang đi qua x.
Đó là thời gian tôi thực sự hiển thị nó trong khung stack.
>> Vì vậy, chúng tôi đang đi qua giá trị 0x123 để giải thoát.
Vì vậy, bây giờ miễn phí biết, tất cả các bên phải, Tôi phải đi đến đống
và miễn phí bộ nhớ.
Nó không còn sử dụng những gì là tại địa chỉ 0x123.
>> Vì vậy, miễn phí sẽ phát hành rằng từ đống.
Bây giờ chúng tôi là đống rỗng một lần nữa.
Chúng tôi không có rò rỉ bộ nhớ.
Bây giờ miễn phí sẽ trở lại.
Chú ý rằng x vẫn là 0x123.
Nhưng mà bây giờ không phải là bộ nhớ hợp lệ.
Chúng tôi nên không còn tới đích x.
Vâng?
>> TƯỢNG: là trở về 0 dư thừa?
>> ROB: Sản returen 0 dư thừa?
Có.
Chúng tôi chỉ cần đặt rằng có vì chúng tôi có một sự trở lại không khí.
Vì vậy, nó giống như, yeah, cho phép bao gồm sự trở lại 0.
Vâng?
>> TƯỢNG: [không nghe được]?
>> ROB: Vì vậy, sau khi x miễn phí, những gì sẽ xảy ra nếu chúng tôi cố gắng để tới đích của con trỏ?
Có thể là không có gì sai trái.
Có thể là chúng tôi vẫn sẽ nhận được 50.
>> Có thể, cũng có thể, đó là bộ nhớ hiện đang được sử dụng cho cái gì khác.
Vì vậy, đó là hành vi không xác định.
Và không xác định có nghĩa là bất cứ điều gì có thể xảy ra.
Vâng?
>> TƯỢNG: [không nghe được]?
>> ROB: Không, vì vậy nếu bạn chỉ định x đến cái gì khác.
Vì vậy, nếu ở đây chúng tôi đã nói x bằng một cái gì đó malloc else--
malloc kích thước event--
sau đó khối ban đầu bộ nhớ không được giải phóng.
Và chúng tôi đã chính thức đánh mất nó.
Đó là một rò rỉ bộ nhớ.
Chúng tôi đã mất tất cả tài liệu tham khảo với khối bộ nhớ.
Vì vậy, không có cách nào chúng tôi bao giờ có thể giải phóng nó.
OK, vì vậy sau đó trở về 0 có nghĩa là thực hiện.
>> Được rồi, vậy chồng tràn.
Ý tưởng ở đây là gì?
Vì vậy, hãy nhớ rằng, đống là đi xuống.
Chồng đang đi lên.
Vì vậy, đây là ví dụ từ bài giảng, Tôi nghĩ rằng, đó chính là chỉ cần đi để
gọi chức năng này foo, mà là có để gọi chính nó đệ quy hơn và
trên một lần nữa.
>> Vì vậy, ngăn xếp khung sẽ làm việc chính xác như nhau.
Vì vậy, chúng ta sẽ bắt đầu với chính như ngăn xếp khung phía dưới.
Sau đó, chính là sẽ gọi foo, mà là sẽ có được một khung stack.
>> Sau đó foo sẽ gọi foo một lần nữa, đó là sẽ có được
một khung stack.
Và sau đó 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 cho đến khi, cuối cùng, chúng tôi chạy
vào đống.
Vì vậy, đây là cách chúng ta có được một lỗi tràn stack.
Và vào thời điểm này, bạn seg lỗi.
Hoặc bạn muốn thực sự seg lỗi trước thời điểm này nhưng yeah.
>> TƯỢNG: Sản phẩm cốt lõi đổ tương tự như lỗi seg?
>> ROB: Vì vậy, bạn sẽ thấy phân khúc lõi đổ lỗi.
Bạn nhận được một bãi chứa lõi khi bạn seg lỗi.
Và nó giống như một bãi chứa của tất cả các nội dung của bộ nhớ hiện tại của bạn để
mà bạn có thể thử và xác định tại sao bạn SEG đổ lỗi.
Vâng?
>> TƯỢNG: [không nghe được]?
>> ROB: Vì vậy, một phương tiện lỗi phân khúc có một chồng tràn.
Vì vậy, không nhất thiết.
Một lỗi phân khúc có nghĩa là bạn bộ nhớ cảm động theo một cách
bạn không nên.
Vì vậy, một cách để điều đó xảy ra là, khi bạn ngăn xếp tràn, chúng ta bắt đầu cảm động
bộ nhớ trong một cách mà chúng ta không nên.
Vâng?
>> TƯỢNG: [không nghe được]?
>> ROB: Vì vậy, bên trong một vòng lặp vô hạn.
Giống như, điều này giống như một đệ quy vô hạn vòng lặp và vì vậy chúng tôi nhận được một
ngăn xếp khung mỗi lần.
Nhưng chỉ bên trong của một thường xuyên vô hạn trong khi one--
tốt, chúng ta thậm chí không in f--
làm điều gì đó.
Bất cứ điều gì.
>> Chúng tôi sẽ không nhận được một khung stack.
Chúng ta sẽ tiếp tục vòng lặp hơn chỉ dẫn duy nhất này.
Các stack là không phát triển.
Đó là một thực tế là mỗi đệ quy gọi cho chúng ta một khung stack.
Đó là lý do tại sao chúng tôi có được một chồng tràn.
Vâng?
>> TƯỢNG: Vì vậy, nếu bạn nói để có được trong khi vòng lặp và sau đó [không nghe được]?
>> ROB: Vì vậy, nếu bên trong vòng lặp while có một printf, bạn vẫn sẽ
lỗi không seg.
Tôi chỉ không muốn nhầm lẫn giữa việc.
Nó sẽ lặp.
Bạn sẽ nhận được một chồng đơn khung cho printf.
>> Sau đó printf sẽ trở lại.
Sau đó, bạn sẽ lặp lại.
Bạn sẽ nhận được một chồng đơn khung cho printf.
Nó sẽ trở lại.
Độc stack frame.
Vì vậy, bạn không nhận được vô hạn chồng chất lên khung stack.
>> TƯỢNG: [không nghe được]?
>> ROB: Có.
Vì vậy, đây sẽ xảy ra tràn stack bởi vì không ai trong số các
các cuộc gọi đến foo đang quay trở lại.
Vì vậy, nếu chúng ta trở lại, sau đó chúng tôi sẽ bắt đầu mất khung stack.
Và sau đó chúng tôi sẽ không ngăn xếp tràn.
Và đó là lý do tại sao bạn cần có một trường hợp cơ sở cho các chức năng cá nhân của bạn.
Vâng?
>> ĐỐI TƯỢNG: Là kích thước tiềm năng và ngăn xếp cho các đống tương tự cho
tất cả các chương trình?
>> ROB: Khoảng.
Là kích thước tiềm năng của ngăn xếp và đống giống nhau cho tất cả các chương trình?
Khoảng.
Có một số ngẫu nhiên để nơi chồng bắt đầu và
nơi đống bắt đầu.
Nếu bạn xảy ra để có một toàn bộ rất nhiều biến toàn cầu và những thứ, có lẽ bạn
lấy đi từ một số không gian cho đống của bạn.
>> Trên hệ thống 64-bit, bạn hầu như có bộ nhớ vô hạn.
Có quá nhiều.
Giữa 32 bit và 64 bit, có là một sự khác biệt đáng kể.
>> Bạn sẽ nhận được nhiều hơn cả ngăn xếp và không gian đống trên 64-bit
hệ thống bởi vì có nhiều chỉ địa chỉ mà họ có thể sử dụng.
Tuy nhiên, trên một hệ thống cá nhân, nó sẽ có khoảng cùng một lượng ngăn xếp
và không gian đống.
Tất cả các quyền.
>> Vì vậy, điều cuối cùng là biên dịch.
Vì vậy, bạn nên biết quá trình này.
Có bốn bước lớn.
Vì vậy, đầu tiên nên dễ nhớ.
Tiền xử lý.
Nó có tiền tố trước trong đó.
Vì vậy, nó đến trước khi mọi thứ khác.
>> Điều cần nhớ là băm.
Vì vậy, định nghĩa và băm băm bao gồm trong tất cả những người.
Đó là tất cả tiền xử lý chỉ thị.
Đây là những điều mà các tiền xử lý chăm sóc.
>> Vì vậy, những gì hiện một bộ xử lý trước làm gì?
Đó là một điều thực sự ngu ngốc.
Tất cả đó là có khả năng là tất cả các sao chép và cắt, dán và hoạt động.
>> Vì vậy, băm bao gồm tiêu chuẩn i0 chấm h.
Rằng làm là gì?
Nó lấy tiêu chuẩn i0 chấm h tập tin và dán nó vào đầu
bất cứ nơi nào nó nói băm bao gồm tiêu chuẩn i0 chấm h.
>> Và bất kỳ băm xác định rằng chúng tôi đã nhìn thấy, những gì là làm gì?
Sao chép giá trị của nó mà băm xác định được định nghĩa là và dán mà
bất cứ nơi nào bạn đang sử dụng giá trị.
Vì vậy, các tiền xử lý chỉ làm thực sự văn bản đơn giản dựa trên hoạt động.
Nó không có gì thông minh.
Vì vậy, mọi thứ khác là phức tạp hơn.
>> Vì vậy, bây giờ đó là tiền xử lý thực hiện, chúng tôi thực sự biên dịch.
Vậy biên dịch nghĩa là gì?
Chúng ta đang đi từ mã c để mã lắp ráp.
Vâng?
>> TƯỢNG: [không nghe được]?
>> ROB: Vâng, chúng tôi bắt gặp đó.
Vì vậy, biên dịch.
Chúng tôi sẽ từ c để lắp ráp.
Vì vậy, đây là một sự thay đổi ngôn ngữ thực tế.
Lập bản thân có nghĩa là đi từ một ngôn ngữ cấp cao hơn để
một ngôn ngữ cấp thấp hơn.
>> Và c là một ngôn ngữ cấp cao so với lắp ráp.
Lắp ráp là gì?
Hướng dẫn của nó mà, khá nhiều, làm cho CPU của bạn.
Tuy nhiên, máy tính của bạn vẫn không không hiểu lắp ráp.
Nó chỉ hiểu những người thân và số không.
Vì vậy, bước tiếp theo là lắp ráp, mà đưa chúng ta từ các hướng dẫn
CPU của bạn hiểu và thực sự dịch chúng, để
những người và số không.
>> Vì vậy, C để lắp ráp để nhị phân.
Nhưng tôi không có thực thi được nêu ra.
Vì vậy, suy nghĩ của các thư viện CS50.
Chúng tôi đã cung cấp cho bạn một số nhị phân cho CS50 thư viện này, trong đó có GetString
và getInt và tất cả những gì.
>> Nhưng CS50 library--
trong và của itself-- không thực thi.
Nó không có một chức năng chính.
Nó chỉ là một loạt các nhị phân mà bạn có thể sử dụng.
Vì vậy, liên kết là cách chúng tôi mang lại cùng tất cả các tập tin nhị phân khác nhau
vào một thực thi thực tế.
Một là bạn có thể gõ dot giảm một dấu chấm ra.
>> Vì vậy, đây cũng giống như các tập tin mà bạn viết, - bất cứ chương trình của bạn is--
Ceaser điểm c.
Nhưng bây giờ nó được biên soạn xuống nhị phân.
Vì vậy, Ceaser dot o.
Và đây là thư viện của chúng tôi CS50 nhị phân.
Và họ đang được kết hợp vào tập tin thực thi duy nhất.
Vâng?
>> TƯỢNG: [không nghe được]?
>> ROB: Vì vậy, đầu tiên bao gồm, nhớ, băm bao gồm thực sự là một
tiền xử lý bước.
Nhưng đó là riêng biệt.
Nếu bạn không sử dụng bất kỳ chức năng đang ở bên ngoài của tập tin duy nhất của bạn sau đó,
không có, bạn không cần phải liên kết bất cứ điều gì kể từ khi bạn có tất cả mọi thứ.
>> Điều đó nói rằng, printf đang được liên kết trong.
Nếu bạn đã từng sử dụng printf, đó là một cái gì đó mà cần phải được liên kết trong
bởi vì bạn đã không viết đó.
Và, trên thực tế, printf là tự động liên kết trong.
Bạn biết làm thế nào tại dòng lệnh hoặc khi bạn gõ thực hiện, bạn sẽ thấy nó có
dash l CS50, trong đó có liên kết trong thư viện CS50?
Printf, và các công cụ như vậy, sẽ được liên kết tự động.
Bất kỳ câu hỏi khác về bất cứ điều gì?
>> TƯỢNG: [không nghe được]?
>> ROB: Liên kết?
Chúng tôi có một bó toàn bộ tập tin nhị phân khác nhau.
Đây là ví dụ kinh điển mà chúng tôi sử dụng là thư viện CS50.
Chúng tôi đã biên soạn và cung cấp cho bạn nhị phân cho các thư viện CS50 này.
>> Bạn muốn sử dụng GetString trong chương trình của bạn.
Vì vậy, bạn đi và sử dụng GetString.
Nhưng nếu không có mã nhị phân của tôi cho GetString, khi bạn biên dịch mã của bạn
xuống, bạn có thể không thực sự chạy của bạn chương trình vì GetString String
chưa hoàn toàn xác định.
>> Đó là chỉ khi bạn liên kết trong hệ nhị phân của tôi có chứa GetString mà bây giờ, tất cả
đúng, tôi thực sự có thể thực hiện GetString.
Tập tin của tôi được hoàn tất.
Và tôi có thể chạy này.
Vâng?
>> TƯỢNG: Có nối liền chuyển đổi nhị phân để thực thi?
Vì vậy, ngay cả khi bạn không có khác thư viện, nó sẽ không còn được
cần thiết để dịch các [không nghe được]?
>> ROB: Vì vậy, một thực thi vẫn còn trong hệ nhị phân.
Nó chỉ là một kết hợp toàn bộ loạt các tập tin nhị phân.
>> TƯỢNG: Cảm ơn bạn rất nhiều.
>> ROB: Không có vấn đề.
Bất kỳ câu hỏi nào khác không?
Nếu không, tất cả chúng ta thiết lập.
Tất cả các quyền.
Cảm ơn.
>> [Vỗ tay]
>> TƯỢNG: Cảm ơn bạn.
>> ROB: Vâng.