Tip:
Highlight text to annotate it
X
>> SPEAKER 1: Chào tất cả mọi người.
Chúng ta sẽ bắt đầu.
Tôi nghĩ mọi người vẫn còn đang đi được lọc in
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, chào mừng đến với CS50 đố 0 xem xét.
Cho những người bạn, những người đã không nhận ra Chưa hết, bạn có một câu hỏi vào ngày 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ó các loại đèn trên.
Vì vậy, về cơ bản, tất cả mọi thứ mà đi trên 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 biểu.
>> 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 đèn để đại diện cho trên, hoặc 1, máy tính của chúng tôi hiểu nhị phân là 0 và
1 của, 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ó bằng 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.
Giống như những gì chúng tôi đã làm trên slide 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 số thập phân hay cơ số 10, hoặc
thực sự bất kỳ cơ sở, trên có thể thêm 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 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 các
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 đồ mà một 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 thêm và trừ những 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 B C 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 rằng bằng cách sử dụng phần trăm C, nó sẽ giải thích rằng, 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 rằng như
phần trăm D. Và cũng giống như bạn có thể thêm một số, bạn có thể thêm các ký tự là
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 số nguyên 5?
Bất kỳ ý tưởng?
Yeah.
>> Vì vậy, nếu chúng tôi có 5 như là một chuỗi, chúng tôi có thể trừ 0.
Và rằng sẽ cung cấp cho chúng tôi 5.
Và tương tự, nếu chúng ta có 5 như một số nguyên, bổ sung vào chuỗi 0.
Và cung cấp cho chúng ta những chuỗi 5.
Mát mẻ.
>> Bây giờ, nhớ lại trở lại giảng dạy một 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 có biết, chỉ cần cộng và trừ số và in ấn những điều trên không phải là
mà 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 cái gì đó phức tạp hơn một chút 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 nhiệm vụ 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 cho bạn đếm những người trong phòng
nơi tất cả mọi người đứng lên, bạn nói của 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 như thế nào hiệu quả một 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 tôi 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 một người dùng đoán.
Nếu đoán đúng, nói với họ họ đúng, khác nói với họ
họ không 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
có thể hiểu.
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ủ để 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 này trong khóa học, bạn đêm đến tiếp xúc với lập trình khác
các ngôn ngữ như PHP.
Hoặc nếu bạn thậm chí 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 c ngôn ngữ chương trình 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?
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ì một người nào đó -
bất cứ 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à cho biết rằng 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 để đối tượng 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 chút sau này, chúng tôi sẽ đi sâu hơn về trình biên dịch.
>> Vì vậy, nhớ lại pset 0, nơi mà - có, bạn có một câu hỏi?
>> ĐỐI TƯỢNG: [nghe được]?
>> SPEAKER 1: Có.
Tôi nghĩ rằng họ thực sự nên được trực tuyến.
Yeah.
>> ĐỐI TƯỢNG: Có như [không nghe được]?
>> SPEAKER 1: Nó không phải là.
Là trên cs50.net/quizzes.
>> ĐỐI TƯỢNG: Slash câu đố, giảm năm 2013, giảm 0, và chỉ cần nhấp vào thông qua
câu đố năm 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ó trên của bạn
máy tính của riêng, đó là tốt quá.
Nói rằng một lần nữa.
>> ĐỐI TƯỢNG: [nghe được].
>> SPEAKER 1: Vâng, [nghe được] là biến giả.
Ồ, có chứ?
>> ĐỐI TƯỢ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ô, đã được đì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ố lập 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 hoặc bất cứ điều gì mà 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ụ về đơ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 ta có toán tử Boolean.
Đâ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ó và hoặc không bằng, ít hơn hoặc bằng, lớn hơn hoặc
bằng, và ít hơn hoặc lớn hơn.
Nhưng 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ọ đang có, về cơ bản, 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, khác, điều kiện nếu, và 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ả
đường xuống câu nếu, khác, nếu, và khác kết hợp?
Có?
>> ĐỐI TƯỢ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 trở về tình trạng này
đú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 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.
Bất kỳ câu hỏi 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ó chỉ có thể
là một trong những trường hợp này.
Vì vậy chúng tôi 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.
Cho các vòng, 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 lặp 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 trong khi, 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, trong khi, bất cứ điều gì trong các việc cần làm sẽ luôn luôn chạy ít nhất một lần.
Trong khi đó, với thời gian, nó có thể không chạy ở tất cả nếu
tình trạng 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.
Tất cả các bạn đã 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à i + +.
Rất đơn giản mà chúng tôi đã thực hiện.
>> Cho 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 tôi 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 một 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 ta có thể muốn viết một số loại chức năng.
Chức năng phổ biến mà bạn có thể đã 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 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 chức năng -
GetInt, toupper.
Nhưng những xảy ra đã thực hiện cho chúng tôi bằng cách
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
I / O chuẩn thư viện.
Vâng, câu hỏi?
>> ĐỐ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ã.
>> ĐỐI TƯỢNG: Vì vậy, bạn không sẽ [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, giống như bạn có thể sử dụng một chức năng đó là 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 kiểu trả về đây, trong trường hợp này int, tên chức năng của chúng tôi và chúng tôi q
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 người nào khác chức năng 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ậ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.
Họ giúp phá vỡ mã của bạn vào nhiều tổ chức khối và làm cho
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 mã đó 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, bạn có thể
muốn sử dụng lại 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 số 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 một ngày mà David đã các bạn tính ra số lượng
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ự như vậy, trong Scratch, khi bạn có nhiều họa tiết, bạn có thể
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 riêng của họ.
Đó là một ví dụ về luồng.
>> Và khái niệm khác đó là được giới thiệu vào đầu là sự kiện.
Và các sự kiện là khi nhiều phần của mã của bạn giao tiếp với nhau.
Trong Scratch, điều này là khi bạn đã sử dụng phát sóng điều khiển và 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 các 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 đang 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 chỉnh sửa của bạn đến, 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 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ỏ thư mục loại bỏ một thư mục.
>> ĐỐI TƯỢ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 là đủ 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.
Nhưng hai cái chính mà chúng tôi đã sử dụng cho đến nay trong khóa học được
tiêu chuẩn I / O và CS50.
Những loại những thứ được bao gồm trong thư viện I / O tiêu chuẩn?
>> 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ề cách thư viện làm việc 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.
Nhưng những người là hai cái chính là chúng tôi đã tiếp xúc với rất xa trong
quá trình.
>> Các loại.
Đây là tốt để nhớ bao nhiêu mỗi loại được đại diện bởi hoặc làm thế nào
nhiều byte mỗi loại yêu cầu -
int, 4 byte; char, 1 byte.
Float là 4 byte.
Một đôi là gì?
>> ĐỐI TƯỢ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?
>> ĐỐI TƯỢNG: [nghe được].
>> SPEAKER 1: OK.
Là những gì một lâu?
>> ĐỐI TƯỢNG: [nghe được].
>> SPEAKER 1: Yeah, tăng gấp đôi một int.
Vâng.
>> ĐỐI TƯỢNG: [nghe được].
>> SPEAKER 1: Long [nghe được].
Và sau đó một thời gian dài dài là gấp đôi.
>> ĐỐI TƯỢNG: Không, không.
Một lâu chỉ là một int.
Nó phụ thuộc vào kiến trúc trước khi [nghe được]
và int có cùng kích thước.
[Nghe được].
>> SPEAKER 1: Vì vậy, một 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ì?
>> ĐỐI TƯỢNG: Pointer.
>> SPEAKER 1: Vâng, vì vậy chúng tôi đã học một chút về con trỏ.
Và bất kể những gì một con trỏ là chỉ vào - nó có thể là một ngôi sao char
hoặc một ngôi sao int -
nó luôn luôn 4 byte cho một con trỏ.
Câu hỏi về điều đó?
Có?
>> ĐỐI TƯỢNG: [nghe được]?
>> SPEAKER 1: Vì vậy, một dài và một int là giống nhau trong thiết bị CS50 này.
>> ĐỐI 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.
>> ĐỐI TƯỢNG: Đây là 32 bit?
>> SPEAKER 1: 32 bit, yeah.
>> ĐỐI TƯỢNG: Vì vậy, [không nghe được]?
>> SPEAKER 1: Vâng, nếu nó không nói một cách rõ ràng, bạn
nên cho một chút 32.
>> ĐỐI TƯỢNG: Nó sẽ nói điều gì đó như giả định một
kiến trúc như thiết bị.
Cho 64 bit, điều duy nhất mà thay đổi là chờ đợi và con trỏ.
Cả hai đều [không nghe được].
>> SPEAKER 1: Có?
>> ĐỐI TƯỢNG: Câu hỏi.
Vì vậy, một trong những câu đố thực tế, nó sẽ hỏi về một int unsigned.
Vì vậy, làm thế nào mà đượ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?
>> ĐỐI TƯỢNG: [nghe được].
>> SPEAKER 1: Đúng vậy.
Ai có thể đại diện cho các giá trị âm.
Nhưng làm sao nó làm điều đó?
>> ĐỐI TƯỢNG: [nghe được].
>> SPEAKER 1: Vâng, nó giúp tiết kiệm 1 bit để đại diện cho dấu hiệu.
Đã ký có một bit đại diện cho dấu hiệu.
Và unsigned chỉ là tất cả tích cực.
>> ĐỐI 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ó.
>> ĐỐI TƯỢNG: Làm thế nào một con trỏ đến một lâu dài [không nghe được]?
>> SPEAKER 1: Vậy câu hỏi là làm thế nào con trỏ đến một lâu 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.
>> ĐỐI TƯỢNG: [nghe được].
>> SPEAKER 1: Vâng, vì vậy 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ỏ được trỏ đến.
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 tôi 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 tôi cho 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 cho lâu dài và phần trăm s cho 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 các dòng mới.
Đây chỉ là khi bạn định dạng mã của bạn để in f.
Có?
>> ĐỐI TƯỢNG: phần trăm d để làm gì?
>> SPEAKER 1: Vậy câu hỏi là phần trăm d cho là gì?
Phần trăm d là số nguyên.
Phần trăm d và phần trăm tôi đều giống nhau.
>> ĐỐI 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
phản ứng dữ dội r?
Tôi nghĩ rằng dấu gạch chéo ngược r là -
>> ĐỐI TƯỢNG: r Vì vậy, dấu gạch chéo ngược chỉ ngụ ý 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
[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?
Được rồi.
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 có
khoảng đại diện của tuần thứ hai và đầu tuần ba bắt đầu ra
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 nổi để ints, và
chờ đợi lâu để tăng gấp đôi.
>> Tất cả những điều 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 để ints.
Vì vậy, đây là một chút lạ.
Chúng tôi có một phao đó là 1,31.
Chúng ta nhân nó bằng 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?
>> ĐỐI TƯỢNG: Tôi nghĩ rằng đó là 10.000.
>> DAN: Vì vậy, tôi nhân nó bằng 10.000 trước khi tôi đúc nó.
>> ĐỐI TƯỢNG: Oh.
Sẽ không có được một 9 và một số 0 con số?
>> 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à điều này thêm kỳ lạ -
>> ĐỐI TƯỢNG: 13.100.
>> DAN: 13.100.
Cảm ơn bạn, Rob.
Và kì quái này thêm -
9,9 này -
chỉ đơn giản là bởi 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 sẽ 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ó không nhân này trước khi nó
không đúc này.
>> ĐỐI TƯỢ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?
Thiếu chính xác.
>> Nổi không 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 phao này, chúng tôi có được một loại
xấu xí 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 báo cáo có đ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 gì 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 chuyển đổi của tên biến.
Sau đó, bạn thiết lập các trường hợp có thể giá trị nó có thể được.
Vì vậy, là trường hợp một, nói đó 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 trường hợp tiếp theo -
vì vậy trường hợp hai và ba trường hợp -
nếu đó là trường hợp hai nó chỉ giảm xuống các dòng mã đầu tiên nó thấy như với
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à vì tôi
có nghỉ này ở đây.
Nếu tôi, nói rằng, bỏ qua điều này phá vỡ - nếu tôi đã ném ly khai này -
nó sẽ in thấp, và sau đó nó sẽ in giữa, và sau đó nó sẽ phá vỡ.
>> Vì vậy, nghỉ là một phần quan trọng của điều kiện và chuyển đổi
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
là trường hợp trong chuyển đổi và nên được đúc.
>> ĐỐI TƯỢNG: Vì vậy, 1, 2, 3, và 4 sẽ là n?
>> DAN: Các giá trị đó n có thể được.
Vâng.
Yeah?
>> ĐỐI 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ỡ.
>> ĐỐI TƯỢNG: Tại sao nó sẽ in trung nếu [nghe được]?
>> DAN: Vì vậy, tất cả mọi thứ dưới 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à này in sau.
Yeah?
>> ĐỐI TƯỢ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ể, phải không?
Điều đó có ý nghĩa?
Yeah.
>> ĐỐI TƯỢNG: [nghe được]?
>> DAN: Vâng, trường hợp hai sẽ in giữa và sau đó phá vỡ.
>> ĐỐI TƯỢ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 sang?
>> ĐỐI TƯỢNG: Bạn có thể chuyển đổi hơn bất kỳ loại dữ liệu.
Nhưng 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 đổi sang một con trỏ mà không thực sự có ý nghĩa,
chuyển đổi sang tải, nếu nó thậm chí chúng ta hãy bạn làm điều đó, bởi vì điểm nổi
độ 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 có 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 cho 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ừ các trình biên dịch.
Yeah?
>> ĐỐI 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ó.
Dây.
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, vốn U, vốn L, vốn 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 biệt.
Nhớ 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.
Yeah?
>> ĐỐI TƯỢNG: Vì vậy, NULL là, nói, con trỏ?
>> DAN: Có.
>> ĐỐI TƯỢNG: Nhữ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à nghĩa vụ phải trả một con trỏ, bạn
cần phải kiểm tra đối với NULL vì NULL là một khá tốt -
đó 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, 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 trở lại rác.
Vì vậy, nếu một cái gì đó đã không đi bên phải, chỉ trở về NULL thay thế.
>> ĐỐI TƯỢNG: [nghe được]?
>> DAN: Vâng, và đó là điều này.
>> ĐỐI TƯỢNG: [nghe được]?
>> DAN: chính tả nó như thế này.
Đó là terminator NULL.
Nó thành chữ thường N-U-L-L nếu bạn đang đánh vần nó.
>> ĐỐI 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, tuyên bố yêu cầu biểu kiểu số 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?
>> ĐỐI TƯỢNG: [nghe được]?
>> DAN: Vì vậy, vốn tồn tại, vốn U, vốn L, vốn L là một điều thực tế c.
Nó là con trỏ NULL và sẽ chỉ được đối xử như vậy.
Bạn sẽ không bao giờ cố gắng 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.
Yeah?
>> ĐỐI TƯỢNG: Vì vậy, trở về char tối đa hoặc một cái gì đó trong các ghi chú, phải không
thể hiện chức năng tương tự như [không nghe được]?
>> ĐỐI TƯỢNG: Vì vậy, bạn có đề cập đến trở về char max từ getchar, hoặc
bất cứ điều gì?
>> ĐỐI TƯỢNG: Vâng.
>> ĐỐI TƯỢNG: Vâng, vì vậy tổng quát 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 max từ getchar, đó là
phải được như thế, tất cả các bên phải, 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.
>> Cho 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 ý trên.
Và đây là điều bạn quay trở lại khi mọi thứ đi sai.
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.
>> ĐỐI 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 phải kiểm tra tối đa char vì giá trị trả về từ hàm là
một nhân vật không phải là một con trỏ.
Yeah?
>> ĐỐI TƯỢNG: Câu hỏi này yêu cầu cho chiều dài chuỗi.
Không bao gồm các nhân vật NULL?
>> DAN: số
Và đó là thực sự như thế nào chiều dài chuỗi biết dừng lại bởi vì nó đi qua
mảng của bạn của nhân vật cho đến khi nó thấy một nhân vật NULL.
Và sau đó nó giống như, tất cả Được rồi, tôi đang thực hiện.
>> ĐỐI TƯỢNG: [nghe được] năm?
>> DAN: Xin chào sẽ là năm.
Vâ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 kể kích thước là 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.
Yeah?
>> ĐỐI TƯỢNG: [nghe được]?
>> DAN: Vâng.
>> ĐỐI TƯỢNG: [nghe được]?
>> DAN: Nếu bạn có 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 cứ điều gì tên của bạn
mảng là, khung trống bằng xoăn cú đúp H dấu phẩy E dấu phẩy L dấu phẩy L dấu phẩy
Nhân vật O dấu phẩy NULL và cú đúp xoăn.
Điều đó cũng sẽ làm việc như một tuyên bố.
>> ĐỐI TƯỢNG: [nghe được]?
>> DAN: Sau đó, bạn cần phải có kích thước đã được thực hiện.
>> ĐỐI TƯỢ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 đầu vào từ người sử dụng như
lập luận để chính.
Chính nhận hai đối số.
Số lượng các đối số đó đang đượ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, được gọi là một chức năng như một dot 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ể.
Yeah?
>> ĐỐI TƯỢ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.
Nó là argc cộng thêm 1.
Vì vậy, trong trường hợp đó tôi vừa 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.
Vâng.
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.
Yeah?
>> ĐỐI 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à 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: ở đâu nó được lưu trữ?
Tôi không biết nơi nó được lưu trữ.
>> ĐỐI 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 nó là của đối số
được lưu trữ trong ngăn xếp?
Vì vậy, argc và argv là đối số cho chính và họ đang ở trên đống, hoặc thực sự
chỉ trên những gì bạn nghĩ như sự bắt đầu của stack.
Là những gì các phần khác của câu hỏi?
>> ĐỐ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 này nó handier cho các kịch bản bởi vì bạn
chỉ có thể truyền tham số cho chính 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.
>> ĐỐI 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?
>> ĐỐI TƯỢNG: [nghe được]?
>> DAN: Vâng, argv 0 luôn luôn bao gồm các dot dấu gạch chéo của các cuộc gọi chức năng.
Yeah?
>> ĐỐI TƯỢNG: [nghe được]?
>> DAN: Vâng, mỗi đối số kết thúc vào nhân vật NULL bởi vì họ
là chuỗi.
>> ĐỐI TƯỢNG: [nghe được]?
>> DAN: Vâng, argv argc là một con trỏ NULL.
>> ĐỐI TƯỢNG: [nghe được]?
>> DAN: Oh yeah.
Vâng, xin lỗi.
>> ĐỐ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ố lượng dòng lệnh đối số có hai hoặc nó sẽ là ba?
>> ĐỐI 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ừ lời nói chức năng từ các dòng lệnh
đối số mặc dù nó bao gồm trong argv.
>> DAN: Nhưng nếu nó đã được trên các bài kiểm tra -
yeah - và còn nếu bạn nói điều gì đó như argc bằng 3,
bạn đang ở vị thế an toàn.
Yeah?
>> ĐỐI TƯỢ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ẽ chỉ -
thay vì sử dụng argc - bạn muốn sử dụng a và b.
Yeah?
>> ĐỐI TƯỢNG: [nghe được]?
>> DAN: Vì 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
tin tưởng rằng bạn cần.
Và một trong những phương tiện bạn làm điều đó là thông qua mật mã.
Mật mã là, về cơ bản, chúng ta có những 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 sử dụng -
thông qua quá trình của lớp này -
những thứ như thuật toán mã hóa và Caesar [Nghe được], cả hai đều rất, rất
cách không an toàn của mã hóa mọi thứ.
Họ 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 tôi sẽ không nhận được vào nhiều hơn thế.
>> Gỡ lỗi.
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 đề.
Lệnh hữu ích trong GDB là phá vỡ, mà bạn vượt qua một trong hai dòng
số, 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 mà là ở đó
chỉ trong thực hiện của bạn.
Tiếp theo di chuyển thực hiệ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 thứ khác đang chạy, đó là cách bạn thực sự chạy mã của bạn.
Tiếp tục có 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.
Tìm chúng.
Họ đang rất lớn.
Yeah?
>> ĐỐI TƯỢNG: [nghe được]?
>> DAN: Vâng, đó là một chương trình gỡ rối.
Vì vậy, một trình gỡ lỗ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à điểm đó 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 mất ít thời gian liên tục tốt nhất, mà là 0 trong tổng số 1 và tuyến tính tồi tệ nhất
thời gian, mà là 0 của n.
>> Tìm kiếm nhị phân, mà cần yếu tố bẩn thỉu.
Bạn đi đến 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 của không gian tìm kiếm của bạn là 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ỏ hơn, bạn nhìn nói rằng - yeah, chuyện gì thế?
>> ĐỐI TƯỢNG: [nghe được]?
>> DAN: Có.
Bất kỳ loại loại đó là được giảng dạy trong lớp là trò chơi công bằng cho kỳ thi.
>> [Cười]
>> DAN: Và thực tế là bạn không có để làm điều đó cho một vấn đề thiết lập, đó là công bằng
trò chơi cho các thử nghiệm.
>> ĐỐI TƯỢNG: Chúng ta có thể đi qua nó như thế nào để -
>> DAN: Nó sẽ được đi qua.
>> SPEAKER 2: mã thực tế cho [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 sắp xếp hợp nhất.
Vì vậy, bạn không cần phải thực hiện nó cho mình đêm nay.
Nhưng chắc chắn rằng bạn hiểu nó hơn hơn là chỉ học thuộc lòng nó.
>> ĐỐI TƯỢNG: [nghe được]?
>> SPEAKER 2: Trang sắp xếp hợp nhất trên 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 được nó thay vì chỉ ghi nhớ nó
hoặc sao chép nó xuống.
>> ĐỐI 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ì trong danh sách này như sau một bước lựa chọn loại 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: Hey 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 ta đã học được, và một
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à những gì để nói rằng một chức năng là đệ quy?
>> ĐỐI 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ể có - như Dan đã được nói về tìm kiếm nhị phân.
Một cách mà tìm kiếm nhị phân là đệ quy là một thực tế rằng bạn đang
cố gắng tìm 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 con số này sẽ được ở bên trái, đó là cùng
điều như 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ừ đi 2 cộng với 1, đó là cùng
điều như tổng hợp số đế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 ngừ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 bằng 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 trừ đi một.
Có ý nghĩa?
OK.
>> Vì vậy, đây là những gì nó trông giống như.
Bạn có tổng số 2 bình đẳng 2 cộng với số tiền của 1.
Và một số 1 là 1 cộng với tổng bằng 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 được gọi là tổng 2.
Và sau đó tổng 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 của 1 là sẽ gọi cho tổng của 0, mà cũng sẽ được thêm vào
để ngăn xếp.
Và sau đó mỗi người có trên đầu trang của một phải quay trở lại
trước khi những người khác có thể tiếp tục đi.
>> Ví dụ, ở đây, tổng bằng 0, đầu tiên, sẽ trở về 0.
Và sau đó chọn số tiền của 1.
Sau đó tổng của 1 sẽ trở về 1 để tổng của 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ếu nó làm cho tinh thần.
OK, vì vậy phân loại.
Vậy tại sao là phân loại quan trọng, đầu tiên của tất cả?
Tại sao chúng ta phải quan tâm?
Bất cứ ai?
Cho tôi một ví dụ?
Yeah?
>> ĐỐI TƯỢNG: [nghe được].
>> Lucas: Yeah, 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 tôi 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ừ trong 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.
Nghĩ như thế nào nó sẽ khó để có một từ điển trong đó các từ trong
thứ tự ngẫu nhiên.
Bạn sẽ phải xem xét, 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 với họ.
>> Vì vậy, tổ chức dữ liệu.
Cũng Pokemon.
Vì vậy, bạn thấy rằng tất cả Pokemon có số lượng.
Và đó là một cách dễ dàng như cách truy cập dữ liệu.
>> ĐỐI TƯỢNG: Truy cập Pokemon.
>> Lucas: Vâng.
>> ĐỐI TƯỢNG: [nghe được].
>> Lucas: Đúng.
OK, vì vậy lựa chọn loại.
Loại lựa chọn sẽ chọn giá trị phân loại 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ị được phân loại.
Đặt ở cuối được 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 được phân loại.
>> Vì vậy, cho sắp xếp danh sách, nó ban đầu trống rỗng.
Và sau đó tôi sẽ chọn số nhỏ nhất ở đây, đó là 2.
Vì vậy, tôi có được số 2 và tôi đặt ở mặt 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à sau đó là tác phẩm mới nhất, 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 được 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 được 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 này có ý nghĩa hơn.
Vì vậy, ban đầu, ví dụ, tôi đang cố gắng chèn số ba trong
sắp xếp một phần của 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 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ả hai 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, thay đổi 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ố lượng 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 nó nên từ 3 đến 5.
Và sau đó tôi đặt nó ở đó và thay đổi tất cả các yếu tố khác.
Có ý nghĩa?
>> Sắp xếp *** bóng.
Vì vậy, *** bóng sắp xếp về cơ bản là những gì bạn đang sẽ làm gì - chúng tôi gọi nó là *** bóng
loại vì bạn đi qua danh sách - nó thực sự tốt hơn nếu tôi chỉ hiển thị
bạn như thế này -
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 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ữ trao đổi nó và di chuyển nó sang bên phải.
>> OK, vì vậy đây là phiên thứ hai.
Nó sẽ được đ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 Bubble theo, chúng tôi về cơ bản giữ đi 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?
>> Chúng ta 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?
Yeah?
OK, Big O là gì, trước hết?
>> ĐỐI TƯỢ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.
Như, về -
trong trường hợp này - n.
Số phần tử trong liệt kê trong trường hợp xấu nhất.
Như, trong trường hợp xấu nhất có thể.
>> Vì vậy, cho *** 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 loại Bubble Big O n vuông?
>> ĐỐI TƯỢNG: [nghe được].
>> Lucas: Vâng, vì vậy trường hợp xấu nhất sẽ là mà 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 lại 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à cho mỗi của những lần, tôi phải làm n giao dịch hoán đổi bởi vì tôi phải 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ó là n lần n.
>> Sau đó, lựa chọn loại cũng n vuông là bởi vì, cho mỗi lần lặp, tôi phải
nhìn vào mỗi 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ẽ
được, 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 con số, nếu tôi đã có xem xét 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ẽ được n lần n lần nữa.
Có ý nghĩa?
Những gì về omega?
>> ĐỐI TƯỢ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ì.
Sắp xếp *** bóng có tốt nhất trường hợp kịch bản của n.
Các anh biết tại sao?
>> ĐỐI TƯỢ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ư các thiết lập để đúng 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 yếu tố lân cận.
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 của lựa chọn sắp xếp, tôi
phải lựa chọn các yếu tố tối thiểu.
Vì vậy, đó có nghĩa là tôi có ra ngoài để tìm ở tất cả các yếu tố trong phân loại
danh sách và tìm thấy những 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ố và tất cả các con số, khi tôi cố gắng để chèn họ, 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ì?
>> ĐỐI TƯỢNG: [nghe được].
>> Lucas: gì, xin lỗi?
Nói lại lần nữa.
>> ĐỐI TƯỢNG: [nghe được].
>> Lucas: Chính xác.
Vì vậy, bạn có thể thấy rằng chỉ có lựa chọn 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 log n.
>> Và sau đó, như Dan đã nói, Merge 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ì?
>> ĐỐI TƯỢ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 có nghĩa là sẽ để 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.
Hãy nhớ rằng, con trỏ đến bất cứ điều gì là dài 32-bit của chúng tôi luôn luôn bốn byte
máy như vậy là trường hợp của thiết bị.
Và nó chỉ có vị trí của một bên trong biến của nó.
>> OK, do đó, bộ nhớ này, về cơ bản.
Vì vậy, mỗi khối của 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ỏ đến
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 thực sự muốn bạn trao đổi cho số thực, tôi thực sự
phải gửi một con trỏ.
Không biến.
Các anh nhớ không?
Sự khác biệt giữa -
tên là gì?
Gọi theo giá trị và kêu 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 chức nă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ó cảm nhận 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ỏ tới
rằng bất cứ biến gõ mà bạn đã có.
>> Vì vậy, ở đây trong ngôi sao, ví dụ, đó là một con trỏ và một số nguyên.
Và sau đó sao char là một con trỏ sao char và vv.
Yeah?
>> ĐỐI TƯỢNG: Nếu chúng ta có một con trỏ đến n để sao x.
Tôi biết rằng tạo ra một con trỏ đến x.
Nó cũng tuyên bố x một số nguyên?
>> Lucas: OK, vì vậy khi bạn nói n sao x, 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ỏ có tên là x.
>> ĐỐI TƯỢNG: [nghe được].
>> Lucas: Vì vậy, khi tôi nói n sao x, tôi nói, hey, trong bộ nhớ, tôi sẽ
có được một trong ba hộp.
Và tôi sẽ nói rằng đó sẽ là x,
sẽ là một con trỏ.
Và một cái gì đó 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 tính 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ớ.
Việc đầu tiên là ký hiệu.
Thứ hai là ngôi sao.
Không bị lẫn lộn bởi ngôi sao và điều này ngôi sao vì nhớ rằng, trong
trường hợp này, bạn có n sao.
>> Nó giống như một điều hoàn toàn với nhau.
Không có sao không gian n.
Vì vậy, nó có nghĩa là nó là loại.
Hãy nhớ rằng, khi bạn có ngôi ***ến, bạn
nói về các loại.
>> Khi bạn vừa 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 tìm kiếm các
con trỏ, 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à nhìn vào các nội dung liên tục.
Và các ký hiệu tương tự điều như địa chỉ của.
>> Vì vậy, nếu tôi có một biến một - 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ụ.
Này là mất tích int b, int c.
Vì vậy, int a 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ự.
Đi vào 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, những gì được dòng này làm ra? n sao pa bằng ký hiệu a.
Vì vậy, trước hết, n sao pa.
Là nó làm gì?
>> ĐỐI TƯỢ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 rằng con trỏ là địa chỉ của một.
Vì vậy, ký hiệu a.
Sau đó, nếu tôi làm sao pb, một pb ngôi sao là gì?
>> Oh, 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.
Yeah?
>> ĐỐI TƯỢNG: [nghe được]?
>> Lucas: Có.
Vì vậy, nếu bạn đi vào bộ nhớ và bạn đi đến hộp đó là vấn thiết kế cho pa,
bạn đang thực sự đi vào thấy một địa chỉ của một.
OK?
Yeah?
>> ĐỐI TƯỢ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ó của 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 địa điểm 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 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 mảng 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 ngôi sao cộng với 1, đó là điều tương tự như làm mảng
khung một, mà chỉ có nghĩa là tôi đi đến nơi mà nó chỉ vào.
Và sau đó cộng thêm 1 làm cho tôi thay đổi 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.
Yeah?
>> ĐỐI 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, mảng 1 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
đếm 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ớ.
Yeah?
>> ĐỐI TƯỢ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 bạn con số 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ổ tại
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 phải biết những gì 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 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 đó 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ỉ biết rằng trên thời gian chạy.
Vì vậy, đó là lý do tại sao bạn có đống.
Vì vậy, các đống là 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ớ, stack có biến được tạo ra trên 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ụ.
>> ĐỐI TƯỢNG: [nghe được]?
>> Lucas: Vì vậy, GetString là 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ỏ tới nơi mà bộ nhớ được phân chia.
>> Vì vậy, khi bạn làm -
ở đây ví dụ -
n con trỏ sao.
Và sau đó con trỏ bằng malloc kích thước của inch lần 10.
Tôi là tạo ra một con trỏ.
Và sau đó tôi giao con trỏ đó để giá trị của con trỏ đó malloc
là đ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 malloc, do đó 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 một vô lý số lượng bộ nhớ.
Máy tính của bạn không là 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, bạn có thể được dereferencing một con trỏ và
gây ra lỗi bên.
Và cuối cùng, đừng quên bộ nhớ miễn phí 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 kết thúc chương trình.
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?
Yeah?
>> ĐỐI TƯỢNG: Tôi không thấy một trực tuyến này.
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.
>> ĐỐI TƯỢNG: Đó là lên.
>> Lucas: Nó thế?
OK.
Yeah?
>> ĐỐI TƯỢNG: [nghe được]?
>> Lucas: Vâng, bạn nên giải phóng tất cả các bộ nhớ được đặt trong heap.
>> ĐỐI TƯỢ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í 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 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 thông qua thành của 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 dưới cùng của ngăn xếp của chúng tôi.
Nhớ rằng ngăn xếp 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,
chúng tôi có argc và RGV chiếm không gian bên trong của chính stack frame.
Vì vậy, bây giờ chính là sẽ gọi hàm foo.
Và điều đó có nghĩa là sẽ foo có stack frame riêng của mình.
>> Vì vậy, bây giờ chúng ta đ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 bởi 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à vì thanh bây giờ đang quay trở lại, mà có nghĩa là chúng ta đang popping stack frame
cho thanh tắt của chồng.
Vì vậy, tất cả các bộ nhớ thanh đã được 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 ta gọi printf, nó sẽ là một khung stack cho printf
chức năng cuộc gọi.
>> Chúng ta đang đi qua printf?
Đó là những gì sẽ đ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 tôi dấu gạch chéo ngược và n
đối số 24.
Nó có thể có nhiều trong nó ngăn xếp khung 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.
Yeah?
>> ĐỐI TƯỢNG: Bạn có nhìn thấy [không nghe được]
đối số [không nghe được]
các thông số?
>> ROB: Vì 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.
Nhưng các thông số là chính thức tên các sự vật.
>> Vì vậy, argc và argv là các thông số để 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, có khi tôi gọi foo 4, 4 là tham số tôi đang đi qua in
Và tham số n, bên trong foo, mang giá trị 4
từ 4 là lập luận.
>> ĐỐI TƯỢ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.
Yeah?
>> ĐỐI TƯỢNG: [nghe được]?
>> ROB: foo chỉ là kêu gọi thanh và trở về bất cứ điều gì trở lại quán bar.
>> ĐỐI TƯỢNG: [nghe được]?
>> ROB: Vâng, chỉ để xem nhiều ngăn xếp khung.
Yeah?
>> ĐỐI TƯỢNG: Tại sao gọi là foo trước khi printf?
>> ROB: Tại sao gọi là foo trước khi printf?
Vì vậy, tôi có thể, thay vào đó, làm điều gì đó như int x = 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 nhận thấy 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 cho đến khi chúng tôi
tìm ra những gì foo 4 là.
Vì vậy, chúng ta sẽ đánh giá này.
Và chỉ một lần đó là thực hiện sẽ trở lại và đánh giá này.
Yeah?
>> ĐỐI TƯỢNG: Kể từ khi 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 nên int.
Mà không được bắt hơn đi nhiều.
Vì vậy, nó phải là int thanh và int foo vì cả hai của những
đang quay trở lại các số nguyên.
Void là chỉ khi họ sẽ không để trở về giá trị thực tế.
Yeah?
>> ĐỐI TƯỢNG: Nếu bạn đã có một dòng trên sự trở lại, [nghe được]?
>> ROB: Một dòng trên sự trở lại?
>> ĐỐI TƯỢNG: Vâng.
Cũng giống như nếu bạn đã printf và [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?
>> ĐỐI 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 kêu gọi foo một lần ngay ở đây, sau đó chúng tôi sẽ nhấn printf.
Sau đó chúng tôi 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.
Yeah?
>> ĐỐI TƯỢ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ỉ thứ tự 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 hoàn toàn đánh giá.
Như vậy là hoàn toàn đánh giá này?
Có, 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.
Yeah?
>> ĐỐI 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ó trả lại dấu chấm phẩy?
>> 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, bây giờ 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à lấy ra khỏi tất cả các khung stack và tất cả những thứ.
Bạn không phải lo lắng về nó.
Nó tự động.
Vì vậy, các đống là thủ công.
Và [nghe được]
đến 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 tôi 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à điều này 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?
Đó là 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ó sẽ bắt 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 giải quyết đó 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.
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.
Nó rất có thể không phải số không.
>> Lợi nhuận vì vậy bây giờ malloc.
Và chúng ta làm gì khi trở về malloc?
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 nhữ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ớ mà 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.
Nó không phải là null.
Chúng tôi giả vờ rằng malloc đó đã thành công.
>> Vì vậy bây giờ sao x = 50.
Vì vậy, nó có nghĩa là ngôi sao nhớ đi đến địa chỉ đó.
Vì vậy, 0x123 Chúng tôi sẽ đi đến địa chỉ đó.
Để đư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, ngôi sao x là gì?
Một lần nữa, ngôi sao x phương tiện đ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à đó 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 đã.
Vì vậy, phần trăm p, 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, người đầu tiên in e sẽ in 50.
In thứ hai f sẽ in 0x123 Yeah?
>> ĐỐI 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.
Yeah?
>> ĐỐI TƯỢNG: [nghe được]?
>> ROB: Vâng.
Ít nhất là cho cuộc gọi này - vì vậy tôi không bao gồm nó ở đây.
Nhưng hai đối số đó là thiết bên trong khung stack
cùng với bất kỳ biến địa phương printf xảy ra để được sử dụng.
Và sau đó là cuộc gọi tiếp theo printf bây giờ bên trong printf stack frame là
phần trăm p dấu gạch chéo ngược n và bất cứ điều gì giá trị của x là, đó là 0x123.
Yeah?
>> ĐỐI TƯỢNG: [nghe được]?
>> ROB: Nó sẽ in một cái gì đó trông như thế này.
>> ĐỐI TƯỢNG: [nghe được].
>> ROB: Vì vậy, nó in nó ở dạng địa chỉ.
Nó trông giống như một địa chỉ.
Yeah?
>> ĐỐI TƯỢNG: [nghe được]?
>> ROB: Tại sao là gì?
>> ĐỐI TƯỢNG: [nghe được]?
>> ROB: Tại sao con trỏ này 4 byte?
Vì vậy, có một bó toàn bộ 0 của trước đây.
Vì vậy, nó thực sự 0x0000000123.
Trên một hệ thống 64-bit, sẽ có một bó toàn bộ hơn số không.
Yeah?
>> ĐỐI TƯỢNG: [nghe được].
>> ROB: Vì vậy, các printf đầu tiên sẽ in -
>> ĐỐI TƯỢ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, nó trỏ đến là gì?
50.
Lấy nó.
Đó là những gì chúng ta sẽ in.
Trong khi đó, kế tiếp, 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 phóng.
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 mà từ đống.
Bây giờ đống của chúng tôi có sản phẩm nào 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ờ là bộ nhớ không hợp lệ.
Chúng ta nên không còn tới đích x.
Yeah?
>> ĐỐI TƯỢNG: là trở về 0 dư thừa?
>> ROB: là returen 0 dư thừa?
Vâng.
Chúng tôi chỉ cần đặt rằng có vì chúng tôi có một 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.
Yeah?
>> ĐỐI TƯỢNG: [nghe được]?
>> ROB: Vì vậy, sau khi miễn phí x, những gì sẽ xảy ra nếu chúng tôi cố gắng để tới đích của con trỏ?
Nó có thể là không có gì sai trái.
Có thể là chúng tôi vẫn sẽ nhận được 50.
>> Nó có thể, cũng có, mà bộ nhớ đó là 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.
Yeah?
>> ĐỐI TƯỢNG: [nghe được]?
>> ROB: Không có, vì vậy nếu bạn chỉ định x đến cái gì khác.
Vì vậy, nếu ở đây chúng ta nói x = malloc cái gì khác -
kích thước malloc sự kiện -
sau đó khối ban đầu bộ nhớ không được giải phóng.
Và chúng tôi đã chính thức bị 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 của 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 đang đ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, nơi mà 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à
hơ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à sẽ có được một khung stack.
>> Sau đó foo sẽ gọi foo một lần nữa, đó là sẽ nhận đượ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
thành đống.
Vì vậy, đây là cách chúng tôi nhận một lỗi tràn stack.
Và vào thời điểm này, bạn seg lỗi.
Hay bạn muốn thực sự seg lỗi trước thời điểm này nhưng yeah.
>> ĐỐI TƯỢNG: là 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 sẽ có đượ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 sự cố.
Yeah?
>> ĐỐI TƯỢNG: [nghe được]?
>> ROB: Vì vậy, một lỗi phân khúc có nghĩa là 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 tôi bắt đầu cảm động
bộ nhớ trong một cách mà chúng ta không nên.
Yeah?
>> ĐỐI TƯỢNG: [nghe được]?
>> ROB: Vì vậy, bên trong một vòng lặp vô hạn.
Như, điều này giống như một đệ quy vô hạn vòng 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ỉ trong một thường xuyên vô hạn trong khi một -
tốt, chúng ta hãy 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 tôi chỉ sẽ tiếp tục lặp hơn chỉ dẫn duy nhất này.
Ngăn xếp không phát triển.
Đó là một thực tế là mỗi đệ quy cuộc gọi được cho chúng tôi một khung stack.
Đó là lý do tại sao chúng tôi có được một chồng tràn.
Yeah?
>> ĐỐI 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ẽ
không seg lỗi.
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 lặp lại.
Bạn sẽ nhận được một chồng đơn khung cho printf.
Nó sẽ trở lại.
Đơn stack frame.
Vì vậy, bạn không nhận được vô hạn chồng chất khung stack.
>> ĐỐI TƯỢNG: [nghe được]?
>> ROB: Có.
Vì vậy, đây sẽ xảy ra tràn stack bởi vì không có những
các cuộc gọi đến foo đang quay trở lại.
Vì vậy, nếu chúng tôi trở lại, sau đó chúng tôi sẽ bắt đầu mất đi 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 một trường hợp cơ sở cho các chức năng cá nhân của bạn.
Yeah?
>> ĐỐI TƯỢNG: Là kích thước tiềm năng và ngăn xếp cho đố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 ngăn xếp 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à điều này, bạn có thể
lấy đi từ một số không gian cho đống của bạn.
>> Trên một 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ì đó chỉ là hơn địa chỉ mà họ có thể sử dụng.
Nhưng trên một hệ thống cá nhân, nó sẽ là khoảng cùng một lượng ngăn xếp
và không gian đống.
Được rồi.
>> 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, một trong những đầu tiên nên dễ nhớ.
Tiền xử lý.
Nó có sẵn tiền tố 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.
Đó 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 tiền xử lý làm gì?
Đó là một điều thực sự ngu ngốc.
Tất cả nó có khả năng là tất cả các hoạt động sao chép và cắt, và dán.
>> Vì vậy, băm bao gồm tiêu chuẩn i0 dot h.
Là những gì mà làm?
Nó lấy tiêu chuẩn i0 dot h nộp 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 dot h.
>> Và bất kỳ băm rằng chúng tôi đã xác định nhìn thấy, những gì là làm gì?
Nó sao chép các giá trị hash 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 hoạt động dựa.
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ì vậy, những gì biên dịch nghĩa là gì?
Chúng ta đang đi từ mã c để mã lắp ráp.
Yeah?
>> ĐỐI TƯỢNG: [nghe được]?
>> ROB: Vâng, chúng tôi bắt đó.
Vì vậy, biên dịch.
Chúng ta sẽ từ c để lắp ráp.
Vì vậy, đây là một sự thay đổi ngôn ngữ thực tế.
Biên soạn 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à những gì?
Hướng dẫn của nó mà, khá nhiều, làm cho CPU của bạn.
Nhưng 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.
>> Do đó, C để lắp ráp để nhị phân.
Nhưng tôi không có một 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 thư viện CS50 này, trong đó có GetString
và getInt và tất cả những gì.
>> Nhưng thư viện CS50 -
trong và của chính nó - không phải là thực thi.
Nó không có 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
thành một thực thi thực tế.
Một mà bạn có thể gõ dot cắt giảm một dấu chấm ra.
>> Vì vậy, điều này giống như các tập tin mà bạn viết, - bất cứ điều gì chương trình của bạn -
Ceaser dot 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 một thực thi.
Yeah?
>> ĐỐI TƯỢNG: [nghe được]?
>> ROB: Vì vậy, đầu tiên bao gồm, hãy 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 nhập
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 nhập
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 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ư thế, sẽ được liên kết tự động.
Bất kỳ câu hỏi khác về bất cứ điều gì?
>> ĐỐI TƯỢ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à cho bạn nhị phân cho 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 mà 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 là
chưa hoàn toàn xác định.
>> Nó 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ả
Được rồi, tôi có thể thực sự 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.
Yeah?
>> ĐỐI TƯỢNG: Có liên kết 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 [nghe được]?
>> ROB: Vì vậy, một thực thi vẫn còn trong nhị phân.
Nó chỉ kết hợp toàn bộ loạt các tập tin nhị phân.
>> ĐỐI 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.
Được rồi.
Cảm ơn.
>> [Vỗ tay]
>> ĐỐI TƯỢNG: Cảm ơn bạn.
>> ROB: Vâng.