>> [MUSIC PLAYING]
DAVID J. Malan: Baiklah.
Ini adalah CS50, dan ini adalah akhir minggu Four.
Dan salah satu topik hari ini adalah bahwa forensik digital,
seni memulihkan informasi.
Dan memang, meskipun Anda berada di tengah-tengah
sekarang Damai di Tiga dan Breakout, minggu depan,
fokus akan berada di tepatnya domain ini.
>> Jadi salah satu pekerjaan paling keren yang pernah memiliki kembali di sekolah pascasarjana,
ketika saya bekerja untuk lokal Middlesex County Jaksa ini
kantor, melakukan forensik bekerja.
Jadi pada dasarnya, Massachusetts Kepolisian Negara, pada kesempatan,
ketika bekerja pada kasus akan membawa hal-hal seperti hard drive
dan floppy disk dan kartu memori dan sejenisnya.
Dan mereka akan menyerahkan mereka kepada saya dan mentor saya,
dan tujuan kami adalah untuk menemukan bukti, jika ada, pada media ini.
Sekilas Sekarang, Anda mungkin telah melihat dunia ini forensik
di media, TV dan film.
Tapi pekerjaan aku, dan berani bilang dunia itu,
tidak cukup seperti Anda akan melihatnya.
Mari kita lihat apa Anda mungkin pernah melihat.
[VIDEO PEMUTARAN]
-OK.
Sekarang, mari kita melihat baik Anda.
>> [MUSIC PLAYING]
>> -Tahan Itu.
Jalankan itu kembali.
>> -Tunggu Menit.
Ke kanan.
-Ada.
Bekukan itu.
-Full Layar.
>> -OK.
Bekukan itu.
-Tighten Pada itu, ya?
>> -Vector Dalam pada itu pria dengan roda belakang.
>> -Zoom Di sini di tempat ini.
>> -Dengan Peralatan yang tepat, yang gambar dapat diperbesar dan dipertajam.
>> Apa itu?
>> -Itu Program peningkatan.
>> Bisa kau jelas bahwa apa pun?
>> Aku tidak tahu.
Mari kita meningkatkannya.
>> -Enhance Bagian A6.
Aku ditingkatkan detail, dan--
-Saya pikir ada cukup untuk meningkatkan.
Melepaskannya ke layar saya.
>> -Aku Meningkatkan refleksi di matanya.
-Biarkan Dijalankan melalui peningkatan video.
>> -Edgar, Dapat menyempurnakan ini?
>> -Hang Pada.
>> -Aku Telah bekerja pada refleksi ini.
>> Refleksi -Ada seseorang.
>> -Reflection.
-Ada Refleksi dari wajah pria itu.
>> Refleksi -The!
-Ada Refleksi.
-Zoom Di atas cermin.
Anda dapat melihat refleksi.
>> -Dapatkah Menyempurnakan gambar dari sini?
-Dapatkah Menyempurnakan itu?
-Dapatkah Kita meningkatkan ini?
-Dapatkah Menyempurnakan itu?
-Tahan Sebentar.
Aku akan meningkatkan.
-Zoom Di pintu.
-Times 10.
-Zoom.
-pergilah Di.
-Lebih.
Tunggu, berhenti.
Hentikan.
-Pause Itu.
-Rotate Kita 75 derajat sekitar vertikal, silakan.
>> Hentikan.
Kembali ke bagian tentang pintu lagi.
>> -Punya Peningkat gambar yang dapat bitmap?
>> -Mungkin Kita dapat menggunakan Pradeep Singh metode untuk melihat ke jendela.
>> Software -The adalah keadaan seni.
>> Eigenvalue -The tidak aktif.
>> -Dengan Kanan kombinasi algorithms--
>> -Dia Pencahayaan diambil algoritma ke tingkat berikutnya,
dan saya dapat menggunakannya untuk meningkatkan foto ini.
>> -Lock Dan memperbesar sumbu z.
>> -Enhance.
Meningkatkan.
-Enhance.
-Freeze Dan meningkatkan.
[END VIDEO PUTAR]
DAVID J. Malan: Jadi mereka adalah semua kata-kata, tapi mereka tidak
digunakan dalam kalimat dengan benar.
Dan memang di masa depan, setiap saat, silahkan, Anda mendengar seseorang mengucapkan kata,
"Menyempurnakan," tawa hanya sedikit.
Karena ketika Anda mencoba untuk meningkatkan, misalnya, ini adalah apa yang terjadi.
>> Jadi, inilah foto cantik.
Ini adalah Daven CS50 sendiri.
Dan misalkan kita ingin fokus pada binar di matanya,
atau refleksi dari orang jahat yang jelas
ditangkap oleh kamera keamanan.
Inilah yang terjadi ketika Anda memperbesar gambar yang
hanya memiliki jumlah terbatas bit yang terkait dengan itu.
>> Itu adalah apa yang Anda dapatkan.
Dan memang, di mata Daven ini hanyalah empat, mungkin enam piksel
yang membentuk apa yang itu berkilauan di sana.
Jadi Masalah Set Empat akhirnya akan memiliki Anda menjelajahi dunia ini, khususnya
oleh sifat sesuatu kita sebut file i / o, di mana
i / o adalah cara mewah mengatakan input dan output.
>> Jadi sejauh ini, semua interaksi kami sudah dengan komputer
telah banyak dengan Anda keyboard dan layar,
tetapi tidak begitu banyak dengan hard disk, atau menyimpan file melebihi dari yang Anda
diri menulis.
Program Anda sejauh memiliki tidak membuat, dan menyimpan,
dan memperbarui file mereka sendiri.
>> Nah, apa file?
Nah, sesuatu seperti JPEG.
Ini adalah gambar Anda mungkin memiliki atau meng-upload ke Facebook,
atau melihat di mana saja di web.
Memang, foto yang baru saja kita melihat dari Daven adalah JPEG a.
Dan apa yang menarik tentang file seperti JPEG
adalah bahwa mereka dapat diidentifikasi, biasanya, berdasarkan pola-pola tertentu bit.
>> Dengan kata lain, apa itu yang membedakan JPEG dari GIF
dari PING dari Word dokumen dari file Excel?
Yah, itu hanya berbeda pola bit.
Dan pola-pola yang berbeda biasanya pada awal file tersebut.
>> Sehingga ketika komputer Anda membuka Word doc, atau ketika komputer membuka JPEG sebuah,
terlihat biasanya di pertama beberapa bit dalam file.
Dan jika mengakui pola, ia mengatakan, oh, ini adalah sebuah gambar.
Biarkan aku menampilkannya ke pengguna sebagai grafis.
Atau, oh, ini tampak seperti Word doc.
Mari saya menunjukkan kepada pengguna sebagai sebuah esai.
>> Jadi misalnya, JPEG, ternyata, adalah
cukup canggih di bawah tenda.
Tapi tiga byte pertama di sebagian besar setiap JPEG mulai dengan tiga nomor tersebut.
Jadi byte nol, satu, dan dua, di paling setiap JPEG, 255, lalu nomornya
216, maka jumlah 255.
>> Dan apa yang Anda akan dapat untuk mulai melakukan minggu depan
sebenarnya menusuk bawah kap file seperti JPEG
dan seperti file bitmap, dan melihat apa yang selalu ada selama
Anda sudah menggunakan komputer.
>> Tapi apa tidak ada biasanya ditulis seperti angka desimal seperti ini.
Ilmuwan komputer tidak cenderung berbicara dalam desimal.
Mereka tidak benar-benar berbicara dalam biner.
Biasanya, ketika kita ingin untuk mengekspresikan angka,
kita benar-benar menggunakan heksadesimal, yang Anda mungkin ingat
dari, katakanlah, masalah Set Satu, yang menantang
Anda berpikir tentang sistem yang berbeda.
>> Kami, tentu saja, yang akrab dengan desimal, nol sampai sembilan.
Kami berbicara tentang biner.
Dan kita tidak benar-benar memiliki untuk menggunakan banyak di sini
pada keluar, karena komputer akan menggunakan itu.
Tapi programmer akan sangat sering, namun tidak selalu,
menggunakan heksadesimal, yang hanya berarti Anda memiliki 16 huruf dalam alfabet Anda,
sebagai lawan dua atau 10.
>> Jadi bagaimana Anda menghitung sampai lebih tinggi dari sembilan dalam heksadesimal?
Anda pergi 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, hanya dengan konvensi.
Tapi apa kuncinya adalah bahwa setiap ini adalah satu simbol.
Tidak ada 10.
Tidak ada 11, per se, karena masing-masing digit Anda, persis seperti dalam desimal
dan seperti di biner, seharusnya hanya menjadi karakter tunggal, berdasarkan konvensi.
>> Sehingga kemudian adalah alfabet yang kita miliki kita miliki untuk heksadesimal.
Jadi apa JPEG terlihat seperti jika Anda adalah untuk menulis mereka tiga pertama
byte bukan sebagai desimal tetapi, misalnya, sebagai heksadesimal?
Dan mengapa hex bahkan semua yang berguna?
>> Nah, cepat melihat contoh.
Jadi jika saya menulis bit yang mewakili ini Numbers desimal
ini mungkin sedikit berkarat sekarang dari beberapa minggu lalu,
tapi yang kiri dan benar cukup mudah.
255 adalah yang terbesar nomor kami bisa mewakili dengan delapan bit.
Itu semua yang.
Jadi satu-satunya yang agak menarik adalah yang di tengah.
Dan jika Anda jenis lakukan keluar matematika, Anda akan menyimpulkan bahwa, memang,
bahwa pola satu dan nol mewakili 216.
Jadi mari kita menetapkan untuk sekarang bahwa ini adalah benar.
Tapi mengapa ini menarik?
>> Nah, byte, tentu saja, adalah delapan bit.
Dan ternyata bahwa jika Anda berpikir dari byte sebagai dua potongan empat bit,
seperti ini.
Mari saya hanya menambahkan beberapa ruang.
Jadi sebelum, sesudah.
Aku baru saja menambahkan beberapa ruang putih demi visualisasi di sini.
Bagaimana mungkin kita sekarang mewakili di, mengatakan, heksadesimal setiap quad bit,
setiap rangkaian empat bit?
>> Jadi misalnya, di sebelah kiri sekarang, kami memiliki 1.111 dalam biner.
Apa itu nomor dalam desimal, jika Anda melakukan out matematika?
Anda memiliki tempat yang, tempat berpasangan, tempat merangkak, dan tempat delapan.
>> AUDIENCE: 15.
DAVID J. Malan: Ini 15.
Jadi jika kita melakukan delapan ditambah empat ditambah dua ditambah satu, kita mendapatkan 15.
Jadi saya bisa menuliskan 15 di bawah 1111, tetapi seluruh titik di sini
adalah heksadesimal, bukan desimal.
Jadi alih-alih menulis turun 15, 1-5, Aku akan menulis bahwa dalam hex,
yang jika Anda berpikir kembali, jika Anda memiliki nol sampai f, apa yang 15 akan menjadi?
AUDIENCE: f.
DAVID J. Malan: Jadi ternyata itu f.
Dan Anda dapat bekerja di luar itu dengan mengatakan, baik, jika adalah 10, lalu OK, f adalah 15.
Jadi memang, kita bisa menulis ulang ini set yang sama angka sebagai f f.
Dan kemudian jika kita melakukan sedikit matematika, kita akan menyimpulkan bahwa itu d.
Delapan cukup mudah, karena kita memiliki satu di tempat delapan.
Dan kemudian, kami memiliki beberapa lebih f f ini.
>> Jadi apa manusia cenderung melakukan dengan konvensi ketika mereka menggunakan heksadesimal adalah mereka hanya
menulis ini sedikit lebih ringkas, menyingkirkan sebagian besar dari ruang putih.
Dan hanya untuk menjadi super jelas untuk pembaca bahwa ini adalah heksadesimal,
konvensi sederhana antara manusia adalah Anda menulis nol
x, yang tidak memiliki arti lain daripada identifier visual,
inilah nomor hex.
>> Dan kemudian, Anda menempatkan dua digit, f f dalam kasus ini, maka d, maka f f.
Jadi cerita panjang pendek, heksadesimal hanya cenderung
berguna karena masing-masing perusahaan digit, nol sampai f, sempurna garis
dengan pola empat bit.
>> Jadi jika Anda memiliki dua digit heksadesimal, nol sampai F, lagi dan lagi,
yang memberikan Anda sempurna delapan bit atau satu byte.
Jadi itu sebabnya ia cenderung menjadi konvensional berguna.
Tidak ada intelektual konten benar-benar di luar itu,
selain utilitas yang sebenarnya.
>> Sekarang JPEG bukan satu-satunya format file untuk grafis.
Anda mungkin ingat bahwa ada file seperti ini di dunia,
setidaknya dari beberapa tahun yang lalu.
>> Jadi ini benar-benar dipasang di Windows XP
pada jutaan PC di seluruh dunia.
Dan ini adalah sebuah file bitmap, BMP.
Dan file bitmap, seperti yang akan Anda lihat selanjutnya minggu, hanya berarti pola titik-titik,
pixel karena mereka disebut, a map pada bit, benar-benar.
>> Jadi apa yang menarik, meskipun, tentang format file ini, BMP, adalah
bahwa di balik kap mesin, itu memiliki lebih dari sekedar tiga byte
yang membentuk header, sehingga untuk berbicara, beberapa gigitan pertama.
Itu benar-benar terlihat sedikit rumit pada pandangan pertama.
Dan Anda akan melihat ini di P set.
Dan mendapatkan sesuatu out tertentu ini sekarang
tidak begitu penting, karena hanya fakta bahwa pada awal setiap bitmap
berkas, format grafis, ada sejumlah besar nomor.
>> Sekarang Microsoft, penulis format ini,
cenderung untuk memanggil orang-orang hal tidak int dan karakter
dan mengapung tapi kata-kata dan d kata-kata dan rindu dan byte.
Jadi mereka hanya tipe data yang berbeda.
Mereka nama yang berbeda untuk hal yang sama.
Tapi Anda akan melihat bahwa di P Set Empat.
>> Tapi ini hanya untuk mengatakan bahwa jika manusia double-klik beberapa berkas BMP pada-Nya
atau hard drive, dan jendela terbuka up menunjukkan dia gambar itu,
yang terjadi karena operasi Sistem mungkin melihat tidak hanya
ekstensi file BMP dalam nama file,
tetapi juga fakta bahwa ada beberapa konvensi untuk pola bit
pada awal dari file bitmap.
>> Tapi mari kita sekarang fokus pada seperti file yang rumit,
melainkan pada sesuatu seperti ini.
Misalkan di sini di gedit, saya hanya memiliki awal
dari sebuah program yang cukup sederhana.
Aku punya beberapa termasuk bagian atas.
Sekarang aku punya # include "structs.h" tapi Aku akan kembali ke suatu saat.
Tapi ini berguna untuk saat ini.
Jadi ini adalah program yang akan mengimplementasikan
seperti database registrar.
Jadi database siswa, dan setiap siswa di dunia
memiliki nama dan rumah dan mungkin beberapa hal-hal lain, namun kami akan tetap sederhana.
Setiap siswa memiliki nama dan rumah.
>> Jadi jika saya ingin menulis Program yang tujuannya dalam hidup
hanya untuk beralih dari nol pada hingga tiga,
jika ada tiga mahasiswa di Harvard University.
Dan saya hanya ingin mendapatkan, menggunakan GetString, Nama masing-masing siswa dan rumah,
dan kemudian hanya mencetak orang-orang keluar.
>> Ini adalah semacam seperti Minggu Satu, Minggu Dua hal sekarang,
di mana saya hanya ingin untuk lingkaran atau sesuatu seperti itu.
Dan aku ingin menelepon GetString beberapa kali, dan kemudian mencetak f beberapa kali.
Jadi bagaimana mungkin saya melakukan ini, meskipun, ketika kedua nama dan rumah
terlibat untuk setiap siswa?
>> Jadi insting pertama saya mungkin adalah untuk melakukan sesuatu seperti ini.
Aku mungkin pertama mengatakan, baik, beri aku, mengatakan, sebuah array dari string disebut nama.
Dan aku tidak ingin hardcode tiga di sini.
Apa yang saya ingin diletakkan di sana?
Jadi MAHASISWA, karena itu hanya konstan dinyatakan di atas,
hanya jadi saya tidak perlu hardcode tiga di banyak tempat.
Dengan cara ini, saya bisa mengubahnya satu tempat, dan itu mempengaruhi perubahan di mana-mana.
Dan kemudian, saya mungkin melakukan String rumah MAHASISWA.
>> Dan sekarang, aku mungkin melakukan sesuatu seperti for (int i = 0; i <SISWA; i ++.
Jadi aku mengetik cepat, tapi ini mungkin akrab sintaks sekarang.
>> Dan sekarang, ini lebih baru.
Jika saya ingin dimasukkan ke dalam ke-i nama siswa, saya pikir saya melakukan ini.
Dan kemudian, bukan nama tapi rumah braket i.
Saya melakukan ini, GetString, dan biarkan saya kembali dan memperbaiki baris ini.
Setuju?
Hal ini tidak sangat user-friendly.
Saya belum mengatakan kepada pengguna apa yang harus dilakukan.
>> Tapi sekarang, jika saya juga ingin nanti, mari kita
mengatakan, mencetak hal-hal ini out-- jadi TODO nanti.
Aku akan berbuat lebih banyak dengan ini-- ini bisa dibilang adalah
implementasi yang benar mendapatkan nama dan rumah, tiga
dari mereka total masing-masing, dari pengguna.
>> Tapi ini bukan desain yang sangat baik, kan?
Bagaimana jika seorang siswa memiliki bukan hanya nama dan rumah, tetapi juga nomor ID,
dan nomor telepon, dan alamat email,
dan mungkin halaman rumah, dan mungkin menangani Twitter,
dan sejumlah rincian lainnya terkait dengan siswa atau seseorang,
lebih umum.
Bagaimana kita akan mulai menambahkan fungsionalitas untuk program ini?
>> Yah, aku merasa seperti cara paling sederhana mungkin adalah untuk melakukan sesuatu seperti, katakanlah,
int id MAHASISWA.
Jadi saya bisa menyimpan semua ID mereka di sana.
Dan kemudian, untuk sesuatu seperti nomor telepon,
Saya tidak yakin bagaimana untuk menyatakan bahwa dulu.
Jadi mari kita pergi ke depan dan hanya panggilan ini Twitters MAHASISWA, yang
agak aneh, tapi-- dan banyak lebih bidang.
>> Saya sudah mulai efektif copy dan paste di sini.
Dan ini akan tumbuh cukup berat cukup cepat, kan?
Bukankah lebih baik jika ada di dunia struktur data yang dikenal
bukan sebagai int atau string, tetapi sesuatu tingkat yang lebih tinggi, abstraksi, sehingga
untuk berbicara, yang dikenal sebagai mahasiswa?
C tidak datang dengan built-in fungsi bagi siswa,
tapi bagaimana jika saya ingin memberikannya seperti itu?
>> Nah, ternyata, aku akan membuka file bernama structs.h sini,
dan Anda dapat melakukan hal itu.
Dan kita akan mulai melakukan ini sekarang.
Dan di bawah kap P Set Tiga, Anda sudah pernah melakukan hal ini sekarang.
Tidak ada hal seperti g rect atau g oval dalam bahasa pemrograman C.
>> Orang-orang di Stanford menerapkan mereka tipe data dengan menggunakan pendekatan ini di sini,
menyatakan data baru mereka sendiri jenis menggunakan kata kunci baru
disebut struct dan lain satu disebut typedef.
Dan memang, meskipun sintaks terlihat sedikit berbeda dari hal-hal
telah kita lihat sebelumnya, di prinsip, itu super sederhana.
>> Ini hanya berarti "mendefinisikan tipe."
Itu akan menjadi struktur, dan struktur
adalah seperti sebuah wadah untuk beberapa hal.
Dan struktur yang akan memiliki string disebut nama,
dan string disebut rumah.
Dan mari kita sebut, hanya untuk kenyamanan, ini seluruh struktur data siswa.
>> Jadi saat Anda bisa titik koma, Anda miliki sekarang
menciptakan data Anda sendiri Jenis yang disebut mahasiswa
yang sekarang berdiri di samping int, dan mengambang, dan char, dan string yang,
dan g rect, dan g oval, dan sejumlah hal-hal lain orang telah diciptakan.
>> Jadi apa yang berguna tentang hal ini sekarang adalah bahwa jika aku kembali
untuk struct 0 dan menyelesaikan ini implementasi, yang saya tulis
di muka sini, perhatikan bahwa semua dari kekacauan tak terelakkan bahwa
akan dimulai terjadi, karena saya menambahkan nomor telepon dan twitters dan semua
hal-hal lain untuk definisi siswa,
sekarang itu ringkas dibungkus sebagai salah satu array siswa.
>> Dan masing-masing siswa sekarang memiliki beberapa hal di dalamnya.
Sehingga hanya menyisakan satu pertanyaan.
Bagaimana Anda mendapatkan nama saja, dan rumah, dan ID,
dan apa pun yang dalam siswa?
Super sederhana, juga.
Sintaks baru, tetapi ide sederhana.
>> Anda hanya indeks ke array, seperti yang kita lakukan minggu lalu dan ini.
Dan apa jelas potongan baru sintaks?
Hanya., Yang berarti "masuk ke dalam struktur dan mendapatkan lapangan disebut
nama, mendapatkan lapangan yang disebut rumah, mendapatkan lapangan yang disebut mahasiswa. "
>> Jadi di P Set Tiga, jika Anda masih bekerja pada itu,
dan kebanyakan orang masih yang, menyadari bahwa ketika Anda
mulai menggunakan hal-hal seperti g rects dan g oval
dan hal-hal lain tampaknya yang tidak berasal dari Minggu Nol, Satu, atau Dua,
menyadari bahwa itu karena Stanford menyatakan beberapa tipe data baru.
>> Dan memang, itulah apa yang kita akan dilakukan, juga, di P Set Empat, ketika
kita mulai berurusan dengan hal-hal seperti gambar, bitmap, dan banyak lagi.
Jadi itu hanya teaser dan model mental untuk apa yang akan datang.
Sekarang, saya menunda-nunda sedikit pagi ini.
Aku agak penasaran untuk melihat apa wallpaper Microsoft benar-benar
terlihat seperti hari ini.
Dan ternyata seseorang di tahun 2006 benar-benar pergi ke hampir tepat
tempat yang sama untuk memotret dalam kenyataannya apa yang tampak seperti itu hari ini.
Bidang ini sekarang sedikit ditumbuhi.
>> Jadi berbicara sekarang gambar, mari kita membawa kembali Daven sini
pada layar dan Nicholas, dan hanya mengingatkan Anda
bahwa jika Anda ingin bergabung dengan kami untuk makan siang Jumat ini, kepala ke URL kami biasa
di sini.
>> Jadi di mana kita meninggalkan off pada hari Senin?
Kami memperkenalkan masalah ini, kan?
Ini tampaknya merupakan benar pelaksanaan swap,
dimana Anda mengambil dua int, satu disebut, yang disebut b,
swap mereka, sama seperti Laura lakukan di sini di atas panggung dengan susu dan air,
dengan menggunakan temporer variabel, atau cangkir kosong,
sehingga kita bisa menempatkan b di dan di b tanpa membuat berantakan hal.
Kami menggunakan variabel.
Ini disebut temp.
>> Tapi apa yang fundamental masalah dengan kode ini pada hari Senin?
Apa masalah di sini?
Ya.
>> AUDIENCE: Dibutuhkan lebih banyak tempat.
>> DAVID J. Malan: Membawa lebih banyak ruang, karena aku menggunakan variabel,
dan itu OK.
Itu benar, tapi aku akan mengatakan itu OK.
Ini hanya 32 bit di grand skema hal, jadi bukan masalah besar.
Pikiran lain?
AUDIENCE: Hanya swap variabel lokal.
DAVID J. Malan: Tepat.
Hanya swap variabel lokal.
Karena setiap kali Anda memanggil function-- ketika aku punya nampan dari Annenberg
terakhir kali, Anda memiliki utama di bagian bawah.
Segera setelah Anda memanggil fungsi yang disebut swap, swap tidak mendapatkan x dan y,
nilai-nilai asli.
Apa tukar get, apakah kita klaim?
AUDIENCE: Salinan.
DAVID J. Malan: Jadi salinan dari mereka.
Sehingga mendapat satu dan dua, jika Anda ingat contoh dari terakhir kali,
tapi salinan satu dan dua yang berhasil bertukar.
Tapi sayangnya pada akhirnya, nilai-nilai tersebut masih sama.
Jadi kita bisa melihat ini dengan kami teman baru, mudah-mudahan GDB,
bahwa Anda atau TF dan Ca memiliki telah membimbing Anda menuju sebagai berikut.
>> Jadi tidak ingat tukar terlihat seperti-- mari kita membuka ini-- terlihat seperti ini.
Kami diinisialisasi x satu, y dua.
Memiliki sekelompok cetak f ini.
Tapi kemudian, panggilan kunci di sini adalah untuk swap, yang
persis kode yang kami hanya melihat beberapa saat yang lalu.
Yang benar pada awalnya sekilas, tetapi secara fungsional,
Program ini tidak berhasil, karena itu tidak permanen menukar x dan y.
>> Jadi mari kita lihat ini, hangat cepat di sini dengan GDB, ./noswap a.
Sekelompok informasi yang luar biasa yang Aku akan menyingkirkan dengan Control L untuk saat ini.
Dan sekarang, aku akan maju dan menjalankannya.
Dan sayangnya, itu itu tidak berguna.
Itu berlari program dalam hal ini program yang disebut GDB, debugger,
tapi itu tidak membiarkan saya menyodok sekitar.
>> Jadi bagaimana saya bisa benar-benar berhenti eksekusi dalam program ini?
Jadi istirahat.
Dan aku bisa istirahat pada setiap nomor baris, satu, 10, 15.
Tapi saya juga dapat mematahkan simbolis dengan mengatakan istirahat utama.
Dan itu akan mengatur istirahat titik, ternyata pada baris 16 di utama.
Dan di mana garis 16?
Mari kita pergi ke kode dan pergi ke NOSWAP.
Dan memang, baris 16 adalah pertama dalam program ini.
>> Jadi sekarang, jika saya pergi ke depan dan jenis menjalankan saat ini, Enter, itu berhenti.
Jadi mari kita melihat-lihat.
Cetak x-- mengapa x nol?
Dan mengabaikan tanda dolar.
Itu hanya untuk pelamun penggunaan program.
Mengapa x nol saat ini?
Ya.
>> AUDIENCE: Itu berhenti tepat sebelum baris 16, tidak benar-benar on line 16.
DAVID J. Malan: Tepat.
GDB, secara default, telah berhenti eksekusi sebelum baris 16.
Jadi belum dieksekusi, yang berarti x adalah beberapa nilai yang tidak diketahui.
Dan kita beruntung bahwa itu sesuatu yang bersih seperti nol.
Jadi sekarang jika saya ketik selanjutnya, sekarang dieksekusi 16.
Ini menunggu saya untuk mengeksekusi 17.
Biarkan aku pergi ke depan dan mencetak x.
Itu salah satu.
Biarkan aku pergi ke depan dan mencetak y.
Apa yang harus saya lihat sekarang?
>> AUDIENCE: [Tak terdengar]
>> DAVID J. Malan: Sedikit lebih keras.
>> AUDIENCE: [Tak terdengar]
DAVID J. Malan: Tidak cukup konsensus.
Jadi ya, kita melihat beberapa nilai sampah.
Sekarang, y adalah 134514064 sana.
Yah, itu hanya beberapa nilai sampah.
Program saya menggunakan RAM untuk tujuan yang berbeda.
Ada fungsi lain.
Orang lain menulis dalam komputer saya.
Jadi mereka bit telah digunakan untuk nilai-nilai lain, dan apa yang saya lihat
adalah sisa-sisa dari beberapa digunakan sebelum memori itu.
>> Jadi bukan masalah besar, karena segera seperti yang saya ketik berikutnya dan kemudian mencetaknya y,
itu diinisialisasi ke nilai yang saya inginkan.
Jadi sekarang, mari kita pergi ke depan sedikit lebih cepat.
N untuk next.
Mari kita lakukan lagi.
Tapi aku tidak ingin memukul di sini, karena jika saya
ingin melihat apa yang terjadi di dalam swap, apa perintah?
>> AUDIENCE: langkah.
>> DAVID J. Malan: langkah.
Jadi ini langkah saya ke fungsi, bukan di atasnya.
Dan sekarang, itu sedikit samar jujur, tapi ini hanya
mengatakan aku sejalan 33 sekarang.
Dan mari kita lakukan ini lagi.
Cetak temp.
Nilai Sampah, negatif saat ini, tapi itu hanya masih nilai sampah.
Jadi mari kita lakukan selanjutnya, cetak temp.
Ini diinisialisasi ke 1, yang adalah nilai x, alias.
>> Sekarang, di mana adalah kami dan x berasal?
Nah, melihat di utama, kami disebut nilai-nilai ini x dan y.
Kami kemudian melewati mereka untuk swap sebagai berikut.
X datang lebih dulu, koma y.
Dan kemudian, tukar bisa menelepon mereka x dan y.
Tapi untuk kejelasan, itu menyebut mereka a dan b.
Tapi a dan b sekarang akan menjadi salinan x dan y masing-masing.
>> Jadi jika saya kembali ke GDB, suhu sekarang satu dan sekarang adalah salah satu.
Tapi kalau saya lakukan selanjutnya dan sekarang melakukan print a, a telah pindah.
Susu telah dituangkan ke mantan kaca jus jeruk itu, atau sebaliknya.
>> Dan jika saya lakukan selanjutnya lagi, dan sekarang jika saya mencetak sebagai sebuah pemeriksaan,
a masih dua, tapi b sekarang satu.
Terus terang, itu masih ada.
Saya tidak peduli apa temp.
Tapi begitu aku sekarang ketik, katakanlah, terus kembali, sekarang aku di akhir
program.
Dan sayangnya, x adalah masih satu dan y masih dua.
>> Jadi apa kegunaan GDB sana?
Itu tidak membantu saya memperbaiki masalah per se,
tapi mudah-mudahan membantu saya memahaminya dengan menyadari
bahwa ya, logika saya benar, tapi kode saya akhirnya tidak memiliki
dampak permanen.
Jadi itu masalah kita akan sekarang memecahkan hari ini.
>> Tapi mari kita sampai di sana dengan cara ini.
String adalah dusta.
Itu juga bukan tipe data yang ada dalam C. Ini
menjadi sinonim untuk beberapa waktu untuk sesuatu yang lain,
dan kita dapat mengungkapkan bahwa sebagai berikut.
>> Biarkan aku pergi ke depan dan membuka Program yang disebut bandingkan-0.
Dan bukan jenis yang satu ini, kita akan mulai berjalan melalui kode
Aku sudah menulis, tapi itu hanya beberapa baris.
Jadi ini bandingkan-0.
Dan hal pertama yang saya lakukan semakin baris teks.
>> Tapi perhatikan apa yang saya melakukan untuk pertama kalinya.
Apa yang berbeda dengan jelas tentang line 21?
Sebenarnya, tunggu dulu.
Ini adalah copy dua.
Itu bahkan bukan program yang tepat.
Baiklah, waspada spoiler.
Baiklah, jadi tidak pernah keberatan.
Itulah jawaban untuk pertanyaan masa depan.
>> Berikut ini adalah membandingkan-0, dan aku akan mendapatkan baris teks.
Program lebih sederhana.
Jadi ini sangat mudah.
Ini seperti Minggu Satu, Minggu Dua hal saat ini. string s = GetString.
Sekarang, saya mengatakannya lagi di sini.
String t = GetString.
Dan kemudian, hal terakhir dalam Program, seperti namanya,
adalah aku akan mencoba untuk membandingkan mereka.
>> Jadi jika s, string pertama, sama = t, maka aku
akan mengatakan Anda mengetik hal yang sama.
Lain, aku akan mengatakan Anda mengetik hal yang berbeda.
Jadi mari kita mengkompilasi dan menjalankan program ini.
Jadi membuat bandingkan nol.
Terlihat bagus.
Tidak ada kesalahan kompilasi.
>> Biarkan aku pergi ke depan sekarang dan ketik ./compare-0.
Biarkan aku pergi ke depan dan mengatakan sesuatu : Daven dan sesuatu: Rob.
Dan saya ketik hal yang berbeda.
Sejauh ini, begitu baik.
Program tampaknya benar.
>> Tapi mari kita jalankan lagi.
Katakan sesuatu: Gabe.
Baiklah.
Mungkin aku memukul spasi atau sesuatu yang funky.
Mari kita lakukan lagi.
Jadi Zamyla.
Zamyla.
Hal yang berbeda.
Jadi apa yang terjadi?
>> Jadi kita memiliki dua baris kode, GetString dipanggil dua kali.
Dan kemudian, aku hanya mencoba untuk membandingkan dan t.
Tapi apa yang benar-benar kemudian yang terjadi?
Nah, tulisan tangan saya akan membantai contoh ini agak.
Dan mari kita benar-benar membuang hal ini di sini, juga.
>> Jadi kita memiliki garis seperti string s = GetString.
Jadi itu hanya yang pertama garis yang menarik dari program itu.
Tapi apa selama ini telah terjadi di bawah tenda?
Nah, di sebelah kiri sisi string, yang merupakan beberapa jenis variabel,
dan itu disebut s.
Jadi saya tahu bahwa ini menggunakan memori, atau RAM, di komputer saya entah bagaimana.
Jadi aku akan abstrak menarik bahwa sebagai persegi.
32 bit, ternyata, tapi lebih pada bahwa di masa depan.
Dan kemudian, apa yang terjadi di sini?
>> Nah, GetString jelas mendapat string dari pengguna.
Dan GetString mendapat Zamyla atau Gabe atau Daven.
Jadi mari kita memilih yang pertama dari mereka, yang Daven.
Jadi secara efektif, apa GetString punya saya dalam kasus pertama adalah D-a-v-e-n.
Dan kemudian, apa lagi melakukan itu memberi saya diam-diam?
AUDIENCE: [Tak terdengar]
DAVID J. Malan: Ya, yang / 0 atau null karakter.
Jadi secara efektif memberi saya string.
Tapi kita sudah tahu sebelumnya terlihat bahwa string hanya sebuah array
karakter, dan itu diakhiri oleh ini karakter sentinel khusus, / 0.
>> Tapi jika hal ini benar dan ini adalah persegi,
ini jelas merupakan persegi panjang yang jauh lebih besar.
Dan memang, ini adalah, Saya mengklaim, hanya 32 bit.
Dan ini jelas lebih dari 32 bit, karena ini mungkin
delapan ditambah delapan ditambah delapan ditambah delapan ditambah delapan,
hanya karena byte ASCII.
Bagaimana sih kita akan cocok Daven ke dalam kotak kecil di sini?
>> Nah, apa yang GetString lakukan sebenarnya?
Nah, jaringan ini di sini mewakili memori komputer saya atau RAM.
Jadi mari kita sewenang-wenang mengatakan bahwa jika masing-masing mewakili byte,
maka kita bisa memikirkan setiap byte sebagai memiliki alamat,
seperti 33 Oxford Street, atau 34 Oxford Street, atau 35 Oxford Street.
>> Jadi sama seperti rumah memiliki alamat dan bangunan yang memiliki alamat,
begitu bytes individu memori memiliki alamat atau nomor
yang secara unik mengidentifikasi mereka.
Sekarang, ini adalah sewenang-wenang.
Tetapi untuk tetap sederhana, aku akan menggunakan heksadesimal hanya dengan konvensi,
tapi 0x berarti tidak lain daripada "ini adalah heksadesimal."
dan aku akan mengklaim bahwa "D" berakhir di Byte Satu dalam memori.
>> Aku punya apa-apa lagi terjadi di memori, sehingga Daven mendapat tempat pertama
di Byte One.
Ini, kemudian, akan menjadi 0x2.
Ini akan 0x3.
Ini akan menjadi 0x4.
Ini akan 0x5.
Ini akan menjadi 0x6.
>> Tapi begitu Anda mulai berpikir tentang apa yang dilakukan komputer
di bawah tenda, Anda dapat mulai untuk menyimpulkan
bagaimana Anda, beberapa tahun yang lalu, akan telah menerapkan C itu sendiri.
Apa itu GetString mungkin returning-- karena
terasa seperti itu tidak kembali Daven, per se,
karena dia pasti tidak akan untuk cocok box-- kecil ini
jadi apa yang GetString mungkin kembali?
>> AUDIENCE: [Tak terdengar]
>> DAVID J. Malan: Lokasi Daven.
Dan itu sudah melakukan hal ini sejak Minggu Satu.
Apa GetString benar-benar kembali tidak string, per se.
Itulah salah satu kebohongan putih kecil.
Ini mengembalikan alamat string dalam memori, alamat yang unik.
Daven tinggal di 33 Oxford Street.
Tapi lebih ringkas, Gavin hidup pada 0x1, Alamat Number One.
>> Jadi apa yang akan dimasukkan ke dalam ini kotak kecil itu, harus jelas,
hanya alamat string.
Jadi selama ini, ini memiliki sudah berlangsung.
Tapi apa ini mengisyaratkan sekarang adalah bahwa jika semua s memiliki
adalah nomor di dalamnya, siapa yang untuk menghentikan Anda, programmer,
dari menempatkan sejumlah di variabel dan hanya melompat
itu sepotong memori?
Dan memang, kita akan melihat itu ancaman waktu berikutnya.
>> Tapi untuk saat ini, ini terasa tidak cukup.
Jika saya mengatakan, ambilkan String, Anda memberi saya Daven.
Tapi Anda tidak benar-benar memberi saya Daven.
Semua yang anda berikan alamat Daven ini.
Bagaimana Saya kemudian tahu pasti mana Daven dimulai dan ends--
cerita mendapatkan weird-- mana Daven dimulai dan berakhir,
dan kemudian, berikutnya string dalam memori dimulai?
>> Nah, jika Anda menyerahkan saya awal Daven,
pada dasarnya, bagaimana saya tahu di mana akhir namanya?
Itu karakter null khusus, yang semua lebih penting sekarang
jika string bawah hood hanya diidentifikasi
unik oleh lokasi mereka dalam memori.
Jadi selama ini, itu apa yang telah terjadi.
>> Jadi ketika kita melihat sekarang di kode di sini, menjelaskan
jika Anda mau bug sejalan 26.
Mengapa Zamyla dan Zamyla berbeda?
Mengapa Gabe dan Gabe yang berbeda?
Ya, di belakang.
>> AUDIENCE: Mereka memiliki alamat yang berbeda.
>> DAVID J. Malan: Hanya karena mereka memiliki alamat yang berbeda.
Karena ketika Anda menelepon GetString lagi, yang saya akan lakukan dengan cepat di sini,
jika ini adalah baris kedua, tali t, seperti yang saya lakukan dalam program itu,
sama panggilan lain untuk GetString.
Lain kali saya sebut GetString, aku akan
untuk mendapatkan sepotong memori yang berbeda.
>> GetString diperbolehkan untuk meminta operasi
sistem untuk lebih dan lebih banyak memori.
Ini tidak akan menggunakan kembali sama enam bytes setiap saat.
Ini akan mendapatkan baru sepotong memori, yang
berarti t akan mendapatkan beberapa nilai lain di sini.
>> Jadi ketika saya lakukan s sama = t, Anda tidak membandingkan
D melawan ini dan A melawan ini dan V terhadap ini.
Anda membandingkan ini terhadap hal ini, yang
terus terang useless-- cukup useful-- sangat berguna, karena yang benar-benar
peduli di mana string dalam memori?
>> Dan memang, kita tidak.
Dan kita tidak akan mulai sangat peduli.
Hanya sejauh bahwa bug dapat muncul dan ancaman keamanan bisa timbul akan
kita benar-benar mulai untuk peduli tentang hal ini.
Jadi mari kita memperbaiki masalah ini.
Ternyata, Anda memperbaikinya super sederhana.
>> Dan mari kita sebenarnya, sebelum aku mengungkapkan bahwa lagi, apa yang akan
Anda lakukan jika di kelas CS50, dan Anda harus menerapkan
perbandingan terhadap dua string.
Anda jelas tidak bisa hanya menggunakan s sama = t.
Tapi secara logis, bagaimana akan Anda membandingkan string ini
terhadap string ini menggunakan kode C?
Ya.
>> AUDIENCE: do Hanya untuk loop [Tak terdengar]
DAVID J. Malan Perfect.
AUDIENCE: [Tak terdengar]
DAVID J. Malan: Ya.
Hanya menggunakan untuk loop atau while loop atau apa pun.
Tapi hanya menerapkan ide dasar bahwa jika ini adalah sepotong memori atau array
dan ini, iterate atas baik pada saat yang sama.
Dan hanya membandingkan huruf.
>> Dan Anda harus menjadi sedikit berhati-hati, karena Anda
tidak mau satu jari untuk melewati yang lain
karena salah satu string panjang dari yang lain.
Jadi, Anda akan ingin untuk memeriksa nilai ini khusus di akhir, null.
Tapi itu benar-benar, di end, sesederhana itu.
Dan terus terang, kita tidak perlu untuk menemukan kembali roda itu.
Berikut adalah Versi Dua.
Dan apa yang akan saya katakan di sini adalah bahwa bukannya membandingkan s sama = t,
Aku bukannya akan mengatakan, apakah string perbandingan s koma t sama = 0.
Sekarang, apa yang tali bandingkan?
>> Ternyata, itu adalah fungsi yang dilengkapi dengan C, yang tujuannya dalam hidup
adalah untuk membandingkan dua string.
Dan aduk membandingkan, jika kita membaca nya halaman manual atau dokumentasi atau CS50
referensi, maka akan hanya memberitahu Anda bahwa aduk
bandingkan kembali baik negatif nomor atau angka positif atau nol,
di mana nol berarti mereka sama.
>> Jadi hanya dugaan.
Apa yang mungkin artinya jika aduk kembali bandingkan
nilai negatif atau nilai positif?
AUDIENCE: Lebih besar dari atau kurang dari.
DAVID J. Malan: Ya, lebih besar dari atau kurang dari.
Jadi jika Anda ingin menyortir keseluruhan sekelompok string di dictionary-- sebuah
seperti yang kita akhirnya akan turun road-- yang fungsi yang sempurna untuk digunakan berpotensi,
karena itu akan melakukan itu perbandingan string untuk Anda, dan memberitahu
Anda melakukan datang sebelum b, atau tidak b datang sebelum abjad.
Kita dapat melakukan hal itu.
>> Dan pemberitahuan saya lakukan yang lain hal dalam contoh ini.
Apa lagi telah berubah lebih tinggi up dalam fungsi utama ini?
Char *.
Dan ini adalah bahwa kebohongan putih lainnya.
Selama ini, ketika Anda sudah dipilih string yang menulis,
kami telah diam-diam menulis ulang string sebagai char * sehingga dentang sebenarnya
mengerti Anda.
>> Dengan kata lain, di CS50.h dan seperti yang kita akhirnya akan melihat,
kami membuat sinonim disebut string itu hal yang sama seperti char *.
Dan untuk saat ini, hanya tahu bahwa *, Dalam konteks ini, setidaknya,
berarti alamat.
>> Alamat apa?
Nah, fakta bahwa aku berkata char *, dan tidak int * atau float *,
berarti bahwa char * adalah alamat char.
Jadi kotak kecil di sini, alias String, benar-benar tipe char *,
yang hanya merupakan cara mewah mengatakan, dalam kotak ini akan alamat.
Dan apa alamat yang mengacu pada?
Rupanya, char.
>> Tapi kita bisa benar-benar memiliki int * dan hal-hal lain.
Tapi untuk saat ini, char * benar-benar yang paling mudah dan salah satu yang menarik.
Jadi masalah ini akan meningkat, meskipun, lagi.
>> Misalkan saya membuka program ini.
Mari kita lihat apakah sekarang kita dapat memprediksi apa yang salah dengan kode ini.
Jadi dalam program ini, copy-0, aku akan pergi ke depan dan lagi panggilan
GetString dan menyimpan nilai dalam s.
>> Dan kemudian, mengapa aku melakukan ini, hanya sebagai pengingat dari minggu terakhir?
Kami memang mengatakan bahwa GetString kadang-kadang mengembalikan null.
Apa artinya jika GetString kembali null?
Sesuatu yang salah.
Ini mungkin berarti string terlalu besar, dari komputer memori.
Hal ini terjadi super, super, super jarang, tapi itu bisa terjadi.
Kami ingin memeriksa untuk itu, dan itu semua kita lakukan.
>> Karena kita akan lihat sekarang, jika Anda tidak mulai memeriksa terbiasa untuk hal-hal
seperti null, Anda mungkin benar-benar mulai untuk pergi
ke alamat di memori yang tidak valid.
Dan Anda akan mulai mendorong semakin banyak kesalahan segmentasi.
Atau di Mac atau PC, hanya menyebabkan komputer hang
atau program untuk membekukan, berpotensi.
>> Jadi sekarang, saya menyatakan di copy-0.c, bahwa saya saya akan menyalin string ini dengan cara
dari baris 28.
Dan kemudian, aku akan untuk mengklaim di bagian bawah
di sini bahwa aku akan untuk mengubah salah satu dari mereka.
>> Jadi melihat ini.
Saya menelepon teman strlen lama kita.
Dan hanya menjelaskan dalam bahasa Inggris apa baris ini 34 lakukan?
Apa t braket 0 mewakili di sebelah kiri.
Ya.
>> AUDIENCE: Karakter pertama dari t?
DAVID J. Malan: Karakter pertama dari t.
Itu saja.
Karakter pertama dari t, saya ingin untuk menetapkan versi huruf besar
dari karakter pertama di t.
Jadi ini adalah memanfaatkan huruf pertama.
Dan kemudian, hal terakhir yang saya lakukan dalam program ini adalah saya mengklaim inilah
asli, s, dan inilah salinan, t.
>> Namun berdasarkan cerita kita hanya menceritakan tentang apa string sebenarnya,
apa baris 28 benar-benar lakukan, dan apa yang
bug yang dihasilkan akan berada di layar?
>> Jadi pertama, pertanyaan pertama, 28.
Apa yang tali t = s benar-benar lakukan?
Jika kita memiliki di kiri sisi sini tali t = s;
yang memberikan saya satu kotak di sini dan satu kotak di sini.
Dan misalkan alamat ini 0x, katakanlah, 50 kali ini, sewenang-wenang.
Apa tali t = s dilakukan di bawah tenda?
>> AUDIENCE: [Tak terdengar]
>> DAVID J. Malan: Ini menyimpan memori alamat di sana, jadi 0x50 pergi ke sana.
Jadi jika sekarang, saya pergi ke pertama karakter dalam t dan huruf besar itu,
apa yang saya lakukan untuk secara efektif s?
Aku benar-benar melakukan hal yang sama, kan?
Karena jika Alamat 0x50-- dan adil, saya tidak memiliki banyak ruang di papan sini,
tetapi menganggap bahwa ini 0x50 di sini, di suatu tempat di memori komputer saya.
>> Dan saya, misalnya, Gabe di huruf kecil di sini, seperti ini.
Dan saya telah mengatakan t braket 0 akan dikapitalisasi.
Nah, t braket 0 adalah huruf pertama dalam t.
Jadi sedikit g akan menjadi besar G. Tapi masalahnya
adalah, apa s juga menunjukkan?
>> AUDIENCE: Hal yang sama.
>> DAVID J. Malan: Hal yang sama persis.
Jadi penjelasan sederhana mungkin, bahkan jika sintaks ini sedikit aneh.
Jadi mari kita lakukan ini.
Membuat copy-0 dan kemudian ./copy-0.
Katakan sesuatu: Gabe.
Dan sayangnya, kedua mereka kini telah dikapitalisasi,
tetapi untuk itu mendasari Alasan bahwa kita hanya
sekarang berurusan dengan alamat.
>> Jadi bagaimana kita mulai address-- no pun intended--
bagaimana kita mulai untuk mengatasi masalah khusus ini?
Nah, di copy1.c, hal tersebut terjadi untuk mendapatkan sedikit lebih rumit.
Tapi aku akan mengklaim solusi konseptual sederhana.
>> Jadi sulit untuk mendapatkan pada pandangan pertama.
Tidak akan mudah untuk pertama kali Anda mengetik itu, mungkin,
tetapi jika masalahnya adalah bahwa hanya melakukan t = s hanya
salinan alamat, apa, lagi jika saya bisa memilih pada Anda,
akan menjadi solusi untuk benar-benar menyalin string?
>> AUDIENCE: Kami mungkin aku akan menggunakan loop lagi.
>> DAVID J. Malan: Ya.
Jadi kita akan membutuhkan loop lagi.
Dan karena jika kita ingin menyalin string s ke dalam string lain,
kita mungkin ingin melakukannya karakter demi karakter.
Tapi masalahnya adalah, jika ini awalnya s,
sekarang kita harus mulai secara eksplisit mengalokasikan memori untuk t.
>> Dengan kata lain, mari kita redraw ini untuk terakhir kalinya.
Jika ini adalah string s = GetString.
Dan mari kita menempatkan ini di sini, juga.
Ini adalah GetString.
Dan kemudian, gambar untuk sesuatu seperti itu akan menjadi seperti sebelumnya,
g-a-b e / 0.
Itu terlihat sedikit sesuatu seperti ini.
Dan s oleh karena itu, kita sebut ini 0x50, dan itu akan menjadi 51, 52.
>> Jadi ini adalah 0x50.
Dan kemudian, aku tali t.
Dalam memori, itu hanya akan memberi saya persegi kecil seperti ini.
Jadi apa langkah kunci sekarang?
Jika saya ingin menyalin s ke t, apa kosong kita perlu mengisi sini?
Atau apa yang kita butuhkan untuk dilakukan pada tingkat tinggi?
Ya?
Seseorang?
Ya.
>> AUDIENCE: Kita perlu [Tak terdengar].
DAVID J. Malan: Ya, kami perlu mengisi kosong ini.
Aku tidak bisa copy dan kemudian memanfaatkan nama Gabe
sampai aku bertanya sistem operasi untuk potongan lain dari memori
itu setidaknya sama besar seperti aslinya.
Sehingga meninggalkan kita dengan pertanyaan.
>> Bagaimana cara meminta sistem operasi tidak hanya untuk pointer-- kecil sederhana
karena hal ini disebut, sebuah alamat, sebuah pointer-- tidak
untuk kotak kecil sederhana seperti ini disebut string?
Bagaimana cara meminta operasi sistem untuk sebagian besar dari memori?
Sejauh ini, aku hanya mendapatkan itu kembali secara tidak langsung dengan menelepon GetString.
Jadi bagaimana GetString bahkan mendapatkan memori?
>> Nah, ternyata ada fungsi ini lain di sini
bahwa kita sekarang akan mulai menggunakan.
Sekarang, ini terlihat than-- cara yang lebih samar dan saya satu-satunya yang dapat melihat itu--
baris ini terlihat jauh lebih samar maka seharusnya pada pandangan pertama.
Tapi mari kita menggoda terpisah.
>> Di sisi kiri, saya memiliki char * t.
Jadi dalam bahasa Inggris, mari kita mulai untuk merumuskan kalimat yang tepat dalam jargon teknis.
Jadi ini mengalokasikan variabel tipe char * disebut t.
Sekarang, apa yang benar-benar berarti?
>> Nah, itu berarti, apa yang akan saya untuk dimasukkan ke dalam variabel ini disebut t?
Sebuah alamat char.
Jadi itu hanya sederhana, cara yang lebih masuk akal
menggambarkan sisi kiri.
Sehingga menciptakan kotak ini di sini saja.
Jadi sisi kanan, mungkin, akan
untuk mengalokasikan bahwa lebih besar sepotong memori bagaimana?
Jadi mari kita menggoda ini terpisah.
>> Ini berlebihan pada pandangan pertama, tapi apa yang terjadi di dalam sini?
Pertama, ada malloc, yang tampaknya teman baru kami,
"Memori mengalokasikan."
Jadi ini adalah argumen yang berlalu ke dalamnya, jadi itu adalah argumen yang cukup besar.
Jadi mari kita menggoda ini terpisah.
>> strlen dari s, tentu saja, merupakan yang--
AUDIENCE: Jumlah karakter.
DAVID J. Malan: Hanya jumlah karakter dalam s.
Jadi panjang s, string asli.
Jadi G-a-b-e.
Jadi itu mungkin empat dalam kasus ini.
Mengapa saya melakukan +1 setelah memanggil strlen dari s?
AUDIENCE: [Tak terdengar]
DAVID J. Malan: Untuk itu karakter null khusus.
Jika Anda bertanya kepada saya apa panjang Nama Gabe, saya akan mengatakan empat.
Di bawah kap mesin, meskipun, saya perlu bahwa byte kelima untuk karakter null.
Jadi itu sebabnya aku melakukan +1 tersebut.
>> Sekarang hanya dalam kasus Anda menjalankan ini Program pada komputer selain, mengatakan,
alat CS50, di mana ukuran char
mungkin berbeda dari computer-- saya sendiri
Ternyata saya bisa menyebutnya Operator sizeof, hanya meminta komputer,
apa ukuran char di di komputer ini?
>> Dan dengan mengalikan lima ini misalnya dengan ukuran char, yang
pada kebanyakan komputer akan hanya menjadi satu, malloc
akan mengalokasikan bagi saya ini besar sepotong memori di sini di sebelah kanan.
Dan itu akan return-- itu adalah function-- sehingga sangat
akan kembali kepada saya apa?
AUDIENCE: Alamat?
DAVID J. Malan: Alamat apa?
AUDIENCE: Dari memori itu dialokasikan?
DAVID J. Malan: Dari memori yang dialokasikan.
Jadi saya tidak tahu, terus terang, di mana ini akan berakhir.
Aku akan mengusulkan bahwa itu akan berakhir di 0x88.
Benar-benar sewenang-wenang, tetapi tempat lain selain 0x50,
karena sistem operasi, apa Windows dan Mac OS lakukan untuk saya, adalah
pastikan bahwa itu memberi saya potongan yang berbeda dari RAM.
>> Jadi, ini adalah nilai di mana hal ini sepotong memori mungkin berakhir.
Jadi ini adalah apa yang berakhir di sini, 0x88.
Jadi sekarang jelas, aku bisa mengerti bahwa ini tidak sama dengan ini,
karena mereka menunjuk potongan memori yang berbeda.
Jadi jika sekarang saya benar-benar ingin menyalin ini in, mari kita lakukan solusi yang diusulkan Anda.
>> Mari kita pergi, membuat untuk loop, dan melakukan t braket i mendapat s braket i.
Karena sekarang saya dapat menggunakan array seperti notasi ini,
karena meskipun malloc sangat umum mengalokasikan saya memori,
memori byte hanya bersebelahan.
Byte, byte, byte, kembali ke belakang ke belakang.
>> Aku bisa pasti sebagai programmer memperlakukannya sebagai sebuah array, yang
berarti saya bisa menggunakan ini akhirnya akrab notasi hanya beberapa tanda kurung siku.
>> Jadi biarkan aku berhenti di sana, karena ini banyak sekaligus, bahkan
meskipun ide dasar untuk rekap adalah string yang, selama ini,
bukan tipe data baru per se.
Ini hanya disebut pointer, alamat dari karakter,
yang hanya berarti itu nomor bahwa oleh konvensi manusia
kita cenderung untuk menulis sebagai 0x sesuatu.
>> Tapi itu hanya nomor, seperti 33 Oxford Street,
yang akan terjadi pada Alamat CS bangunan.
Setiap pertanyaan pada detil ini?
Ya?
>> AUDIENCE: Mengapa kita memeriksa untuk t sama dengan null?
>> DAVID J. Malan: Mengapa kita memeriksa t sama dengan null?
Jika kita membaca documentation-- yang question-- besar untuk malloc,
itu akan berkata dalam baik cetak, kadang-kadang malloc akan kembali null,
seperti GetString.
Dan memang, GetString null jika, pada gilirannya, malloc kembali null,
karena GetString menggunakan malloc.
>> Dan yang mungkin terjadi jika OS, Mac OS, Windows, apa pun, hanya
dari memori untuk Anda.
Jadi itulah yang terjadi di sana.
>> Dan biarkan aku mengungkapkan satu hal lain yang hanya mungkin meniup pikiran Anda
atau benar-benar terlalu jauh melewati garis.
Tapi biarkan aku naikkan sama untuk loop untuk menyalin,
yang beberapa saat yang lalu, ingat itu ini. t braket i mendapat s braket i.
>> Bagus dan user-friendly.
Terasa seperti Week Dua lagi.
Tapi versi ini sebenarnya dapat ditulis ulang karena hal ini, yang terlihat samar.
Ini adalah teknik yang disebut pointer aritmatika, alamat aritmatika.
Tapi mengapa ini bekerja?
>> Sekarang mengganggu, yang penulis C memutuskan untuk menggunakan
simbol * untuk tujuan yang berbeda.
Kami telah melihat sudah digunakan sekali, char *, yang berarti "beri aku variabel
itu akan berisi alamat char. "
* Jadi arang dalam konteks itu berarti "beri aku variabel."
>> Sayangnya, jika Anda menggunakan * tanpa kata di depannya, seperti char,
itu sekarang disebut dereference operator.
Dan kita akan melihat lebih banyak dari ini sebelum lama.
Tapi itu hanya berarti "pergi ke sana."
Ini seperti mengatakan, jika seseorang menyerahkan pada selembar kertas "33 Oxford Street,"
jika saya melakukan "* 33 Oxford Street," yang berarti "Pergi di jalan ke gedung CS."
>> Jadi * hanya berarti pergi ke sana jika tidak ada kata di depannya.
Jadi apa t, harus jelas?
t adalah alamat dari bongkahan memori yang diberikan kembali kepada saya.
s adalah alamat apa, harus jelas, dalam contoh kita diskusikan,
dari gabe huruf kecil?
s adalah alamat of--
AUDIENCE: String.
DAVID J. Malan: Dari nama asli Gabe.
Jadi alamat potongan ini memori.
Jadi jika saya katakan t + i-- i, pemberitahuan, hanya teman lama kami.
Ini hanya variabel indeks yang iterasi dari nol ke atas
dengan panjang string s.
Jadi itu akan menjadi nol, lalu satu, kemudian dua, kemudian tiga, lalu empat.
Jadi mari kita merakit ini baru Potongan puzzle Scratch-seperti, jika Anda mau,
meskipun, sekali lagi, sintaks jauh lebih misterius dari Scratch.
Jadi t adalah alamat + i akan memberi saya
nomor, karena ini semua angka yang kita sudah menggambar sebagai hex.
Tapi mereka hanya angka.
>> Jadi jika alamat t kita katakan adalah 0x88, 0x88 apa ditambah nol.
Bahkan jika Anda tidak nyaman dengan hex lagi, mengambil menebak.
>> AUDIENCE: asli.
>> DAVID J. Malan: Masih 0x88.
Jadi apa * 0x88 artinya?
Artinya, "pergi ke sana" yang berarti efektif, "meletakkan jari Anda di sini."
Dan sekarang di sisi kanan ungkapan ini, * dan kemudian di parens,
s + i berarti s, yang merupakan alamat sampai di sini dari g kecil.
s + 0, tentu saja, s, apa pun s.
>> Jadi sekarang, itu * s, yang seperti * 33 Oxford Street berarti pergi ke alamat
s.
Jadi, inilah jari ini, tangan kanan.
Jadi apa yang saya akan menyalin menjadi apa?
Hal di sebelah kanan, yang gabe, sedikit g sini, ke sini.
>> Jadi efek yang iterasi pertama dari loop,
Anda diusulkan, meskipun tampak gila lebih rumit dari apa pun
telah kita lihat sebelumnya, hanya mengatakan pergi di sini dan menyalin karakter itu di sini.
Ini memberikan Anda peta untuk kedua lokasi.
>> Dan kita akan melihat jauh lebih dari ini.
Tapi untuk saat ini, harapan adalah hanya untuk memperkenalkan beberapa dari ide-ide dasar.
Dan memang, mari kita lihat satu program akhir di sini,
dan kemudian claymation yang dijanjikan, yang akan membuat semuanya baik-baik.
Baiklah.
Jadi biarkan aku membuka up-- sana kami pergi.
Jadi mari me-- kami akan kembali gambar ini sebelum lama.
Mari saya membuka contoh terakhir ini di sini.
>> Jadi di sini adalah super, super Program yang menyelesaikan
tidak ada dalam hidup yang tidak berikut.
Ini pertama menyatakan dua variabel, x dan y, yang bukan angka saat ini,
per se.
Mereka tidak bilangan bulat, per se.
Mereka tampaknya int *.
Jadi sembarang orang, apa artinya jika tipe data Anda, variabel Anda,
adalah tipe int * bintang?
Itulah alamat int.
>> Jadi aku tidak tahu di mana itu belum.
Itu hanya berarti "menempatkan, akhirnya, alamat int sini. "
0x50, 0x88, di mana pun di memori, alamat yang pergi ke sana.
Dan itulah yang y adalah akan, juga.
>> Jika saya sekarang mengatakan x = malloc (sizeof (int)), ini adalah cara mewah mengatakan,
hey sistem operasi, melalui malloc, memberi saya cukup memori untuk ukuran
dari int, yang mungkin akan menjadi 32 bit atau empat byte.
>> Jadi apa malloc kembali?
Malloc mengembalikan alamat.
Jadi apa yang akan bisa disimpan dalam x?
Alamat dari sepotong memori, empat byte, malloc yang
hanya ditemukan untuk saya dengan meminta sistem operasi.
>> Sekarang sementara itu, garis empat di sini, * x = 42.
Hanya untuk menjadi jelas, apa yang terjadi di sana?
Di sisi kiri, * x.
itu seperti * 33 Oxford Street.
Jadi * x berarti apa?
>> AUDIENCE: Ke.
>> DAVID J. Malan: Ke alamat itu.
Dimanapun yang sepotong memori, pergi untuk itu.
Dan menempatkan apa di sana, jelas?
AUDIENCE: 42.
DAVID J. Malan: 42.
Baiklah, * y, ide yang sama.
Pergi ke alamat di y.
Masukan nomor 13 di sana, tapi apa y saat ini?
AUDIENCE: Tidak ada memori untuk y.
DAVID J. Malan: Ada ada memori untuk y.
Jadi, apa y mungkin berisi, seperti yang kita telah mengatakan?
>> AUDIENCE: Sampah.
>> DAVID J. Malan: Beberapa nilai sampah.
Sekarang, nilai sampah masih nomor.
Masih bisa salah untuk alamat.
Seolah-olah seseorang menuliskan sesuatu,
dan saya disalahtafsirkan sebagai berarti beberapa bangunan di jalan.
Dan jika Anda hanya mencoba untuk masuk ke beberapa bangunan yang bukan milik,
atau sepotong memori Anda belum telah diberikan, hal-hal buruk yang mungkin terjadi.
Komputer mungkin crash, atau beberapa lainnya perilaku ditentukan mungkin terjadi.
>> Jadi intro, kemudian, untuk Binky adalah ini.
Saya masih ingat, 20 beberapa tahun ganjil kemudian,
di mana saya adalah ketika saya akhirnya dipahami pointer.
>> Yang mengatakan, jika Anda pergi dari sini dalam tiga menit
dan berpikir saya tidak memahami pointer, menyadari
Saya ingat selama 20 tahun untuk beberapa alasan gila
kapan dan mengapa akhirnya tenggelam di, duduk dengan mengajar saya
sesama, Nishat Mehta di belakang Eliot Dining Hall.
Sekarang, saya sudah ingat ini karena ini adalah
salah satu topik I, di khususnya, berjuang dengan.
Dan kemudian, akhirnya diklik, seperti saya berani mengatakan banyak topik
akhirnya akan.
Dan sekarang, untuk membuat merasa semua bahagia dan semua lebih meyakinkan,
mari kita lihat akhir di kami tiga menit terakhir di sini di Binky,
dari teman kita, Nick Parlante dari Stanford.
>> [VIDEO PEMUTARAN]
>> Hei, Binky.
Bangun!
Sudah waktunya untuk pointer menyenangkan.
>> Apa itu?
Pelajari tentang pointer?
Oh, goody!
>> Nah, untuk memulai, saya kira kita akan membutuhkan beberapa petunjuk.
>> -OK.
Kode ini mengalokasikan dua pointer, yang dapat menunjukkan bilangan bulat.
-OK.
Yah, saya melihat dua pointer, tetapi mereka tampaknya tidak akan menunjuk ke sesuatu.
>> -Itu Benar.
Awalnya, pointer tidak menunjukkan apa pun.
Hal-hal yang mereka menunjuk ke disebut pointees, dan pengaturan mereka ini
langkah terpisah.
>> Oh, benar, benar.
Saya tahu itu.
The pointees terpisah.
Er, jadi bagaimana Anda mengalokasikan Pointee sebuah?
>> -OK.
Nah, kode ini mengalokasikan sebuah Pointee bilangan bulat baru,
dan ini bagian set x untuk menunjuk ke itu.
>> Hei, yang terlihat lebih baik.
Jadi membuatnya melakukan sesuatu.
>> -OK.
Aku akan dereference pointer x ke menyimpan nomor 42 ke Pointee nya.
Untuk trik ini, saya perlu saya Magic Wand of dereferencing.
>> -Anda Magic Wand dari Dereferencing?
Itu-- itu bagus.
>> Ini adalah apa kode terlihat seperti.
Aku hanya akan mengatur jumlah, dan [POP]
>> Hei, lihat.
Ada kelanjutannya.
>> -Jadi Melakukan dereference pada x berikut panah untuk mengakses Pointee nya.
Dalam hal ini, toko 42 di sana.
Hei coba gunakan untuk menyimpan nomor 13 melalui pointer lain, y.
>> -OK.
Aku hanya akan pergi ke sini untuk y, dan mendapatkan nomor 13 set up.
Dan kemudian, mengambil Tongkat Dereferencing dan hanya [BUZZ]
>> Oh!
>> Oh, hey!
Itu tidak berhasil.
Katakanlah, Binky, saya tidak berpikir dereferencing y adalah ide yang baik, karena Anda tahu,
menyiapkan Pointee yang merupakan langkah yang terpisah.
Dan saya tidak berpikir kita pernah melakukannya.
>> Titik Bagus.
Ya.
Kami dialokasikan pointer y, tapi kami tidak pernah mengaturnya untuk menunjuk ke sebuah Pointee.
>> -Sangat Jeli.
Hei, kau tampak baik di sana, Binky.
Dapatkah Anda memperbaikinya sehingga y poin ke Pointee sama dengan x?
>> -Tentu.
Aku akan menggunakan saya Magic Wand Pointer Penugasan.
>> -Apakah Bahwa akan masalah seperti sebelumnya?
Tidak.
Ini tidak menyentuh pointees.
Ini hanya perubahan satu pointer ke menunjuk ke hal yang sama seperti yang lain.
>> Oh, saya melihat.
Sekarang y menunjuk ke tempat yang sama seperti x.
Jadi menunggu.
Sekarang, y adalah tetap.
Memiliki Pointee a.
Jadi, Anda dapat mencoba Tongkat Dereferencing lagi untuk mengirim 13 lebih.
>> Uh, OK.
Di sini ia pergi. [POP]
>> Hei, lihat itu.
Sekarang dereferencing bekerja pada y.
Dan karena pointer berbagi yang satu Pointee, mereka berdua melihat 13.
Ya.
Berbagi, apa pun.
Jadi kita akan bertukar posisi sekarang?
>> Oh, lihat.
Kami kehabisan waktu.
>> -But--
>> -Hanya Mengingat tiga aturan pointer.
Nomor Satu, struktur dasar adalah bahwa Anda memiliki pointer,
dan menunjuk ke sebuah Pointee.
Tapi pointer dan Pointee terpisah,
dan kesalahan umum adalah untuk mengatur pointer,
tetapi lupa untuk memberikan Pointee a.
>> Nomor Dua, pointer dereferencing dimulai pada pointer
dan mengikuti panah yang lebih untuk mengakses Pointee nya.
Seperti yang kita semua tahu, ini hanya bekerja jika ada
sebuah Pointee, yang jenis akan kembali ke Peraturan Nomor Satu.
>> Number Three, pointer tugas mengambil satu pointer
dan perubahan itu untuk menunjuk ke Pointee sama dengan pointer lain.
Jadi setelah tugas, dua pointer
akan mengarah ke Pointee yang sama.
Kadang-kadang, yang disebut berbagi.
Dan itu semua ada untuk itu, benar-benar.
Bye-bye sekarang.
[END VIDEO PUTAR]
DAVID J. Malan: Itu saja untuk CS50.
Kita akan melihat Anda minggu depan.