>> [MUSIC CHƠI]
DAVID J. Malan: Được rồi.
Đây là CS50, và điều này là kết thúc của Tuần Bốn.
Và một trong những chủ đề hôm nay là pháp y kỹ thuật số,
nghệ thuật phục hồi thông tin.
Và thực sự, mặc dù bạn đang ở giữa
ngay bây giờ hòa bình tại Ba và Breakout, vào tuần tới,
sẽ tập trung vào chính xác lĩnh vực này.
>> Vì vậy, một trong những công việc thú vị nhất mà tôi từng đã có được trở lại trường học sau đại học,
khi tôi đang làm việc cho các địa phương Middlesex Biện Lý Quận
văn phòng, làm pháp y làm việc.
Vì vậy, về cơ bản, Massachusetts Cảnh sát Nhà nước, nhân dịp,
khi làm việc trên trường hợp sẽ mang lại những thứ như ổ đĩa cứng
và đĩa mềm và thẻ nhớ và các loại tương tự.
Và họ sẽ giao cho tôi và người thầy của tôi,
và mục tiêu của chúng tôi là tìm ra bằng chứng, nếu có bất kỳ, trên các phương tiện truyền thông.
Bây giờ cái nhìn thoáng qua, bạn có thể đã thấy trên thế giới này pháp y
trong phương tiện truyền thông, truyền hình và phim ảnh.
Nhưng công việc tôi đã có, và dám khẳng định rằng thế giới đó,
không phải là khá như bạn sẽ nhìn thấy nó.
Chúng ta hãy nhìn vào những gì bạn đã có thể nhìn thấy.
[VIDEO xem lại]
-Ok.
Bây giờ, chúng ta có được một cái nhìn tốt ở bạn.
>> [MUSIC CHƠI]
>> -Hold Nó.
Chạy trở lại đó.
>> -Chờ Một phút.
Đi sang phải.
-Có.
Đóng băng đó.
-Toàn Màn hình.
>> -Ok.
Đóng băng đó.
-Tighten Lên trên đó, được không?
>> -Vector Chân vào chàng trai của bánh xe lại.
>> -Zoom Trong ngay tại chỗ này.
>> -Với Quyền thiết bị, các hình ảnh có thể được mở rộng và sắc nét.
>> Cái gì vậy?
>> -Nó Là một chương trình nâng cao.
>> -Cần Bạn rõ ràng là bất kỳ?
>> Tôi không biết.
Chúng ta hãy nâng cao nó.
>> -Enhance Mục A6.
Tôi tăng cường các chi tiết, và-
-I Nghĩ rằng có đủ để tăng cường.
Phát hành nó để màn hình của tôi.
>> -I Tăng cường sự phản chiếu trong mắt cô ấy.
-Let Đang chạy qua tăng cường video.
>> -Edgar, Bạn có thể nâng cao này?
>> -Hang Trên.
>> -Tôi Được làm việc trên phản ánh này.
>> Phản ánh -Có của một ai đó.
>> -Reflection.
-Có Là một sự phản ánh của khuôn mặt của người đàn ông.
>> Phản ánh -Các!
-Có Là một sự phản ánh.
-Zoom Ở trên gương.
Bạn có thể thấy một sự phản ánh.
>> Bạn -Có nâng cao hình ảnh từ đây?
Bạn -Có nâng cao nó?
Chúng tôi -Có tăng cường này?
Bạn -Có nâng cao nó?
-Hold Trên một giây.
Tôi sẽ tăng cường.
-Zoom Ở trên cửa.
-Times 10.
-Zoom.
-Move Trong.
, Gấp.
-Chờ, Dừng lại.
-Stop.
-Pause Nó.
-Rotate Chúng tôi 75 độ xung quanh theo chiều dọc, xin vui lòng.
>> -Stop.
Quay trở lại phần về cánh cửa một lần nữa.
>> -Got Một tăng cường hình ảnh có thể bitmap?
>> -Có Chúng ta có thể sử dụng Pradeep Singh phương pháp để xem vào cửa sổ.
>> -Các Phần mềm là nhà nước của nghệ thuật.
>> -Các Eigenvalue tắt.
>> -Với Quyền sự kết hợp của algorithms--
>> Cậu ấy lấy ánh sáng của các thuật toán để cấp độ tiếp theo,
và tôi có thể sử dụng chúng để tăng cường bức ảnh này.
>> -Lock Về và mở rộng các trục z.
>> -Enhance.
Tăng cường.
-Enhance.
-Freeze Và nâng cao.
[END IMG xem lại]
DAVID J. Malan: Vì vậy, những người đang có tất cả các từ, nhưng họ không
được sử dụng trong câu một cách chính xác.
Và thực sự trong tương lai, bất cứ lúc nào, xin vui lòng, bạn nghe ai đó nói một lời,
"Tăng cường", tiếng cười khúc khích một chút.
Bởi vì khi bạn cố gắng để nâng cao, Ví dụ, đây là những gì sẽ xảy ra.
>> Vì vậy, đây là một bức ảnh tuyệt đẹp.
Đây là Daven riêng của CS50.
Và giả sử rằng chúng ta muốn tập trung vào các nháy mắt,
hoặc phản ánh của kẻ xấu đó là rõ ràng
chụp bởi camera an ninh.
Đây là những gì sẽ xảy ra khi bạn phóng to một hình ảnh
chỉ có một số hữu hạn bit liên kết với nó.
>> Đó là những gì bạn sẽ nhận được.
Và quả thực, trong mắt của Daven là nhưng bốn, có lẽ sáu pixel
mà soạn chính xác những gì đã le lói ở đó.
Vì vậy, vấn đề Set Bốn cuối cùng sẽ có bạn khám phá thế giới này, đặc biệt
bởi bản chất của một cái gì đó chúng ta gọi là tập tin I / O, nơi
I / O chỉ là một cách ưa thích của nói đầu vào và đầu ra.
>> Vì vậy, cho đến nay, tất cả các tương tác chúng tôi đã có với một máy tính
đã được phần lớn với bạn bàn phím và màn hình,
nhưng không quá nhiều với các ổ đĩa cứng, hoặc lưu các tập tin vượt ra ngoài những người bạn
mình viết.
Chương trình của bạn vậy, đến nay có không được tạo ra, và tiết kiệm,
và cập nhật các tập tin riêng của họ.
>> Vâng, một tập tin là gì?
Vâng, một cái gì đó giống như một JPEG.
Đây là một hình ảnh có lẽ bạn có hoặc tải lên Facebook,
hoặc nhìn thấy bất cứ nơi nào trên web.
Thật vậy, hình ảnh chúng tôi chỉ cưa của Daven là một JPEG.
Và điều thú vị về các tập tin như hình ảnh JPEG
là họ có thể được xác định, thường, bởi mô hình nhất định các bit.
>> Nói cách khác, nó là gì mà phân biệt một JPEG từ GIF
từ một PING từ Word tài liệu từ một file Excel?
Vâng, nó chỉ khác nhau mô hình của các bit.
Và những mô hình khác nhau thường vào lúc bắt đầu của những tập tin.
>> Vì vậy, khi máy tính của bạn mở Word doc, hoặc khi một máy tính sẽ mở ra một JPEG,
có vẻ thường tại lần đầu tiên một số bit trong tập tin.
Và khi nhận ra những mô hình, nó nói, oh, đây là một hình ảnh.
Hãy để tôi hiển thị nó cho người sử dụng như một hình ảnh.
Hoặc, oh, điều này trông giống như một doc Word.
Hãy để tôi chỉ cho người sử dụng như một bài luận.
>> Vì vậy, ví dụ, hình ảnh JPEG, nó quay ra, là
khá tinh vi bên dưới mui xe.
Nhưng ba byte đầu tiên trong hầu hết tất cả các JPEG bắt đầu với ba con số.
Vì vậy, byte không, một, và hai là, trong hầu hết tất cả các định dạng JPEG, 255, sau đó là số
216, sau đó là số 255.
>> Và những gì bạn sẽ có thể bắt đầu thực hiện vào tuần tới
thực sự là chọc bên dưới mui xe của các tập tin như hình ảnh JPEG
và như các tập tin bitmap, và nhìn thấy những gì luôn luôn ở đó càng lâu
như bạn đã sử dụng máy tính.
>> Nhưng những gì không có thường viết như số thập phân như thế này.
Khoa học máy tính không có xu hướng nói trong thập phân.
Họ không thực sự nói chuyện trong hệ nhị phân.
Thông thường, khi chúng ta muốn thể hiện số,
chúng tôi thực sự sử dụng hệ thập lục phân, mà bạn có thể nhớ lại
từ, nói rằng, vấn đề Set Một, trong đó thách thức
bạn phải suy nghĩ về một hệ thống khác nhau.
>> Chúng tôi, tất nhiên, đã quen thuộc với số thập phân, không thông qua chín.
Chúng tôi nói về nhị phân.
Và chúng tôi không thực sự có để sử dụng nhiều ở đây
vào ra, bởi vì máy tính sẽ sử dụng.
Tuy nhiên, các lập trình viên sẽ rất thường xuyên, nhưng không phải lúc nào,
sử dụng hệ thập lục phân, mà chỉ có nghĩa bạn có 16 chữ cái trong bảng chữ cái của bạn,
như trái ngược với hai hoặc 10.
>> Vì vậy, làm thế nào để bạn đếm đến cao hơn chín trong hệ thập lục phân?
Bạn đi 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, đ, e, chỉ cần theo quy ước.
Nhưng điều quan trọng là mỗi trong số này là một biểu tượng duy nhất.
Không có 10.
Không có 11, cho mỗi gia nhập, bởi vì mỗi các chữ số của bạn, giống như trong hệ thập phân
và cũng giống như trong hệ nhị phân, nên chỉ là một nhân vật duy nhất, theo quy ước.
>> Vì vậy, mà sau đó là bảng chữ cái chúng ta có lúc xử lý của chúng tôi cho hệ thập lục phân.
Vì vậy, những gì hiện một JPEG trông giống như nếu bạn là để viết ra những người đầu tiên ba
không byte là số thập phân nhưng, Ví dụ, như hệ thập lục phân?
Và tại sao hex thậm chí tất cả những gì hữu ích?
>> Vâng, một cái nhìn nhanh một ví dụ.
Vì vậy, nếu tôi viết ra các bit đại diện cho các số thập phân numbers--
này có thể là một chút gỉ bây giờ từ một vài tuần trở lại,
nhưng một trong những trái và một trong những quyền là khá dễ dàng.
255 là số lượng lớn nhất của chúng tôi có thể đại diện với tám bit.
Đó là tất cả những người thân.
Vì vậy, chỉ có một mà là nhẹ thú vị là một trong những trung.
Và nếu bạn loại làm ra toán học, bạn sẽ suy luận rằng, trên thực tế,
rằng mô hình của một và số không đại diện cho 216.
Vì vậy, chúng ta hãy chỉ định cho bây giờ mà những là chính xác.
Nhưng tại sao điều này là thú vị?
>> Vâng, một byte, tất nhiên, là tám bit.
Và nó chỉ ra rằng nếu bạn nghĩ của một byte như hai khối của bốn bit,
như thế này.
Hãy để tôi chỉ cần thêm một số không gian.
Vì vậy, trước, sau.
Tôi đã chỉ cần thêm một số không gian màu trắng vì lợi ích trực quan ở đây.
Làm thế nào có thể bây giờ chúng tôi đại diện cho trong, nói, thập lục phân mỗi quad bit,
mỗi bộ bốn bit?
>> Vì vậy, ví dụ, bên trái bây giờ, chúng tôi có 1111 trong hệ nhị phân.
Con số trong hệ thập phân là gì, nếu bạn làm ra toán học?
Bạn có nơi những người thân, nơi twos, nơi bốn chân, và nơi Tám.
>> TƯỢNG: 15.
DAVID J. Malan: Đó là 15.
Vì vậy, nếu chúng ta làm tám cộng với bốn cộng với hai cộng một, chúng tôi nhận được 15.
Vì vậy, tôi có thể viết ra 15 dưới đây 1111, nhưng toàn bộ các điểm ở đây
là hệ thập lục phân, không phải thập phân.
Vì vậy, thay vì viết xuống 15, 1-5, Tôi sẽ viết rằng trong hex,
mà nếu bạn nghĩ lại, nếu bạn có không thông qua f, những gì được 15 sẽ là?
TƯỢNG: f.
DAVID J. Malan: Thực ra đó là e.
Và bạn có thể làm việc mà ra bằng cách nói, tốt, nếu một là 10, sau đó OK, e là 15.
Vì vậy, trên thực tế, chúng ta có thể viết lại cùng một tập hợp các con số như f f.
Và sau đó, nếu chúng ta làm một chút về toán học, chúng tôi sẽ suy luận rằng đó là d.
Tám là khá dễ dàng, bởi vì chúng tôi có một trong những nơi Tám.
Và sau đó, chúng tôi có một vài chi tiết f f.
>> Vì vậy, những gì con người có xu hướng làm theo quy ước khi họ sử dụng hệ thập lục phân là họ chỉ
viết này một chút ngắn gọn hơn, thoát khỏi hầu hết các không gian màu trắng.
Và chỉ để được siêu rõ ràng để độc giả rằng đây là hệ thập lục phân,
quy ước đơn giản trong con người là bạn viết không
x, trong đó không có ý nghĩa khác hơn một định hình ảnh của,
ở đây có một số hex.
>> Và sau đó, bạn đặt hai chữ số, f f trong trường hợp này, sau đó d một, sau đó f f.
Vì vậy, câu chuyện dài ngắn, hệ thập lục phân chỉ có xu hướng
là hữu ích bởi vì mỗi mình chữ số, không thông qua f, hoàn toàn dòng
với một mô hình của bốn bit.
>> Vì vậy, nếu bạn có hai chữ số thập lục phân, không thông qua F, một lần nữa và một lần nữa,
cung cấp cho bạn một cách hoàn hảo tám bit hoặc một byte.
Vì vậy, đó là lý do tại sao nó có xu hướng thông thường là hữu ích.
Không có trí tuệ nội dung thực sự vượt ra ngoài đó,
khác với tính thực tế của nó.
>> Bây giờ hình ảnh JPEG không phải là duy nhất tập tin định dạng đồ họa.
Bạn có thể nhớ lại rằng có các tập tin như thế này trên thế giới,
ít nhất là từ một vài năm trở lại.
>> Vì vậy, đây là thực sự cài đặt trong Windows XP
trên hàng triệu máy tính trên toàn thế giới.
Và đây là một tập tin bitmap, BMP.
Và một tập tin bitmap, như bạn sẽ thấy tiếp theo tuần, chỉ có nghĩa là một mô hình của dấu chấm,
pixel như chúng được gọi, một bản đồ trên bit, thực sự.
>> Vì vậy, những gì là thú vị, tuy nhiên, về định dạng tập tin này, BMP, là
rằng bên dưới mui xe, nó có nhiều hơn chỉ là ba byte
mà soạn tiêu đề của nó, vì vậy để nói chuyện, vài miếng đầu tiên.
Nó thực sự có vẻ hơi phức tạp ở cái nhìn đầu tiên.
Và bạn sẽ thấy điều này trong tập P.
Và nhận được một cái gì đó ra cụ thể này ngay bây giờ
không phải là quá quan trọng, vì chỉ thực tế rằng vào đầu mỗi bitmap
tập tin, một định dạng đồ họa, có một bó toàn bộ các con số.
>> Bây giờ Microsoft, tác giả của định dạng này,
có xu hướng gọi những điều không ints và ký tự
và nổi nhưng lời nói và d lời nói và chờ đợi và byte.
Vì vậy, chúng chỉ là các kiểu dữ liệu khác nhau.
Họ là những cái tên khác nhau cho cùng một điều.
Tuy nhiên, bạn sẽ thấy rằng trong P Set Bốn.
>> Nhưng điều này chỉ là để nói rằng nếu một con người double-click một số tập tin BMP vào mình
hoặc ổ đĩa cứng của mình, và một cửa sổ mở ra lên cho anh ta hoặc cô hình ảnh,
đã xảy ra bởi vì các điều hành hệ thống có lẽ nhận thấy không chỉ
phần mở rộng tập tin BMP trong tên tập tin,
nhưng cũng có một thực tế là có một số ước để mô hình của các bit
ngay từ đầu của file bitmap.
>> Nhưng bây giờ chúng ta tập trung vào một tập tin phức tạp như vậy,
nhưng thay vào đó một cái gì đó như thế này.
Giả sử ở đây trong GEdit, tôi chỉ có sự khởi đầu
của một chương trình khá đơn giản.
Tôi đã có một số bao gồm lên hàng đầu.
Bây giờ tôi đã có # include "structs.h" nhưng Tôi sẽ trở lại đó trong một thời điểm.
Nhưng điều này rất hữu ích cho bây giờ.
Vì vậy, đây là một chương trình đó là sẽ thực hiện
như cơ sở dữ liệu của công ty đăng ký.
Vì vậy, một cơ sở dữ liệu của học sinh, và tất cả học sinh trên thế giới
có một cái tên và một ngôi nhà và có lẽ một số công cụ khác, nhưng chúng tôi sẽ giữ nó đơn giản.
Mỗi học sinh có một cái tên và một ngôi nhà.
>> Vì vậy, nếu tôi muốn viết một Chương trình có mục đích trong cuộc sống
chỉ để lặp từ số không vào đến ba,
nếu có ba học sinh tại Đại học Harvard.
Và tôi chỉ muốn có được, sử dụng GetString, Tên của mỗi học sinh và nhà ở,
và sau đó chỉ cần in ra những điều này.
>> Đây là loại giống như tuần Một, hai tuần thứ bây giờ,
nơi mà tôi chỉ muốn có một cho vòng lặp hoặc một cái gì đó như thế.
Và tôi muốn gọi một vài GetString lần, và sau đó in f một vài lần.
Vì vậy, làm thế nào tôi có thể làm điều này, tuy nhiên, khi cả tên và một ngôi nhà
tham gia cho mỗi học sinh?
>> Vì vậy, bản năng đầu tiên của tôi có thể được để làm một cái gì đó như thế này.
Lần đầu tiên tôi có thể nói, tốt, cho tôi, nói, một mảng các chuỗi gọi tên.
Và tôi không muốn có một hardcode ba ở đây.
Tôi muốn gì để đặt ở đó?
Vì vậy, SINH VIÊN, bởi vì đó chỉ là một hằng số khai báo ở trên,
chỉ vì vậy tôi không cần phải hardcode ba ở nhiều nơi.
Bằng cách này, tôi có thể thay đổi nó một nơi, và nó ảnh hưởng đến sự thay đổi ở khắp mọi nơi.
Và sau đó, tôi có thể làm chuỗi nhà HỌC SINH.
>> Và bây giờ, tôi có thể làm điều gì đó như for (int i = 0; i <SINH VIÊN; i ++.
Vì vậy, tôi đánh máy nhanh, nhưng đây là có lẽ cú pháp quen thuộc bây giờ.
>> Và bây giờ, đây là gần đây.
Nếu tôi muốn đặt vào thứ i tên của học sinh, tôi nghĩ rằng tôi làm điều này.
Và sau đó, không phải là tên nhưng ngôi nhà trong ngoặc tôi.
Tôi làm điều này, GetString, và để cho tôi quay trở lại và sửa chữa đường dây này.
Đồng ý không?
Không đồng ý?
Đó không phải là rất dễ sử dụng.
Tôi đã không nói với người sử dụng phải làm gì.
>> Nhưng bây giờ, nếu tôi cũng muốn sau này, chúng ta hãy
nói, in những điều này out-- để TODO sau.
Tôi sẽ làm nhiều hơn với this-- này cho là đang
thực hiện đúng nhận được tên và nhà ở, ba
trong số họ tổng cộng của mỗi, từ một người sử dụng.
>> Nhưng đây không phải là thiết kế rất tốt, phải không?
Nếu học sinh không chỉ có một tên và một ngôi nhà, mà còn một số ID,
và một số điện thoại, và một địa chỉ email,
và có thể là một trang nhà, và Twitter có thể là một xử lý,
và bất kỳ số lượng các chi tiết khác liên kết với một sinh viên hay một người,
nói chung.
Làm thế nào chúng ta sẽ bắt đầu thêm chức năng để chương trình này?
>> Vâng, tôi cảm thấy như cách đơn giản nhất might được để làm một cái gì đó như thế nào, chúng ta hãy nói,
SINH VIÊN int id.
Vì vậy, tôi có thể đặt tất cả các ID của họ trong đó.
Và sau đó, một cái gì đó như số điện thoại,
Tôi không chắc chắn làm thế nào để đại diện cho rằng chỉ được nêu ra.
Vì vậy, chúng ta hãy đi trước và chỉ gọi này Twitter SINH VIÊN, mà
là một chút lạ, nhưng-- và một loạt các lĩnh vực hơn.
>> Tôi đã bắt đầu có hiệu quả sao chép và dán ở đây.
Và điều này là sẽ phát triển khá khó sử dụng khá nhanh chóng, đúng không?
Nó sẽ không được tốt đẹp nếu có trên thế giới một cấu trúc dữ liệu được biết đến
không phải là một int hoặc một chuỗi, nhưng một cái gì đó mức độ cao hơn, một trừu tượng, vì vậy
để nói chuyện, được biết đến như một sinh viên?
C đã không đến với built-in chức năng cho sinh viên,
nhưng những gì nếu tôi muốn để cho nó như vậy?
>> Vâng, nó quay ra, tôi sẽ mở một tập tin gọi là structs.h đây,
và bạn có thể làm chính xác điều đó.
Và chúng ta sẽ bắt đầu làm điều này ngay bây giờ.
Và bên dưới mui xe của P Set Ba, bạn đã được làm điều này ngay bây giờ.
Không có những điều như một g rect hoặc một hình bầu dục g trong ngôn ngữ lập trình C.
>> Folks tại Đại học Stanford thực hiện những các kiểu dữ liệu bằng cách sử dụng phương pháp này ở đây,
tuyên bố dữ liệu mới của mình loại sử dụng một từ khóa mới
gọi là cấu trúc và một một gọi là typedef.
Và thực sự, mặc dù cú pháp nhìn một chút khác nhau từ các công cụ
chúng ta đã thấy trước đây, trong Về nguyên tắc, đó là siêu đơn giản.
>> Điều này chỉ có nghĩa là "định nghĩa một kiểu."
Đó sẽ là một cấu trúc, và một cấu trúc
cũng giống như một container cho nhiều điều.
Và cơ cấu đang diễn ra để có một chuỗi gọi tên,
và một chuỗi gọi là nhà.
Và chúng ta hãy gọi, chỉ cho thuận tiện, toàn bộ học sinh này cấu trúc dữ liệu.
>> Vì vậy, thời điểm này bạn có thể dấu chấm phẩy, bạn có bây giờ
tạo ra dữ liệu của riêng bạn loại được gọi là sinh viên
mà bây giờ đứng bên cạnh int, và float, char, và chuỗi,
và g rect, và g hình bầu dục, và bất kỳ số những thứ khác người đã phát minh ra.
>> Vì vậy, những gì hữu ích về vấn đề này bây giờ là nếu tôi quay trở lại
để tái cấu trúc 0 và kết thúc này thực hiện, mà tôi đã viết
trước đây, nhận thấy rằng tất cả của sự hỗn độn không thể tránh khỏi
là về để bắt đầu xảy ra khi tôi thêm số điện thoại và Twitters và tất cả
những thứ khác để định nghĩa của học sinh,
bây giờ nó ngắn gọn thúc như chỉ là một mảng của các học sinh.
>> Và mỗi người trong số những sinh viên hiện nay có nhiều thứ bên trong của nó.
Vì vậy mà chỉ còn để lại một câu hỏi.
Làm thế nào để bạn có được vào tên, và ngôi nhà, và ID,
và bất cứ điều gì khác là bên trong của học sinh?
Siêu đơn giản, là tốt.
Cú pháp mới, nhưng một ý tưởng đơn giản.
>> Bạn chỉ cần chỉ số vào mảng, như chúng ta đã làm tuần trước và điều này.
Và những gì rõ đoạn mới của cú pháp?
Chỉ cần., Có nghĩa là "đi vào bên trong cấu trúc và được lĩnh vực này được gọi là
tên, có lĩnh vực được gọi là nhà, có lĩnh vực được gọi là học sinh. "
>> Vì vậy, trong P Set Ba, nếu bạn vẫn làm việc trên đó,
và hầu hết mọi người vẫn còn được, nhận ra rằng khi bạn
bắt đầu sử dụng những thứ như rects g và g hình bầu dục
và những thứ khác mà không có vẻ đến từ Tuần Zero, Một, hoặc hai,
nhận ra rằng đó là bởi vì Stanford tuyên bố một số loại dữ liệu mới.
>> Và quả thực, đó là chính xác những gì chúng tôi sẽ làm, là tốt, P Set Bốn, khi
chúng ta bắt đầu để đối phó với điều như hình ảnh, ảnh, và nhiều hơn nữa.
Vì vậy, đó chỉ là một lời trêu ghẹo và một mô hình về tinh thần cho những gì sắp đến.
Bây giờ, tôi procrastinated một chút sáng nay.
Tôi đã loại tò mò để xem những gì hình nền Microsoft thực sự
trông giống như ngày hôm nay.
Và hóa ra một người nào đó trong năm 2006 thực sự đi đến gần như chính xác
cùng một chỗ để chụp ảnh trong thực tế những gì trông giống như những ngày này.
Các lĩnh vực bây giờ là một chút mọc.
>> Vì vậy, bây giờ nói các hình ảnh, chúng ta hãy mang lại Daven đây
trên màn hình và Nicholas, và chỉ nhắc nhở bạn
nếu bạn muốn tham gia với chúng tôi để ăn trưa Thứ sáu này, người đứng đầu để URL thông thường của chúng tôi
ở đây.
>> Vì vậy, nơi nào họ rời khỏi tháo hôm qua?
Chúng tôi giới thiệu vấn đề này, phải không?
Điều này dường như là một chính xác thực hiện trao đổi,
nhờ đó mà bạn dùng hai ints, một gọi là, một gọi là b,
trao đổi chúng, giống như Laura đã làm ở đây trên sân khấu với sữa và nước,
bằng cách sử dụng tạm thời biến, hoặc một cốc rỗng,
để chúng tôi có thể đặt b trong một và một trong b mà không làm cho một mớ hỗn độn của sự vật.
Chúng tôi sử dụng một biến.
Nó được gọi là tạm thời.
>> Nhưng những gì là cơ bản vấn đề với mã này hôm thứ Hai?
Vấn đề ở đây là gì?
Yeah.
>> TƯỢNG: Nó chiếm nhiều không gian hơn.
>> DAVID J. Malan: Đưa lên hơn không gian, bởi vì tôi đang sử dụng một biến,
và đó là OK.
Đó là sự thật, nhưng tôi sẽ nói đó là OK.
Đó là chỉ có 32 bit trong lớn chương trình của sự vật, do đó, không phải là một vấn đề lớn.
Suy nghĩ khác?
TƯỢNG: Nó chỉ giao dịch hoán đổi các biến tại địa phương.
DAVID J. Malan: Chính xác.
Nó chỉ hoán đổi các biến tại địa phương.
Bởi vì bất cứ lúc nào bạn gọi một function-- khi tôi đã có các khay từ Annenberg
Lần cuối cùng, bạn có chính ở phía dưới.
Ngay sau khi bạn gọi một chức năng được gọi là trao đổi, trao đổi không nhận được x và y,
các giá trị ban đầu.
Trao đổi get gì, chúng tôi đã yêu cầu bồi thường?
TƯỢNG: bản sao.
DAVID J. Malan: Vì vậy, bản sao của chúng.
Vì vậy, nó được một và hai, nếu bạn nhớ lại ví dụ từ lần cuối cùng,
nhưng một bản sao của một và hai được trao đổi thành công.
Nhưng tiếc là cuối cùng, những giá trị vẫn như nhau.
Vì vậy, chúng ta có thể thấy điều này với chúng tôi người bạn mới, hy vọng GDB,
mà bạn hoặc TF và Ca của có được hướng dẫn bạn hướng tới như sau.
>> Vì vậy, không thu hồi trao đổi trông like-- hãy mở this-- trông như thế này.
Chúng tôi khởi tạo x một, y hai.
Đã có một loạt in f.
Nhưng sau đó, các cuộc gọi quan trọng ở đây là để trao đổi, mà
là chính xác mã chúng tôi chỉ thấy một chút thời gian trước đây.
Đó là chính xác đầu tiên Trong nháy mắt, nhưng chức năng,
Chương trình này không làm việc, bởi vì nó không thường xuyên trao đổi x và y.
>> Vì vậy, chúng ta hãy xem này, một ấm nhanh lên đây với GDB, một ./noswap.
Một loạt các thông tin mà áp đảo Tôi sẽ thoát khỏi với điều khiển L cho bây giờ.
Và bây giờ, tôi sẽ đi trước và chạy nó.
Và thật không may, đó Không phải là hữu ích.
Nó chạy chương trình bên trong này chương trình gọi là GDB, một trình gỡ lỗi,
nhưng nó không cho tôi poke xung quanh.
>> Vì vậy, làm thế nào tôi có thể thực sự tạm dừng thực hiện trong chương trình này?
Vì vậy, phá vỡ.
Và tôi có thể phá vỡ bất cứ số lượng, một, 10, 15 dòng.
Nhưng tôi cũng có thể phá vỡ tượng trưng bằng cách nói phá vỡ chính.
Và đó sẽ thiết lập ngắt điểm, dường như ở dòng 16 trong chính.
Và ở đâu là dòng 16?
Chúng ta hãy đi đến các mã và đi lên noswap.
Và quả thực, dòng 16 là đầu tiên trong chương trình.
>> Vì vậy, bây giờ, nếu tôi đi trước và loại chạy thời gian này, Enter, nó dừng lại.
Vì vậy, hãy poke xung quanh.
In x-- tại sao x không?
Và bỏ qua những ký hiệu đô la.
Đó là chỉ dành cho những người biết thưởng sử dụng của chương trình.
Tại sao không x tại thời điểm này?
Yeah.
>> TƯỢNG: Nó dừng lại ngay trước khi đường 16, không thực sự trên đường 16.
DAVID J. Malan: Chính xác.
GDB, theo mặc định, đã dừng lại thực hiện ngay trước khi dòng 16.
Vì vậy, nó đã không được thực hiện, trong đó có nghĩa là x là một số giá trị không rõ.
Và chúng tôi đã may mắn rằng đó là một cái gì đó sạch như bằng không.
Vì vậy, bây giờ nếu tôi gõ tiếp theo, bây giờ nó thực hiện 16.
Nó đang đợi tôi để thực hiện 17.
Hãy để tôi đi trước và in x.
Đó là một.
Hãy để tôi đi trước và in y.
Tôi sẽ thấy gì bây giờ?
>> TƯỢNG: [không nghe được]
>> DAVID J. Malan: A to hơn chút.
>> TƯỢNG: [không nghe được]
DAVID J. Malan: Không hoàn toàn là một sự đồng thuận.
Vì vậy, có, chúng ta thấy một số giá trị rác.
Bây giờ, y là 134514064 có.
Vâng, nó chỉ là một số giá trị rác.
Chương trình của tôi sử dụng bộ nhớ RAM cho các mục đích khác nhau.
Có các chức năng khác.
Những người khác đã viết bên trong máy tính của tôi.
Vì vậy, những bit đã được sử dụng các giá trị khác, và những gì tôi nhìn thấy
là những tàn tích của một số sử dụng trước của bộ nhớ.
>> Vì vậy, không có việc lớn, bởi vì ngay như tôi loại tiếp theo và sau đó in y,
nó khởi tạo giá trị mà tôi muốn.
Vì vậy, bây giờ, chúng ta hãy đi trước nhanh hơn một chút.
N cho tới.
Hãy làm điều đó một lần nữa.
Nhưng tôi không muốn nhấn nó ở đây, bởi vì nếu tôi
muốn xem những gì đang xảy ra bên trong hoán đổi, lệnh là gì?
>> TƯỢNG: bước.
>> DAVID J. Malan: bước.
Vì vậy, đây bước tôi vào một chức năng, chứ không phải trên nó.
Và bây giờ, đó là một chút khó hiểu trung thực, nhưng điều này chỉ là
nói với tôi tôi đang ở dòng 33 giờ.
Và chúng ta hãy làm điều này một lần nữa.
In tạm thời.
Giá trị rác, tiêu cực thời gian này, nhưng đó chỉ là vẫn còn một giá trị rác.
Vì vậy, hãy làm gì tiếp theo, in tạm thời.
Nó khởi tạo 1, là giá trị của x, hay còn gọi là a.
>> Bây giờ, ở đâu chúng tôi một x và đến từ đâu?
Vâng, thông báo trong chính, chúng tôi được gọi là các giá trị x và y.
Sau đó chúng tôi vượt qua họ để trao đổi như sau.
X đến đầu tiên, dấu phẩy y.
Và sau đó, trao đổi có thể gọi họ là x và y.
Nhưng cho rõ ràng, đó là gọi họ là a và b.
Nhưng a và b tại đang có được bản sao của x và y tương ứng.
>> Vì vậy, nếu tôi trở lại GDB, tạm thời hiện là một trong và bây giờ là một.
Nhưng nếu tôi làm gì tiếp theo và bây giờ làm in một, một đã được chuyển qua.
Sữa đã được đổ vào các cựu kính nước cam, hoặc ngược lại.
>> Và nếu tôi làm gì tiếp theo một lần nữa, và bây giờ nếu tôi in ra như là một kiểm tra sanity,
một vẫn còn là hai, nhưng bây giờ là một trong những b.
Thành thật mà nói, nó vẫn còn đó.
Tôi không quan tâm những gì là tạm thời.
Nhưng ngay khi tôi bây giờ gõ, chúng ta hãy nói, tiếp tục quay trở lại, bây giờ tôi đang ở cuối
chương trình.
Và thật không may, x là vẫn còn một và y vẫn là hai.
>> Vì vậy, các tiện ích của GDB có là gì?
Nó không giúp tôi sửa chữa vấn đề cho mỗi gia nhập,
nhưng hy vọng giúp tôi hiểu nó bằng cách thực hiện
mà có, logic của tôi là đúng, nhưng mã của tôi không có cuối cùng
một ảnh hưởng lâu dài.
Vì vậy, đó là một vấn đề chúng tôi đi đến nay giải quyết ngày hôm nay.
>> Nhưng chúng ta đạt được điều đó bằng cách này.
String là một lời nói dối.
Nó cũng không phải là một kiểu dữ liệu tồn tại trong C. Đó là
là một từ đồng nghĩa với một số thời gian cho cái gì khác,
và chúng ta có thể cho thấy như sau.
>> Hãy để tôi đi trước và mở ra một chương trình được gọi là so sánh-0.
Và thay vì gõ này ra, chúng tôi sẽ bắt đầu đi qua các mã
Tôi đã viết, nhưng nó chỉ là một vài dòng.
Vì vậy, đây là so sánh-0.
Và điều đầu tiên tôi đang làm là nhận được một dòng văn bản.
>> Nhưng hãy chú ý những gì tôi làm cho lần đầu tiên.
Những điểm khác biệt rõ ràng về dòng 21?
Trên thực tế, chờ một phút.
Đây là bản sao hai.
Đó không phải là ngay cả những chương trình thích hợp.
Được rồi, spoiler cảnh báo.
Được rồi, vậy bao giờ nhớ rằng.
Đó là câu trả lời cho một câu hỏi trong tương lai.
>> Dưới đây là so sánh-0, và tôi về để có được một dòng văn bản.
Chương trình đơn giản hơn nhiều.
Vì vậy, đây là đơn giản.
Điều này giống như Tuần Một, Tuần thứ Hai tại thời điểm này. string s = GetString.
Bây giờ, tôi nói lại lần nữa ở đây.
chuỗi t = GetString.
Và sau đó, điều cuối cùng trong này chương trình, như tên gọi của nó,
là tôi sẽ cố gắng để so sánh chúng.
>> Vì vậy, nếu s, chuỗi đầu tiên, bằng = t, sau đó tôi
sẽ nói bạn gõ cùng một điều.
Khác, tôi sẽ nói bạn gõ những điều khác nhau.
Vì vậy, hãy biên dịch và chạy chương trình này.
Vì vậy, hãy so sánh không.
Có vẻ tốt.
Không có lỗi biên dịch.
>> Hãy để tôi đi trước giờ và gõ ./compare-0.
Hãy để tôi đi trước và nói điều gì đó : Daven và một cái gì đó: Rob.
Và tôi gõ những điều khác nhau.
Cho đến nay, như vậy tốt.
Chương trình có vẻ là đúng.
>> Nhưng chúng ta hãy chạy nó một lần nữa.
Nói điều gì đó: Gabe.
Tất cả các quyền.
Có lẽ tôi nhấn thanh không gian hoặc một cái gì đó sôi nổi.
Hãy làm điều đó một lần nữa.
Vì vậy, Zamyla.
Zamyla.
Những thứ khác nhau.
Vì vậy, những gì đang xảy ra?
>> Vì vậy, chúng tôi có hai dòng mã, GetString được gọi là hai lần.
Và sau đó, tôi chỉ đơn giản là cố gắng để so sánh s và t.
Nhưng những gì thực sự đang xảy ra sau đó?
Vâng, về chữ viết tay của tôi để bán thịt ví dụ này phần nào.
Và chúng ta hãy thực sự ném này lên trên đây, là tốt.
>> Vì vậy, chúng tôi có một dòng như string s = GetString.
Vì vậy, đó chỉ đơn giản là người đầu tiên dòng thú vị từ chương trình.
Nhưng tất cả những gì thời gian này đã được xảy ra dưới mui xe?
Vâng, trên tay trái bên là chuỗi, đó là một số loại biến,
và nó được gọi là s.
Vì vậy, tôi biết rằng điều này là sử dụng bộ nhớ, hoặc bộ nhớ RAM, trong máy tính của tôi bằng cách nào đó.
Vì vậy, tôi sẽ trừu tượng vẽ đó là một hình vuông.
32 bit, nó quay ra, nhưng thêm vào đó trong tương lai.
Và sau đó, những gì đang xảy ra ở đây?
>> Vâng, rõ ràng là GetString được một chuỗi từ người sử dụng.
Và có GetString Zamyla hoặc Gabe hoặc Daven.
Vì vậy, hãy chọn đầu tiên của những người, đó là Daven.
Vì vậy, hiệu quả, những gì có GetString tôi trong đó trường hợp đầu tiên là D-một-v-e-n.
Và sau đó, những gì người khác đã làm nó cho tôi bí mật?
TƯỢNG: [không nghe được]
DAVID J. Malan: Yeah, các / 0 hoặc null nhân vật.
Vì vậy, nó có hiệu quả đã cho tôi một chuỗi.
Nhưng chúng ta đã biết từ trước trông thấy một chuỗi chỉ là một mảng
của các nhân vật, và nó kết thúc bằng nhân vật trọng điểm đặc biệt này, / 0.
>> Nhưng nếu điều này là đúng và đây là một hình vuông,
điều này rõ ràng là một hình chữ nhật lớn hơn nhiều.
Và quả thực, đây là, Tôi khẳng định, chỉ có 32 bit.
Và điều này rõ ràng là hơn 32 bit, bởi vì điều này có lẽ
tám cộng với tám cộng với tám cộng với tám cộng với tám,
chỉ vì byte trong ASCII.
Làm thế nào có hề Chúng ta đang đi để phù hợp với Daven vào ô nhỏ ở đây?
>> Vâng, những gì đang thực sự làm GetString?
Vâng, lưới này ở đây đại diện bộ nhớ máy tính của tôi hay RAM.
Vì vậy, hãy tự ý nói rằng nếu từng đại diện cho một byte,
sau đó chúng ta có thể nghĩ của mỗi byte là có một địa chỉ,
33 như Oxford Street, hoặc 34 Oxford Street, hoặc 35 đường Oxford.
>> Vì vậy, giống như những ngôi nhà có địa chỉ và các tòa nhà có địa chỉ,
do đó, làm byte cá nhân bộ nhớ có địa chỉ hoặc số
mà nhận diện chúng.
Bây giờ, đây là tùy ý.
Tuy nhiên, để giữ cho nó đơn giản, tôi sẽ sử dụng hệ thập lục phân chỉ theo quy ước,
nhưng 0x có nghĩa là không có gì khác hơn "này là hệ thập lục phân."
và tôi sẽ cho rằng "D" kết thúc tại Byte Một trong bộ nhớ.
>> Tôi đã không có gì khác xảy ra trong bộ nhớ, vì vậy Daven có vị trí đầu tiên
tại Byte Một.
Điều này, sau đó, sẽ là 0x2.
Điều này sẽ 0x3.
Đây sẽ là 0x4.
Điều này sẽ 0x5.
Đây sẽ là 0x6.
>> Nhưng một khi bạn bắt đầu suy nghĩ về những gì đang làm của máy tính
bên dưới mui xe, bạn có thể bắt đầu để suy ra
làm thế nào bạn, cách đây vài năm, sẽ C đã thực hiện chính nó.
GetString có thể là gì returning-- bởi vì nó
cảm thấy như nó không trở về Daven, mỗi gia nhập,
bởi vì anh ấy chắc chắn sẽ không để phù hợp với box-- này ít
vì vậy những gì được GetString có thể quay trở lại?
>> TƯỢNG: [không nghe được]
>> DAVID J. Malan: Các vị trí của Daven.
Và nó đã làm điều này kể từ tuần One.
GetString gì thực sự là trở về không phải là một chuỗi, mỗi gia nhập.
Đó là một trong những lời nói dối nhỏ màu trắng.
Nó trả lại địa chỉ của chuỗi trong bộ nhớ, địa chỉ duy nhất.
Daven sống tại 33 đường Oxford.
Nhưng ngắn gọn hơn, Gavin sống tại 0x1, Địa chỉ Number One.
>> Vì vậy, những gì được đưa vào này hộp nhỏ sau đó, để được rõ ràng,
chỉ là địa chỉ của chuỗi.
Vì vậy, tất cả thời gian này, điều này có được diễn ra.
Tuy nhiên, điều này gợi ý bây giờ là nếu tất cả s có
là một số bên trong của nó, ai để ngăn chặn bạn, các lập trình viên,
từ việc đưa bất kỳ số nào trong bất kỳ thay đổi và chỉ nhảy
với đoạn bộ nhớ?
Và quả thực, chúng ta sẽ thấy đó là một mối đe dọa thời gian tới.
>> Nhưng hiện nay, điều này cảm thấy không đủ.
Nếu tôi nói, cho tôi một chuỗi, bạn cho tôi Daven.
Nhưng bạn không thực sự cho tôi Daven.
Tất cả các bạn cho tôi là địa chỉ của Daven.
Làm thế nào để sau đó biết chắc chắn Daven nơi bắt đầu và ends--
những câu chuyện của nhận weird-- Daven nơi bắt đầu và kết thúc,
và sau đó, tiếp theo chuỗi trong bộ nhớ bắt đầu?
>> Vâng, nếu bạn đang giao tôi bắt đầu Daven,
về cơ bản, làm thế nào để tôi biết nơi cuối tên của ông là gì?
Đó là ký tự null đặc biệt, là tất cả các quan trọng hơn bây giờ
nếu dây bên dưới mui xe chỉ đơn giản là xác định
duy nhất bởi vị trí của họ trong bộ nhớ.
Vì vậy, tất cả thời gian này, đó là những gì đã xảy ra.
>> Vì vậy, khi chúng ta nhìn tại mã ở đây, giải thích
nếu bạn làm lỗi trong dòng 26.
Tại sao Zamyla và Zamyla khác nhau?
Tại sao Gabe và Gabe khác nhau?
Vâng, ở phía sau.
>> TƯỢNG: Họ có địa chỉ khác nhau.
>> DAVID J. Malan: Đơn giản là vì họ có địa chỉ khác nhau.
Bởi vì khi bạn gọi GetString một lần nữa, mà tôi sẽ làm một cách nhanh chóng ở đây,
nếu điều này là dòng thứ hai, chuỗi t, như tôi đã làm trong chương trình,
bằng một cuộc gọi đến GetString.
Về sau, tôi gọi GetString, tôi sẽ
để có được một đoạn khác nhau của bộ nhớ.
>> GetString được phép yêu cầu người điều hành
hệ thống hơn và nhiều bộ nhớ hơn.
Nó sẽ không để tái sử dụng cùng sáu byte mỗi lần duy nhất.
Nó sẽ có được một mới đoạn bộ nhớ, mà
có nghĩa là t là sẽ nhận được một số giá trị khác ở đây.
>> Vì vậy, khi tôi làm bằng s = t, bạn không so sánh
D chống lại điều này và A chống lại V này và chống lại điều này.
Bạn đang so sánh này chống lại điều này, mà
thẳng thắn là useless-- khá useful-- là khá vô dụng, bởi vì những người thực sự
quan tâm đến nơi mà các chuỗi trong bộ nhớ?
>> Và quả thực, chúng ta không có.
Và chúng tôi sẽ không bắt đầu đặc biệt quan tâm.
Chỉ trong phạm vi mà lỗi có thể phát sinh và các mối đe dọa an ninh có thể phát sinh sẽ
chúng tôi thực sự bắt đầu quan tâm về việc này.
Vì vậy, hãy khắc phục vấn đề này.
Hóa ra, bạn sửa chữa nó siêu đơn giản.
>> Và chúng ta hãy thực sự, trước khi tôi cho thấy một lần nữa, điều gì sẽ
bạn làm gì nếu trong một lớp học CS50, và bạn phải thực hiện
một so sánh với hai dây.
Bạn rõ ràng không thể chỉ cần sử dụng bằng s = t.
Nhưng chỉ một cách hợp lý, làm thế nào bạn sẽ so sánh chuỗi này
chống lại chuỗi này sử dụng mã C?
Yeah.
>> TƯỢNG: Chỉ cần làm cho vòng lặp [không nghe được]
DAVID J. Malan: hoàn hảo.
TƯỢNG: [không nghe được]
DAVID J. Malan: Vâng.
Chỉ cần sử dụng một vòng lặp hoặc một trong khi vòng lặp hoặc bất cứ điều gì.
Nhưng chỉ cần áp dụng các ý tưởng cơ bản là nếu đây là một đoạn bộ nhớ hoặc một mảng
và đây là, lặp qua cả hai cùng một lúc.
Và chỉ cần so sánh các chữ cái.
>> Và bạn đã có được một chút cẩn thận, bởi vì bạn
không muốn một ngón tay đi quá khứ khác
bởi vì một chuỗi còn hơn khác.
Vì vậy, bạn sẽ muốn kiểm tra giá trị đặc biệt này ở cuối, null.
Nhưng nó thực sự là, trong kết thúc, đơn giản như vậy.
Và thẳng thắn mà nói, chúng ta không cần phát minh lại bánh xe.
Đây là phiên bản hai.
Và những gì tôi sẽ nói ở đây là thay vì so sánh tương đương với s = t,
Tôi thay vì sẽ nói, nếu chuỗi so sánh các s t bằng dấu phẩy = 0.
Bây giờ, những gì được chuỗi so sánh?
>> Hóa ra, đó là một chức năng mà đi kèm với C, có mục đích trong cuộc sống
là để so sánh hai chuỗi.
Và khuấy so sánh, nếu chúng ta đọc nó người đàn ông trang hoặc tài liệu hoặc CS50
tài liệu tham khảo, nó sẽ chỉ đơn giản là nói với bạn rằng khuấy
so sánh lợi nhuận hoặc là một tiêu cực số hoặc một số tích cực hay không,
nơi không có nghĩa là họ đang bằng nhau.
>> Vì vậy, chỉ phỏng đoán.
Nó có nghĩa là gì nếu khuấy động lợi nhuận so sánh
giá trị âm hoặc giá trị tích cực?
TƯỢNG: Lớn hơn hoặc ít hơn.
DAVID J. Malan: Yeah, lớn hơn hoặc ít hơn.
Vì vậy, nếu bạn muốn sắp xếp toàn bộ bó dây trong một dictionary--
như chúng ta sẽ dần dần xuống road-- chức năng hoàn hảo để sử dụng khả năng,
bởi vì nó sẽ làm điều đó so sánh các chuỗi cho bạn, và nói
bạn thực hiện một đến trước b, hoặc làm b đến trước một bảng chữ cái.
Chúng tôi có thể làm chính xác điều đó.
>> Và tôi đã làm một việc thông báo khác điều trong ví dụ này.
Những gì người khác đã thay đổi cao hơn trong chức năng chính này?
Char *.
Và đây là lời nói dối khác.
Tất cả thời gian này, khi bạn đã được viết chuỗi,
chúng tôi đã bí mật viết lại chuỗi như char * để kêu vang thực sự
hiểu bạn.
>> Nói cách khác, trong CS50.h và như chúng ta cuối cùng sẽ thấy,
chúng tôi thực hiện một chuỗi gọi là từ đồng nghĩa đó là điều tương tự như char *.
Và bây giờ, chỉ biết rằng *, Trong bối cảnh này, ít nhất,
có nghĩa là địa chỉ.
>> Địa chỉ của những gì?
Vâng, thực tế là tôi đã nói char *, và không phải int * hoặc nổi *,
có nghĩa là char * là địa chỉ của một char.
Vì vậy, hộp nhỏ này ở đây, hay còn gọi là chuỗi, thực sự là kiểu char *,
mà chỉ đơn giản là một cách nói, trong hộp này sẽ đi một địa chỉ.
Và những gì địa chỉ tham khảo?
Rõ ràng, một char.
>> Nhưng chúng ta có thể hoàn toàn có int * và những thứ khác.
Nhưng hiện nay, char * thực sự nhiều nhất là đơn giản và một trong những quan tâm.
Vì vậy, vấn đề này sẽ tăng lên, tuy nhiên, một lần nữa.
>> Giả sử tôi mở ra chương trình này.
Hãy xem nếu bây giờ chúng ta có thể dự đoán những gì sai với mã này.
Vì vậy, trong chương trình này, sao chép-0, tôi sẽ đi trước và một lần nữa gọi
GetString và lưu trữ các giá trị trong s.
>> Và sau đó, tại sao tôi làm điều này, cũng giống như một lời nhắc nhở từ tuần qua?
Chúng tôi đã nói rằng GetString đôi khi trả về null.
Có nghĩa là gì nếu GetString trả về null?
Một cái gì đó đã đi sai.
Nó có thể có nghĩa là chuỗi quá lớn, ra của máy tính của bộ nhớ.
Nó xảy ra siêu, siêu, siêu hiếm khi, nhưng nó có thể xảy ra.
Chúng tôi muốn kiểm tra cho nó, và đó là tất cả chúng ta đang làm.
>> Bởi vì chúng ta sẽ thấy bây giờ, nếu bạn không bắt đầu kiểm tra thường xuyên cho những thứ
như vô giá trị, có lẽ bạn thực sự bắt đầu đi
đến các địa chỉ trong bộ nhớ không hợp lệ.
Và bạn sẽ bắt đầu gây ngày càng có nhiều lỗi phân khúc.
Hoặc trong một máy Mac hoặc PC, chỉ cần làm cho máy tính treo
hoặc một chương trình đóng băng, có khả năng.
>> Vì vậy, bây giờ, tôi khẳng định trong bản sao-0.c, mà tôi đang đi để sao chép các chuỗi bằng cách
của dòng 28.
Và sau đó, tôi sẽ yêu cầu bồi thường ở phía dưới
ở đây là tôi sẽ để thay đổi một trong số họ.
>> Vì vậy, nhận thấy điều này.
Tôi gọi strlen người bạn cũ của chúng tôi.
Và chỉ cần giải thích bằng tiếng Anh những dòng này 34 đang làm gì?
T khung 0 gì đại diện bên trái.
Yeah.
>> TƯỢNG: nhân vật đầu tiên của t?
DAVID J. Malan: nhân vật đầu tiên của t.
Đó là nó.
Ký tự đầu tiên của t, tôi muốn giao phiên bản chữ hoa
của nhân vật đầu tiên trong t.
Vì vậy, đây được tận dụng chữ cái đầu tiên.
Và sau đó, điều cuối cùng tôi làm trong chương trình này là tôi khẳng định đây là
ban đầu, s, và đây là bản sao, t.
>> Nhưng dựa trên những câu chuyện chúng ta chỉ nói về những gì thực sự là chuỗi,
là những gì dòng 28 thực sự làm, và những gì là
lỗi kết quả sẽ được trên màn hình?
>> Vì vậy, đầu tiên, câu hỏi đầu tiên, 28.
Là chuỗi t = s thực sự làm gì?
Nếu chúng tôi có trên tay trái bên đây chuỗi t = s;
cung cấp cho tôi một hộp ở đây và một hộp ở đây.
Và giả sử địa chỉ này là 0x, hãy nói, 50 thời gian này, tùy tiện.
Những gì hiện chuỗi t = s làm bên dưới mui xe?
>> TƯỢNG: [không nghe được]
>> DAVID J. Malan: Nó lưu trữ bộ nhớ giải quyết có, vì vậy 0x50 đến đó.
Vì vậy, nếu bây giờ, tôi đi đến đầu tiên nhân vật trong t và chữ hoa nó,
những gì tôi đang làm gì để có hiệu quả không?
Tôi đang thực sự làm điều tương tự, phải không?
Bởi vì nếu Địa chỉ 0x50-- và chỉ cần, tôi không có nhiều chỗ trên bảng ở đây,
nhưng cho rằng điều này là 0x50 xuống đây, một nơi nào đó trong bộ nhớ máy tính của tôi.
>> Và tôi đã, ví dụ, Gabe trong chữ thường ở đây, như thế này.
Và tôi đã nói khung t 0 được viết hoa.
Vâng, t khung là 0 chữ cái đầu tiên trong t.
Vì vậy, ít g sẽ trở thành lớn G. Nhưng vấn đề
được, những gì s cũng chỉ ra?
>> TƯỢNG: Cùng.
>> DAVID J. Malan: Điều chính xác.
Vì vậy, một lời giải thích đơn giản có lẽ, thậm chí nếu cú ​​pháp là một chút lạ.
Vì vậy, hãy làm điều này.
Làm bản sao-0 và sau đó ./copy-0.
Nói điều gì đó: Gabe.
Và thật không may, cả hai chúng hiện nay đã được vốn hóa,
nhưng cho rằng cơ bản Vì lý do đó chúng tôi chỉ đơn giản là
bây giờ đối phó với địa chỉ.
>> Vì vậy, làm thế nào để chúng ta bắt đầu address-- không chơi chữ intended--
làm thế nào để chúng ta bắt đầu để giải quyết vấn đề này cụ thể không?
Vâng, trong copy1.c, mọi thứ đang đi để có được một ít phức tạp hơn.
Nhưng tôi sẽ yêu cầu một giải pháp khái niệm đơn giản.
>> Vì vậy, khó để có được cái nhìn đầu tiên.
Sẽ không dễ dàng cho người đầu tiên khi bạn gõ nó ra, có lẽ,
nhưng nếu vấn đề là chỉ đơn giản là làm t = s chỉ
bản sao địa chỉ, những gì, một lần nữa nếu tôi có thể chọn bạn,
sẽ là giải pháp để thực sự sao chép một chuỗi?
>> TƯỢNG: Chúng tôi sẽ có thể sử dụng một vòng nữa.
>> DAVID J. Malan: Vâng.
Vì vậy, chúng ta sẽ cần một vòng lặp lại.
Và bởi vì nếu chúng ta muốn sao chép một chuỗi s thành chuỗi khác,
chúng tôi có thể muốn làm điều đó nhân vật của nhân vật.
Nhưng vấn đề là, nếu đây là ban đầu s,
bây giờ chúng ta cần phải bắt đầu một cách rõ ràng cấp phát bộ nhớ cho t.
>> Nói cách khác, chúng ta hãy vẽ lại một lần cuối cùng này.
Nếu đây là chuỗi s = GetString.
Và chúng ta hãy đặt này ở đây, là tốt.
Đây là GetString.
Và sau đó, hình ảnh cho một cái gì đó như vậy là có được như trước,
g-a-b-điện tử / 0.
Điều đó có vẻ một chút gì đó như thế này.
Và s do đó, chúng tôi gọi đây là 0x50, và đó sẽ là 51, 52.
>> Vì vậy, đây là 0x50.
Và sau đó, tôi làm chuỗi t.
Trong bộ nhớ, đó là chỉ cần đi để cho tôi một hình vuông nhỏ như thế này.
Vì vậy, bước quan trọng là những gì bây giờ?
Nếu tôi muốn sao chép của thành t, những gì trống chúng ta cần phải điền vào đây?
Hoặc làm những gì chúng ta cần phải làm ở mức cao?
Vâng?
Một người nào đó?
Yeah.
>> TƯỢNG: Chúng ta cần phải [không nghe được].
DAVID J. Malan: Vâng, chúng tôi cần phải điền vào khoảng trống này.
Tôi không thể sao chép và sau đó lợi dụng tên của Gabe
cho đến khi tôi yêu cầu hệ điều hành cho một đoạn bộ nhớ
đó là ít nhất là lớn như bản gốc.
Vì vậy, mà lá chúng tôi với một câu hỏi.
>> Làm thế nào để yêu cầu hệ điều hành không chỉ cần cho một chút đơn giản pointer--
như thế này được gọi là, một địa chỉ, một pointer-- không
cho một hộp nhỏ đơn giản như thế này được gọi là một chuỗi?
Làm thế nào để yêu cầu người điều hành hệ thống cho một đoạn lớn của bộ nhớ?
Như vậy đến nay, tôi đã chỉ nhận lại rằng gián tiếp bằng cách gọi GetString.
Vậy làm thế nào được GetString thậm chí còn nhận được bộ nhớ của nó?
>> Vâng, nó chỉ ra rằng có chức năng này khác ở đây
mà bây giờ chúng ta sẽ bắt đầu sử dụng.
Bây giờ, điều này có vẻ than-- cách bí ẩn hơn và tôi là người duy nhất có thể nhìn thấy it--
dòng này có vẻ cách bí ẩn hơn sau đó nó phải ở cái nhìn đầu tiên.
Nhưng chúng ta hãy trêu chọc nó ngoài.
>> Ở phía bên trái, tôi có char * t.
Vì vậy, bằng tiếng Anh, hãy bắt đầu xây dựng câu thích hợp trong thuật ngữ kỹ thuật.
Vì vậy, đây được phân bổ một biến kiểu char * được gọi là t.
Bây giờ, điều đó thực sự có nghĩa gì?
>> Vâng, điều đó có nghĩa, những gì tôi sẽ để đưa vào biến này được gọi là t?
Một địa chỉ của một char.
Vì vậy, đó chỉ là đơn giản, cách hợp lý hơn
mô tả phía bên trái.
Vì vậy, tạo ra hộp này ở đây chỉ.
Vì vậy, các bên phải, có lẽ, sẽ
phân bổ mà lớn hơn đoạn bộ nhớ như thế nào?
Vì vậy, hãy trêu chọc này ngoài.
>> Nó áp đảo ở cái nhìn đầu tiên, nhưng những gì đang xảy ra bên trong đây?
Trước tiên, có malloc, mà rõ ràng là người bạn mới của chúng tôi,
"Bộ nhớ phân bổ."
Vì vậy, đây là tham số được thông qua vào nó, vì vậy nó là một cuộc tranh luận khá lớn.
Vì vậy, hãy trêu chọc này ngoài.
>> strlen của s, tất nhiên, đại diện gì--
TƯỢNG: Số lượng ký tự.
DAVID J. Malan: Chỉ cần các số ký tự trong s.
Vì vậy, độ dài của s, chuỗi ban đầu.
Vì vậy, G-một-b-e.
Vì vậy, nó có thể là bốn trong trường hợp này.
Tại sao tôi làm 1 sau gọi strlen của s?
TƯỢNG: [không nghe được]
DAVID J. Malan: Cho rằng ký tự null đặc biệt.
Nếu bạn hỏi tôi chiều dài là những gì Tên Gabe, tôi sẽ nói bốn.
Bên dưới mui xe, tuy nhiên, tôi cần rằng byte thứ năm cho các ký tự null.
Vì vậy, đó là lý do tại sao tôi đang làm 1.
>> Bây giờ chỉ cần trong trường hợp bạn đang chạy này chương trình trên một máy tính khác hơn, nói,
thiết bị CS50, mà kích thước của một char
có thể khác nhau trong máy của riêng tôi
chỉ ra rằng tôi có thể gọi đây điều hành sizeof, chỉ cần yêu cầu máy tính,
kích thước của một là những gì char trên máy tính này?
>> Và bằng cách nhân trong năm này Chẳng hạn bởi kích thước của một char, mà
trên hầu hết các máy tính sẽ chỉ là một, malloc
sẽ bố trí cho tôi lớn này đoạn bộ nhớ ở đây ở bên phải.
Và nó sẽ return-- nó là một function-- vì vậy nó
sẽ trả lại cho tôi những gì?
TƯỢNG: Địa chỉ?
DAVID J. Malan: Địa chỉ của những gì?
TƯỢNG: Trong bộ nhớ của nó được phân bổ?
DAVID J. Malan: Trong bộ nhớ nó được phân bổ.
Vì vậy, tôi không có ý tưởng, thẳng thắn, nơi này là sẽ kết thúc.
Tôi sẽ đề nghị nó sẽ kết thúc tại 0x88.
Hoàn toàn tùy ý, nhưng một nơi nào đó khác hơn là 0x50,
vì hệ điều hành, những gì Windows và Mac OS làm cho tôi, là
hãy chắc chắn rằng nó đem lại cho tôi những phần khác nhau của bộ nhớ RAM.
>> Vì vậy, đây là giá trị nơi này đoạn bộ nhớ có thể kết thúc.
Vì vậy, đây là những gì kết thúc ở đây, 0x88.
Vì vậy, bây giờ rõ ràng, tôi có thể hiểu được rằng điều này là không giống nhau như thế này,
bởi vì họ đang chỉ vào khối khác nhau của bộ nhớ.
Vì vậy, nếu bây giờ tôi thực sự muốn sao chép này trong, chúng ta hãy làm giải pháp đề xuất của bạn.
>> Chúng ta hãy đi, tạo ra một vòng lặp, và làm khung t i được của khung i.
Bởi vì bây giờ tôi có thể sử dụng mảng giống như ký hiệu này,
bởi vì mặc dù rất malloc quát tôi phân bổ bộ nhớ,
bộ nhớ là byte chỉ tiếp giáp.
Byte, byte, byte, trở lại trở lại trở lại.
>> Tôi có thể chắc chắn như một lập trình viên coi nó như là một mảng, mà
có nghĩa là tôi có thể sử dụng điều này cuối cùng quen thuộc ký hiệu của chỉ một số dấu ngoặc vuông.
>> Vì vậy, hãy để tôi dừng lại ở đó, bởi vì này là rất nhiều cùng một lúc, thậm chí
mặc dù ý tưởng cơ bản để recap là chuỗi đó, tất cả thời gian này,
không phải là một kiểu dữ liệu mới cho mỗi gia nhập.
Nó chỉ là một con trỏ được gọi là, địa chỉ của một nhân vật,
mà chỉ có nghĩa đó là một số mà theo quy ước của con người
chúng tôi có xu hướng để viết một cái gì đó như 0x.
>> Nhưng nó chỉ là một số, 33 như Oxford Street,
mà sẽ xảy ra là Địa chỉ nhà của CS.
Bất kỳ câu hỏi về những chi tiết này?
Vâng?
>> TƯỢNG: Tại sao chúng ta kiểm tra cho t bằng vô giá trị?
>> DAVID J. Malan: Tại sao chúng ta kiểm tra t bằng vô giá trị?
Nếu chúng ta đọc documentation-- question-- tuyệt vời cho malloc,
nó sẽ nói trong bản in đẹp, đôi khi malloc có thể trở về null,
giống như GetString.
Và quả thực, GetString trả về null nếu, lần lượt, malloc trả về null,
vì GetString sử dụng malloc.
>> Và điều đó có thể xảy ra nếu hệ điều hành, Mac OS, Windows, bất cứ điều gì, chỉ đơn giản là
ra khỏi bộ nhớ cho bạn.
Vì vậy, đó là những gì xảy ra ở đó.
>> Và hãy để tôi tiết lộ một điều khác mà chỉ có thể thổi tâm trí của bạn
hoặc hoàn toàn quá xa trên đường dây.
Nhưng hãy để tôi kéo lên tương tự cho vòng lặp cho việc sao chép,
mà lúc nãy, thu hồi được này. khung t i được của khung i.
>> Đẹp và thân thiện.
Cảm thấy như Tuần Hai lần nữa.
Tuy nhiên, phiên bản này thực sự có thể viết lại như thế này, trông khó hiểu.
Đó là một kỹ thuật gọi là con trỏ số học, địa chỉ số học.
Nhưng tại sao không làm việc này?
>> Bây giờ khó chịu, các tác giả của C quyết định sử dụng
* biểu tượng cho các mục đích khác nhau.
Chúng tôi đã nhìn thấy nó được sử dụng một lần rồi, char *, có nghĩa là "cho tôi một biến
đó là sẽ có địa chỉ của một char. "
* Vì vậy, char trong bối cảnh đó có nghĩa là "cho tôi một biến."
>> Thật không may, nếu bạn sử dụng mà không cần * một từ trong phía trước của nó, giống như char,
nó bây giờ được gọi là toán tử tham chiếu.
Và chúng ta sẽ thấy nhiều hơn về điều này trước khi dài.
Tuy nhiên, nó chỉ có nghĩa là "đi đến đó."
Nó giống như nói rằng, nếu ai đó đưa cho tôi trên một mảnh giấy "33 Oxford Street,"
nếu tôi làm "* 33 Oxford Street," điều đó có nghĩa "Đi theo con đường để xây dựng CS."
>> Vì vậy * chỉ có nghĩa là đi đến đó nếu không có từ trong phía trước của nó.
Vì vậy, là những gì t, để được rõ ràng?
t là địa chỉ của đoạn bộ nhớ đã được trao lại cho tôi.
s là địa chỉ của những gì, để được rõ ràng, trong ví dụ này, chúng tôi đã thảo luận,
của gabe chữ thường?
s là địa chỉ of--
ĐỐI TƯỢNG: Các chuỗi.
DAVID J. Malan: Trong tên ban đầu của Gabe.
Vì vậy, nó là địa chỉ của đoạn này của bộ nhớ.
Vì vậy, nếu tôi nói t + i-- tôi, thông báo, chỉ là người bạn cũ của chúng tôi.
Nó chỉ là một biến chỉ số đó là lặp lại từ con số không lên trên
với chiều dài của chuỗi s.
Vì vậy, nó sẽ là không, sau đó một, sau đó hai, sau đó ba, sau đó bốn.
Vì vậy, hãy lắp ráp các mới Mảnh ghép đầu giống như, nếu bạn muốn,
mặc dù, một lần nữa, cú pháp được thêm rất nhiều phức tạp hơn so với Scratch.
Vì vậy, t là một địa chỉ + tôi sẽ cung cấp cho tôi
một số, bởi vì đây là tất cả con số mà chúng tôi đã được vẽ như hex.
Nhưng chúng chỉ là các con số.
>> Vì vậy, nếu địa chỉ của chúng tôi đã nói t là 0x88, 0x88 cộng với những gì không.
Thậm chí nếu bạn không thoải mái với hex chưa, hãy đoán.
>> TƯỢNG: Bản gốc.
>> DAVID J. Malan: Vẫn còn 0x88.
Vì vậy, những gì hiện * 0x88 nghĩa là gì?
Nó có nghĩa là "đến đó" có nghĩa là hiệu quả ", đặt ngón tay của bạn ở đây."
Và giờ đây, ở phía bên tay phải của biểu thức này, * và sau đó trong dấu ngoặc,
s + i là s, đó là địa chỉ lên đây của g ít.
s + 0 là, tất nhiên, s, s là bất cứ điều gì.
>> Vì vậy, bây giờ, nó * s, mà giống như * 33 Oxford Street có nghĩa là đi đến địa chỉ
s.
Vì vậy, đây là ngón tay này, tay phải.
Vì vậy, những gì tôi sẽ sao chép vào những gì?
Điều bên phải, đó là gabe, ít g đây, vào đây.
>> Và vì vậy hiệu quả đó lặp đi lặp lại đầu tiên của vòng lặp,
như bạn đề nghị, mặc dù có vẻ điên phức tạp hơn bất cứ điều gì
chúng ta đã thấy trước đây, chỉ đơn giản là nói đi ở đây và sao chép nhân vật đó ở đây.
Nó đem lại cho bạn một bản đồ để cả hai địa điểm.
>> Và chúng ta sẽ thấy nhiều hơn về điều này.
Nhưng hiện nay, hy vọng chỉ là để giới thiệu một số trong những ý tưởng cơ bản.
Và thực sự, chúng ta hãy nhìn vào một chương trình cuối cùng ở đây,
và sau đó là Claymation hứa, mà sẽ làm cho tất cả mọi thứ rồi.
Tất cả các quyền.
Vì vậy, hãy để tôi mở up-- có chúng tôi đi.
Vì vậy, hãy me-- chúng tôi sẽ trở lại hình ảnh này trước khi dài.
Hãy để tôi mở ví dụ cuối cùng ở đây.
>> Vì vậy, đây là một siêu, siêu chương trình hoàn thành
không có gì trong cuộc sống mà thực hiện những điều sau đây.
Nó đầu tiên khai báo hai biến, x và y, mà không phải là số thời gian này,
cho mỗi gia nhập.
Chúng không phải là số nguyên, mỗi gia nhập.
Họ dường như int *.
Vì vậy, bất cứ ai, điều đó có nghĩa nếu kiểu dữ liệu của bạn, biến bạn,
là kiểu int * sao?
Đó là địa chỉ của một int.
>> Vì vậy, tôi đã không có ý tưởng, nơi nó được nêu ra.
Nó chỉ có nghĩa là "đặt, cuối cùng, địa chỉ của một int ở đây. "
0x50, 0x88, bất cứ nơi nào nó đang ở trong bộ nhớ, một địa chỉ được đến đó.
Và đó là những gì y là có được, là tốt.
>> Nếu bây giờ tôi nói x = malloc (sizeof (int)), đây là một cách nói,
hey hệ điều hành, thông qua malloc, cho tôi đủ bộ nhớ cho các kích thước
của một int, mà có lẽ là sẽ là 32 bit hay bốn byte.
>> Vì vậy, những gì malloc trở lại?
Malloc trả về một địa chỉ.
Vì vậy, những gì sẽ được lưu trữ trong x?
Địa chỉ của đoạn bộ nhớ, bốn byte, malloc mà
chỉ dành cho tôi bằng cách yêu cầu hệ điều hành.
>> Bây giờ trong khi đó, dòng bốn ở đây, * x = 42.
Chỉ cần được rõ ràng, những gì đang xảy ra ở đó?
Ở phía bên trái, * x.
đó là như * 33 đường Oxford.
Vì vậy * x có nghĩa là gì?
>> TƯỢNG: Tới.
>> DAVID J. Malan: Tới địa chỉ đó.
Bất cứ nơi nào mà đoạn bộ nhớ, hãy đến đó.
Và đặt những gì đang có, rõ ràng?
TƯỢNG: 42.
DAVID J. Malan: 42.
Được rồi, * y, cùng một ý tưởng.
Tới địa chỉ trong y.
Đặt con số 13 đó, nhưng y tại thời điểm này là gì?
TƯỢNG: Không có bộ nhớ cho y.
DAVID J. Malan: Có không có bộ nhớ cho y.
Vì vậy, những gì y có thể chứa, như chúng ta đã nói?
>> TƯỢNG: Thùng đựng rác.
>> DAVID J. Malan: Một số giá trị rác.
Bây giờ, giá trị rác vẫn là một con số.
Nó vẫn có thể bị nhầm lẫn với một địa chỉ.
Nó như thể một người nào đó viết vội một cái gì đó xuống,
và tôi hiểu sai nó như là ý nghĩa một số tòa nhà xuống đường phố.
Và nếu bạn chỉ cần cố gắng để đi vào xây dựng một số bạn không sở hữu,
hoặc một số đoạn bộ nhớ bạn có không được đưa ra, những điều xấu có thể xảy ra.
Máy tính có thể sụp đổ, hoặc một số khác hành vi không xác định có thể xảy ra.
>> Vì vậy, giới thiệu, sau đó, để Binky là điều này.
Tôi vẫn còn nhớ, 20 một số năm lẻ sau đó,
nơi tôi là khi tôi cuối cùng hiểu con trỏ.
>> Mà là để nói, nếu bạn rời khỏi đây trong ba phút
và nghĩ rằng tôi không hiểu con trỏ, nhận ra
Tôi đã nhớ trong 20 năm đối với một số lý do điên
khi nào và lý do tại sao cuối cùng nó bị chìm trong, ngồi với giảng dạy của tôi
đồng, Nishat Mehta trong sau của Eliot ăn Hall.
Bây giờ, tôi đã nhớ này bởi vì đây là
một trong những chủ đề tôi, trong Đặc biệt, phải vật lộn với.
Và sau đó, nó cuối cùng nhấn vào, như tôi dám nói rất nhiều chủ đề
cuối cùng sẽ.
Và bây giờ, để làm cho rằng cảm thấy tất cả các hạnh phúc hơn và thuyết phục hơn nữa,
chúng ta hãy có một cái nhìn cuối cùng của chúng tôi ba phút cuối cùng ở đây tại Binky,
từ một người bạn của chúng tôi, Nick Parlante từ Stanford.
>> [VIDEO xem lại]
>> Này, Binky.
Thức dậy!
Đó là thời gian cho con trỏ thú vị.
>> Cái gì vậy?
Tìm hiểu về con trỏ?
Oh, hay qúa!
>> -Vâng, Để bắt đầu, tôi đoán chúng tôi sẽ cần một vài con trỏ.
>> -Ok.
Đoạn mã này cấp phát hai con trỏ, mà có thể trỏ đến số nguyên.
-Ok.
Vâng, tôi nhìn thấy hai con trỏ, nhưng họ dường như không được trỏ đến bất cứ điều gì.
>> -Điều Đó là đúng.
Ban đầu, con trỏ không chỉ để bất cứ điều gì.
Những điều họ chỉ để được gọi là pointees, và cài đặt chúng lên của
một bước riêng biệt.
>> Ồ, đúng rồi.
Tôi biết điều đó.
Các pointees là riêng biệt.
Er, vì vậy làm thế nào để phân bổ một pointee?
>> -Ok.
Vâng, mã này giao một pointee nguyên mới,
và điều này một phần bộ x để trỏ đến nó.
>> Này, có vẻ tốt hơn.
Vì vậy, làm cho nó làm một cái gì đó.
>> -Ok.
Tôi sẽ tới đích của con trỏ đến x lưu trữ số 42 vào pointee của nó.
Đối với thủ thuật này, tôi sẽ cần tôi Magic Wand của dereferencing.
>> -Your Magic Wand của dereferencing?
That-- đó là tuyệt vời.
>> -Đây Là những gì các mã như thế nào.
Tôi sẽ chỉ cần thiết lập số lượng, và [POP]
>> Này, xem xét.
Có nó đi.
>> -Vậy Làm một tới đích vào x sau mũi tên để truy cập pointee của nó.
Trong trường hợp này, một cửa hàng 42 trong đó.
Này hãy thử sử dụng nó để lưu trữ số 13 thông qua con trỏ khác, y.
>> -Ok.
Tôi sẽ chỉ đi qua đây để y, và nhận được con số 13 thiết lập.
Và sau đó, lấy của Wand Dereferencing và chỉ [BUZZ]
>> Ồ!
>> Oh, hey!
Điều đó không làm việc.
Nói, Binky, tôi không nghĩ rằng dereferencing y là một ý tưởng tốt, bởi vì bạn đã biết,
lập pointee là một bước riêng biệt.
Và tôi không bao giờ nghĩ rằng chúng ta đã làm được.
>> Điểm Tốt.
-Yeah.
Chúng tôi bố trí con trỏ y, nhưng chúng tôi không bao giờ đặt nó để trỏ đến một pointee.
>> -Rất Quan sát.
Này, bạn đang tìm kiếm tốt có, Binky.
Bạn có thể sửa chữa nó sao cho các điểm y đến pointee giống như x?
>> -Sure.
Tôi sẽ sử dụng Magic Wand của tôi của con trỏ chuyển nhượng.
>> -Là đó sẽ là một vấn đề như trước đây?
-Không.
Điều này không chạm vào pointees.
Nó chỉ thay đổi một con trỏ đến chỉ ra những điều tương tự như nhau.
>> Oh, tôi nhìn thấy.
Bây giờ y điểm cùng vị trí x.
Vì vậy, chờ đợi.
Bây giờ, y là cố định.
Nó có một pointee.
Vì vậy, bạn có thể thử các Wand của Dereferencing một lần nữa để gửi 13 qua.
>> -Uh, OK.
Ở đây nó đi. [POP]
>> Này, nhìn vào đó.
Bây giờ dereferencing công trình trên y.
Và bởi vì các con trỏ được chia sẻ rằng một pointee, cả hai đều 13 xem.
-Yeah.
Chia sẻ, bất cứ điều gì.
Vì vậy, chúng ta sẽ hoán đổi vị trí bây giờ?
>> Oh, nhìn.
Chúng tôi hết thời gian.
>> -But--
>> -Chỉ Nhớ các quy tắc ba con trỏ.
Number One, cấu trúc cơ bản là bạn có một con trỏ,
và nó chỉ qua một pointee.
Tuy nhiên, con trỏ và pointee riêng biệt,
và lỗi thường gặp là để thiết lập một con trỏ,
nhưng quên để cho nó một pointee.
>> Số Hai, con trỏ dereferencing bắt đầu từ con trỏ
và sau mũi tên của mình đối với để truy cập pointee của nó.
Như chúng ta đều biết, điều này chỉ hoạt động nếu có
một pointee, trong đó loại sẽ trở lại Quy tắc số một.
>> Số Ba, con trỏ chuyển nhượng mất một con trỏ
và thay đổi nó để trỏ đến các cùng pointee như một con trỏ.
Vì vậy, sau khi chuyển nhượng, hai con trỏ
sẽ trỏ đến pointee cùng.
Đôi khi, đó được gọi là chia sẻ.
Và đó là tất cả để có nó, thực sự.
Tạm biệt bây giờ.
[END IMG xem lại]
DAVID J. Malan: Đó là nó cho CS50.
Chúng ta sẽ thấy bạn vào tuần tới.