>> [MUZIK bermain]
DAVID J. MALAN: Baiklah.
Ini adalah CS50, dan ini adalah akhir Minggu Empat.
Dan salah satu topik hari ini ialah forensik digital,
seni pulih maklumat.
Dan memang, walaupun anda di tengah
sekarang Damai di Three dan Breakout, minggu depan,
tumpuan akan diberikan pada tepat domain ini.
>> Jadi salah satu pekerjaan yang paling sejuk yang pernah saya terpaksa kembali ke sekolah siswazah,
apabila saya bekerja untuk tempatan Middlesex County Daerah Peguam ini
pejabat, melakukan forensik bekerja.
Jadi pada dasarnya, Massachusetts Polis Negeri, kadang-kadang,
apabila bekerja pada kes-kes akan membawa perkara-perkara seperti cakera keras
dan cakera liut dan kad memori dan seumpamanya.
Dan mereka akan menyerahkan mereka kepada saya dan mentor saya,
dan matlamat kami adalah untuk mencari bukti, jika ada apa-apa, di media-media ini.
Sekilas sekarang, anda mungkin telah melihat dunia forensik
dalam media, TV dan filem.
Tetapi kerja saya, dan berani mengatakan dunia itu,
tidak cukup seperti anda akan melihatnya.
Mari kita lihat apa yang anda mungkin telah melihat.
[VIDEO MAIN SEMULA]
-OK.
Sekarang, mari kita lihat baik pada anda.
>> [MUZIK bermain]
>> -Hold Ia.
Berlari kembali itu.
>> -Wait Minit.
Pergi ke kanan.
-Terdapat.
Membekukan itu.
Skrin -full.
>> -OK.
Membekukan itu.
-Tighten Di atas itu, akan anda?
>> -Vector Dalam pada itu lelaki dengan roda belakang.
>> -Zoom Di di sini di tempat ini.
>> -with Peralatan yang betul, imej boleh dibesarkan dan tajam.
>> -Apa Itu?
>> -Ia Merupakan satu program peningkatan.
>> -Boleh Anda jelas bahawa sebarang?
>> -Saya Tidak tahu.
Mari kita meningkatkan ia.
>> -Meningkatkan Seksyen A6.
Saya dipertingkatkan terperinci, dan-
-Saya Fikir ada cukup untuk meningkatkan.
Melepaskannya ke skrin saya.
>> -Saya Dipertingkatkan pantulan pada mata dia.
-Let S berjalan melalui peningkatan video.
>> -Edgar, Anda boleh meningkatkan ini?
>> -Hang Pada.
>> -Aku Telah bekerja pada refleksi ini.
>> Renungan seseorang -Terdapat itu ini.
>> -Reflection.
-Terdapat Satu renungan muka manusia.
>> Renungan-The!
-Terdapat Adalah satu pantulan.
-Zoom Di atas cermin.
Anda boleh melihat pantulan.
>> -Boleh Anda meningkatkan imej dari sini?
-Boleh Anda meningkatkan ia?
-Boleh Kita meningkatkan ini?
-Boleh Anda meningkatkan ia?
-Hold Pada saat.
Saya akan meningkatkan.
-Zoom Di pintu.
-Times 10.
-Zoom.
-Move Dalam.
-Lebih.
-Wait, Berhenti.
-Stop.
-Pause Ia.
-Putar Kami 75 darjah sekitar menegak, sila.
>> -Stop.
Kembali ke bahagian kira-kira pintu lagi.
>> -Got Enhancer imej bitmap yang boleh?
>> -Maybe Kita boleh menggunakan Pradeep Singh kaedah untuk melihat ke tingkap.
>> Perisian-The adalah keadaan seni.
>> Nilai eigen-The dimatikan.
>> -with Hak gabungan algorithms--
>> Pencahayaan diambil -Dia ini algoritma ke tahap yang seterusnya,
dan saya boleh menggunakannya untuk meningkatkan gambar ini.
>> -Lock Pada dan membesarkan-paksi z.
>> -Meningkatkan.
Meningkatkan.
-Meningkatkan.
-Freeze Dan meningkatkan.
[VIDEO AKHIR MAIN SEMULA]
DAVID J. MALAN: Jadi mereka adalah semua kata-kata, tetapi mereka tidak
digunakan dalam ayat dengan betul.
Dan sesungguhnya pada masa akan datang, bila-bila masa, sila, anda mendengar seseorang mengatakan perkataan tersebut,
"Meningkatkan," ketawa hanya sedikit.
Kerana apabila anda cuba untuk meningkatkan, misalnya, ini adalah apa yang berlaku.
>> Jadi di sini adalah satu gambar yang cantik.
Ini adalah CS50 sendiri Daven.
Dan katalah kita mahu memberi tumpuan dalam pada sekelip dalam matanya,
atau pantulan yang lelaki yang buruk yang jelas
yang ditangkap oleh kamera keselamatan.
Ini adalah apa yang berlaku apabila anda zum masuk pada imej yang
hanya mempunyai beberapa terhingga bit yang dikaitkan dengannya.
>> Itulah apa yang anda akan mendapat.
Dan sesungguhnya, di mata Daven ini tetapi adalah empat, mungkin enam piksel
yang mengarang apa telah kelip redup di sana.
Jadi Set Masalah Empat akhirnya akan mempunyai anda meneroka dunia ini, terutamanya
oleh sifat sesuatu kita panggil fail i / o, di mana
i / o adalah hanya satu cara mewah daripada berkata input dan output.
>> Jadi setakat ini, semua interaksi kami mempunyai dengan komputer
telah sebahagian besarnya dengan anda papan kekunci dan skrin,
tetapi tidak begitu banyak dengan cakera keras, atau menyimpan fail di luar yang anda
diri anda menulis.
Program anda setakat ini mempunyai tidak mewujudkan, dan menyimpan,
dan mengemas kini fail-fail mereka sendiri.
>> Nah, apa yang gambar?
Well, sesuatu seperti JPEG.
Ini adalah imej yang anda mungkin mempunyai atau memuat naik ke Facebook,
atau melihat mana-mana sahaja di web.
Sesungguhnya, gambar yang kita hanya saw daripada Daven adalah JPEG a.
Dan apa yang menarik mengenai fail seperti JPEG
adalah bahawa mereka boleh dikenal pasti, biasanya, dengan corak tertentu bit.
>> Dalam erti kata lain, apakah yang membezakan JPEG dari GIF yang
dari PING dari kalimah dokumen dari fail Excel?
Nah, ia hanya berbeza corak bit.
Dan orang-corak yang berbeza adalah biasanya pada permulaan fail-fail.
>> Supaya apabila komputer anda membuka Word yang doc, atau apabila komputer yang membuka JPEG,
ia kelihatan biasanya di beberapa bit pertama dalam fail.
Dan jika ia mengiktiraf corak, ia berkata, oh, ini adalah imej.
Biar saya memaparkannya kepada pengguna sebagai grafik.
Atau, oh, ini kelihatan seperti doc Word.
Biar saya tunjukkan kepada pengguna sebagai esei.
>> Jadi misalnya, JPEG, ternyata, adalah
agak canggih di bawah hood.
Tetapi tiga bait pertama dalam kebanyakan setiap JPEG bermula dengan tiga nombor.
Jadi bait sifar, satu dan dua, pada setiap JPEG, 255, maka jumlah yang paling
216, maka bilangan 255.
>> Dan apa yang anda akan dapat untuk mula melakukan minggu depan
sebenarnya poking di bawah hud fail seperti JPEG
dan seperti fail bitmap, dan melihat apa yang sentiasa berada di sana selama
kerana anda telah menggunakan komputer.
>> Tetapi apa yang tidak ada biasanya bertulis seperti nombor perpuluhan seperti ini.
Saintis komputer tidak cenderung untuk bercakap dalam perpuluhan.
Mereka tidak benar-benar bercakap dalam perduaan.
Biasanya, apabila kita hendak untuk menyatakan nombor,
kita sebenarnya menggunakan perenambelasan, yang mana yang diketahui
daripada, katakan, Set Masalah Satu, yang mencabar
anda untuk berfikir tentang sistem yang berbeza.
>> Kami, sudah tentu, sudah biasa dengan perpuluhan, sifar melalui sembilan.
Kita bercakap tentang binari.
Dan kita tidak benar-benar mempunyai untuk menggunakan yang banyak di sini
pada keluar, kerana komputer akan menggunakan itu.
Tetapi pengaturcara akan sangat sering, tetapi tidak semestinya,
menggunakan perenambelasan, yang hanya bermakna anda mempunyai 16 huruf dalam abjad anda,
berbanding dengan dua atau 10.
>> Jadi bagaimana anda mengira yang lebih tinggi daripada sembilan dalam perenambelasan?
Anda pergi 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, hanya dengan konvensyen.
Tetapi apa yang penting adalah bahawa setiap ini adalah simbol tunggal.
Tidak ada 10.
Tidak ada 11, per se, kerana setiap digit anda, hanya suka dalam perpuluhan
dan sama seperti dalam binari, sekiranya hanya menjadi watak tunggal, oleh konvensyen.
>> Supaya kemudian adalah abjad yang kita ada ada di tangan kita untuk perenambelasan.
Jadi apakah yang JPEG kelihatan seperti jika anda adalah untuk menulis tiga pertama
tidak bait sebagai perpuluhan tetapi, misalnya, sebagai perenambelasan?
Dan mengapa hex bahkan segala yang berguna?
>> Nah, melihat cepat pada contoh.
Jadi, jika saya menulis bit yang mewakili ini numbers-- perpuluhan
ini mungkin sedikit berkarat sekarang dari beberapa minggu ke belakang,
tetapi satu di sebelah kiri dan satu hak yang cukup mudah.
255 adalah yang terbesar bilangan kami boleh mewakili dengan lapan bit.
Ia adalah semua orang.
Jadi satu-satunya itu lemah-lembut, menarik ialah yang pertengahan.
Dan jika anda jenis buat di luar yang matematik, anda akan simpulkan bahawa, memang,
yang corak satu dan sifar mewakili 216.
Jadi mari kita hanya menetapkan untuk sekarang ini adalah betul.
Tetapi mengapa ini menarik?
>> Nah, satu bait, sudah tentu, adalah lapan bit.
Dan ternyata bahawa jika anda berfikir sebuah bait sebagai dua ketulan empat bit,
seperti ini.
Biar saya menambah beberapa ruang.
Jadi sebelum, selepas.
Saya baru sahaja menambah beberapa ruang putih demi visualisasi di sini.
Bagaimana mungkin kita dalam mewakili, katakan, perenambelasan setiap quad bit,
setiap set empat bit?
>> Jadi misalnya, di sebelah kiri sekarang, kita mempunyai 1111 dalam perduaan.
Apakah nombor yang dalam perpuluhan, jika anda membuat pengiraan?
Anda mempunyai tempat orang, tempat yang berdua-dua, tempat merangkak, dan tempat yang lapan.
>> PENONTON: 15.
DAVID J. MALAN: Ini 15.
Jadi jika kita melakukan lapan campur empat tambah dua tambah satu, kita akan mendapat 15.
Jadi saya boleh menulis 15 di bawah 1111, tetapi seluruh titik di sini
adalah perenambelasan, tidak perpuluhan.
Jadi, daripada menulis 15, 1-5, Saya akan menulis bahawa dalam hex,
yang jika anda berfikir kembali, jika anda mempunyai sifar melalui f, apa yang 15 akan menjadi?
PENONTON: f.
DAVID J. MALAN: Jadi ternyata f itu ini.
Dan anda boleh bekerja yang keluar dengan berkata, baik, jika yang adalah 10, maka OK, f ialah 15.
Jadi sesungguhnya, kita boleh menulis semula set sama seperti nombor f f.
Kemudian jika kita lakukan sedikit matematik, kami akan simpulkan bahawa itu d.
Lapan adalah cukup mudah, kerana kita mempunyai satu dalam lapan tempat itu.
Dan kemudian, kita mempunyai pasangan yang lebih f f ini.
>> Jadi apa yang manusia cenderung untuk melakukannya oleh konvensyen apabila mereka menggunakan perenambelasan adalah mereka hanya
menulis ini sedikit lebih ringkas, menyingkirkan kebanyakan ruang putih.
Dan hanya untuk menjadi super jelas kepada pembaca bahawa ini adalah perenambelasan,
konvensyen yang mudah di kalangan manusia adalah anda menulis sifar
x, yang tidak mempunyai makna lain daripada pengecam visual,
di sini datang beberapa hex.
>> Dan kemudian, anda meletakkan kedua-dua digit, f f dalam kes ini, maka d, maka f f.
Jadi cerita panjang pendek, perenambelasan hanya cenderung
berguna kerana setiap yang digit, sifar melalui f, sempurna garis
dengan corak empat bit.
>> Jadi, jika anda mempunyai dua digit perenambelasan, sifar melalui F, sekali lagi dan sekali lagi,
yang memberikan anda dengan sempurna lapan bit atau satu bait.
Jadi itulah sebabnya ia cenderung untuk menjadi konvensional berguna.
Tidak ada intelektual kandungan benar-benar di luar itu,
selain daripada utiliti sebenar.
>> Sekarang JPEG bukan satu-satunya memfailkan format grafik.
Anda mungkin ingat bahawa terdapat fail seperti ini di dunia,
sekurang-kurangnya dari beberapa tahun lalu.
>> Jadi ini sebenarnya dipasang dalam Windows XP
pada berjuta-juta komputer di seluruh dunia.
Dan ini adalah fail bitmap, BMP.
Dan fail bitmap, seperti yang anda akan lihat di sebelah minggu, hanya bermakna corak titik,
piksel kerana mereka dipanggil, sebuah peta pada bit, benar-benar.
>> Jadi apa yang menarik, walaupun, tentang perkara ini format fail, BMP, adalah
bahawa di bawah hud, ia mempunyai lebih daripada hanya tiga bait
yang mendirikan header, jadi untuk bercakap, beberapa gigitan pertama.
Ia benar-benar kelihatan sedikit rumit pada pandangan pertama.
Dan anda akan melihat ini dalam P set.
Dan mendapat sesuatu keluar tertentu ini sekarang
tidak begitu penting, kerana hanya fakta bahawa pada permulaan setiap bitmap
fail, format grafik, ada sejumlah besar nombor.
>> Sekarang Microsoft, yang pengarang format ini,
cenderung untuk memanggil orang-orang perkara yang tidak ints dan aksara
dan terapung tetapi kata-kata dan d kata-kata dan Roh meronta-ronta dan bait.
Jadi mereka hanya jenis data yang berbeza.
Mereka nama yang berbeza untuk perkara yang sama.
Tetapi anda akan melihat bahawa dalam P Set Empat.
>> Tetapi ini hanya untuk mengatakan bahawa jika manusia double-klik beberapa fail .BMP pada beliau
atau cakera keras beliau, dan membuka tingkap sehingga menunjukkan kepadanya atau beliau imej itu,
yang berlaku kerana operasi sistem mungkin perasan bukan sahaja
sambungan fail .BMP di dalam nama fail,
tetapi juga hakikat bahawa ada beberapa konvensyen dengan corak bit
pada awal-awal dari fail bitmap.
>> Tetapi mari kita kini memberi tumpuan kepada seperti fail rumit,
tetapi sebaliknya kepada sesuatu yang seperti ini.
Katakan di sini di gedit, saya hanya perlu permulaan
daripada program yang cukup mudah.
Saya telah mendapat beberapa termasuk sehingga atas.
Sekarang saya telah mendapat #temasuk "structs.h" tetapi Saya akan kembali kepada yang dalam sekejap.
Tetapi ini adalah berguna untuk sekarang.
Jadi ini adalah satu program yang perkara yang berlaku untuk melaksanakan
seperti pangkalan data pendaftar.
Jadi pangkalan data pelajar, dan setiap pelajar di dunia
mempunyai nama dan rumah dan mungkin beberapa barangan lain, tetapi kami akan memastikan ia mudah.
Setiap pelajar mempunyai nama dan sebuah rumah.
>> Jadi jika saya mahu menulis program yang tujuan dalam hidup
hanya untuk melelar dari sifar pada sehingga tiga,
jika ada tiga pelajar di Universiti Harvard.
Dan saya hanya mahu untuk mendapatkan, menggunakan GetString, nama setiap pelajar dan rumah,
dan kemudian hanya mencetak mereka keluar.
>> Ini adalah jenis seperti Minggu Satu, Dua Minggu barangan sekarang,
di mana saya hanya mahu untuk gelung atau sesuatu seperti itu.
Dan saya mahu memanggil GetString beberapa kali, dan kemudian mencetak f beberapa kali.
Jadi bagaimana saya boleh melakukan ini, walaupun, apabila kedua-dua nama dan rumah
terlibat bagi setiap pelajar?
>> Jadi naluri pertama saya mungkin adalah untuk melakukan sesuatu seperti ini.
Pertama saya mungkin berkata, dengan baik, memberi saya, berkata, pelbagai rentetan dipanggil nama.
Dan saya tidak mahu hardcode tiga di sini.
Apa yang saya mahu meletakkan di sana?
Jadi PELAJAR, kerana itulah yang tetap diisytiharkan di bahagian atas,
hanya jadi saya tidak perlu hardcode tiga di pelbagai tempat.
Dengan cara ini, saya boleh menukar ia satu tempat, dan ia memberi kesan kepada perubahan di mana-mana.
Dan kemudian, saya boleh lakukan rentetan menempatkan PELAJAR.
>> Dan sekarang, saya mungkin melakukan sesuatu seperti untuk (int i = 0; i <PELAJAR i ++.
Jadi saya menaip cepat, tetapi ini adalah mungkin sintaks biasa sekarang.
>> Dan sekarang, ini adalah lebih baru-baru ini.
Jika saya ingin dimasukkan ke dalam i-ke- nama pelajar, saya rasa saya melakukan ini.
Dan kemudian, bukan nama tetapi rumah braket i.
Saya melakukan ini, GetString, dan membiarkan saya kembali dan menetapkan garis ini.
Setuju?
Ia bukan sangat user-friendly.
Saya tidak memberitahu pengguna apa yang perlu dilakukan.
>> Tetapi sekarang, jika saya juga mahu kemudian, mari kita
katakan, mencetak perkara-perkara ini out-- jadi TODO kemudian.
Saya akan melakukan lebih banyak dengan this-- ini boleh dikatakan IS
pelaksanaan yang betul mendapatkan nama dan rumah-rumah, tiga
daripada mereka jumlah setiap, dari pengguna.
>> Tetapi ini tidak reka bentuk yang sangat baik, bukan?
Bagaimana jika seseorang pelajar bukan hanya nama dan rumah, tetapi juga nombor ID,
dan nombor telefon, dan alamat e-mel,
dan mungkin laman utama, dan mungkin pemegang Twitter,
dan apa-apa bilangan butiran lain dikaitkan dengan pelajar atau seseorang,
amnya.
Bagaimana kita akan mula menambah fungsi untuk program ini?
>> Well, saya rasa seperti cara yang paling mudah mungkin adalah untuk melakukan sesuatu seperti, katakan,
int PELAJAR id.
Jadi saya boleh meletakkan semua ID mereka di sana.
Dan kemudian, sesuatu seperti nombor telefon,
Saya tidak pasti bagaimana untuk menyatakan bahawa hanya lagi.
Jadi mari kita pergi ke depan dan hanya panggilan ini Twitters PELAJAR, yang
adalah sedikit pelik, but-- dan sekumpulan yang lebih bidang.
>> Saya mula dengan berkesan copy dan paste di sini.
Dan ini akan berkembang cukup susah dipakai cukup cepat, bukan?
Bukankah lebih baik jika terdapat di dunia struktur data yang dikenali
bukan sebagai int atau tali, tetapi sesuatu peringkat yang lebih tinggi, pengambilan, jadi
untuk bercakap, yang dikenali sebagai seorang pelajar?
C tidak datang dengan terbina dalam fungsi untuk pelajar,
tetapi bagaimana jika saya mahu memberikan apa-apa?
>> Nah, ternyata, saya akan membuka fail yang dipanggil structs.h sini,
dan anda boleh melakukan perkara tersebut.
Dan kita akan mula melakukan ini sekarang.
Dan di bawah hud P Set Tiga, anda telah telah melakukan ini sekarang.
Tidak ada perkara seperti g agar you atau satu g bujur dalam bahasa pengaturcaraan C.
>> Orang di Stanford yang dilaksanakan jenis data dengan menggunakan pendekatan ini di sini,
mengisytiharkan data baru mereka sendiri jenis menggunakan kata kunci baru
dipanggil struct dan satu lagi satu dipanggil typedef.
Dan memang, walaupun sintaks kelihatan sedikit berbeza daripada barangan
yang kita lihat sebelum ini, dalam dasarnya, ia super mudah.
>> Ini hanya bermakna "menentukan jenis."
Itu akan menjadi satu struktur, dan struktur yang
adalah sama seperti bekas untuk pelbagai perkara.
Dan struktur yang akan mempunyai tali yang dipanggil nama,
dan tali yang dipanggil rumah.
Dan mari kita memanggil, hanya untuk kemudahan, ini seluruh pelajar struktur data.
>> Jadi masa ini anda dapat koma bernoktah, anda ada sekarang
dicipta data anda sendiri Jenis dipanggil pelajar
yang kini berdiri bersama int, dan apungan, dan char, dan tali,
dan g agar you, dan g bujur, dan apa-apa bilangan perkara-perkara lain orang telah dicipta.
>> Jadi apa yang berguna tentang ini sekarang ialah jika saya kembali
untuk struct 0 dan menghabiskan ini pelaksanaan, yang saya telah menulis
terlebih dahulu di sini, melihat bahawa semua daripada messiness yang tidak dapat dielakkan bahawa
adalah kira-kira untuk mula berlaku seperti yang saya tambah nombor telefon dan twitter dan semua
perkara-perkara lain untuk definisi pelajar,
kini ia ringkas dibungkus sebagai hanya satu pelbagai pelajar.
>> Dan setiap orang pelajar kini mempunyai beberapa perkara di dalamnya.
Supaya hanya meninggalkan satu soalan.
Bagaimana anda mendapat pada nama, dan rumah, dan ID,
dan apa-apa sahaja adalah bahagian dalam pelajar tersebut?
Super mudah, juga.
Sintaks baru, tetapi idea yang mudah.
>> Anda hanya indeks ke dalam array, seperti yang kita lakukan pada minggu lepas dan ini.
Dan apa yang jelas sekeping baru sintaks?
Adil., Yang bermaksud "pergi di dalam struktur dan mendapatkan bidang yang dipanggil
nama, dapatkan bidang yang dipanggil rumah, mendapatkan bidang yang dipanggil pelajar. "
>> Jadi dalam P Set Tiga, jika anda masih bekerja pada itu,
kebanyakan orang dan masih adalah, menyedari bahawa apabila anda
mula menggunakan perkara-perkara seperti g rects dan g oval
dan lain-lain yang seolah-olah tidak datang dari Minggu Zero, Satu atau Dua,
menyedari bahawa itu kerana Stanford mengisytiharkan beberapa jenis data baru.
>> Dan sesungguhnya, itulah yang kita akan lakukan, dan juga, dalam P Set Empat, apabila
kita mula untuk menangani perkara-perkara seperti imej, bitmap, dan banyak lagi.
Jadi, itu hanya penggoda dan model mental untuk apa yang akan datang.
Sekarang, saya melengah-lengahkan sedikit pagi ini.
Saya jenis ingin tahu untuk melihat apa yang kertas dinding Microsoft sebenarnya
kelihatan seperti hari ini.
Dan ternyata orang pada tahun 2006 sebenarnya pergi ke hampir tepat
tempat yang sama untuk mengambil gambar pada hakikatnya apa yang kelihatan seperti itu hari ini.
Bidang ini kini sedikit terlalu besar.
>> Jadi bercakap kini imej, mari kita membawa balik Daven sini
pada skrin dan Nicholas, dan hanya mengingatkan anda
bahawa jika anda ingin menyertai kami untuk makan tengah hari Jumaat, pergi ke URL biasa kami
di sini.
>> Jadi di mana yang kita meninggalkan off pada hari Isnin?
Kami memperkenalkan masalah ini, bukan?
Ini seolah-olah yang betul pelaksanaan swap,
mana anda mengambil dua ints, satu dipanggil, satu dipanggil b,
swap mereka, seperti Laura lakukan di sini di atas pentas dengan susu dan air,
dengan menggunakan sementara berubah-ubah, atau cawan kosong,
supaya kita boleh meletakkan b dalam dan di b tanpa membuat keadaan kucar-kacir perkara.
Kami menggunakan pemboleh ubah.
Ia dipanggil temp.
>> Tetapi apa yang asas masalah dengan kod ini pada hari Isnin?
Apa masalahnya disini?
Yeah.
>> PENONTON: Ia mengambil lebih banyak ruang.
>> DAVID J. MALAN: Membawa lebih banyak ruang, kerana saya menggunakan pembolehubah,
dan itu OK.
Yang benar, tetapi saya akan mengatakan itu OK.
Ia hanya 32 bit dalam grand skim perkara, jadi tidak masalah besar.
Pemikiran yang lain?
PENONTON: Ia hanya Swap pembolehubah tempatan.
DAVID J. MALAN: Tepat sekali.
Ia hanya Swap pembolehubah tempatan.
Kerana bila-bila masa anda memanggil function-- apabila saya mempunyai dulang dari Annenberg
Kali terakhir, anda perlu utama di bahagian bawah.
Sebaik sahaja anda memanggil fungsi yang dipanggil swap, swap tidak mendapat x dan y,
nilai-nilai asal.
Apa swap get, adakah kita mendakwa?
PENONTON: Copies.
DAVID J. MALAN: Jadi salinannya.
Jadi ia menjadi satu dan dua, jika anda ingat contoh dari masa lalu,
tetapi salinan satu dan dua yang berjaya ditukar.
Tetapi malangnya pada akhirnya, nilai-nilai masih yang sama.
Oleh itu, kita boleh melihat ini dengan kami rakan baru, mudah-mudahan GDB,
bahawa anda atau TFS dan ini Ca mempunyai telah membimbing anda ke arah seperti berikut.
>> Jadi tidak ingat swap kelihatan like-- mari membuka this-- kelihatan seperti ini.
Kami dimulakan x kepada satu, y kepada dua.
Telah mempunyai banyak cetak f ini.
Tetapi, seruan utama di sini adalah untuk menukar, yang
betul-betul kami kod hanya melihat masa lalu.
Yang betul pada pertama pandangan, tetapi fungsi,
program ini tidak berjaya, kerana ia tidak kekal swap x dan y.
>> Jadi mari kita lihat ini, panas cepat di sini dengan GDB, ./noswap a.
Sekumpulan maklumat kukuh bahawa Saya akan menghapuskan dengan Kawalan L sekarang.
Dan sekarang, saya akan pergi ke depan dan menjalankannya.
Dan malangnya, yang tidak begitu berguna.
Ia berlari program bahagian dalam ini program dipanggil GDB, penyahpepijat a,
tetapi ia tidak membenarkan saya mencucuk sekitar.
>> Jadi bagaimana saya boleh benar-benar berhenti seketika pelaksanaan di dalam program ini?
Jadi memecahkan.
Dan saya boleh memecahkan mana-mana garis nombor, satu, 10, 15.
Tetapi saya juga boleh memecahkan simbolik dengan mengatakan rehat utama.
Dan itu akan ditetapkan berehat mata, nampaknya di talian 16 dalam utama.
Dan di mana adalah talian 16?
Mari kita pergi sehingga kod dan naik ke noswap.
Dan sesungguhnya, talian 16 adalah pertama dalam program ini.
>> Jadi sekarang, jika saya pergi ke depan dan jenis menjalankan masa ini, Masukkan, ia berhenti.
Jadi mari kita mencucuk sekitar.
Cetak x-- mengapa x sifar?
Dan mengabaikan tanda dolar.
Itu hanya untuk pelamun penggunaan program.
Kenapa x sifar pada masa ini?
Yeah.
>> PENONTON: Ia berhenti di depan talian 16, tidak benar-benar pada baris 16.
DAVID J. MALAN: Tepat sekali.
GDB, secara lalai, telah berhenti pelaksanaan sebelum talian 16.
Jadi ia tidak dilaksanakan, yang bermakna x mempunyai nilai tertentu yang tidak diketahui.
Dan kita bernasib baik bahawa itu sesuatu yang bersih seperti sifar.
Jadi sekarang saya menaip depan, kini ia dilaksanakan 16.
Ia menunggu saya untuk melaksanakan 17.
Biar saya pergi ke hadapan dan cetak x.
Ia adalah salah.
Biar saya pergi ke hadapan dan cetak y.
Apakah yang perlu saya lihat sekarang?
>> PENONTON: [didengar]
>> DAVID J. MALAN: A lebih kuat sedikit.
>> PENONTON: [didengar]
DAVID J. MALAN: Tidak cukup kata sepakat.
Jadi ya, kami melihat beberapa nilai sampah.
Sekarang, y adalah 134514064 sana.
Nah, ia hanya beberapa nilai sampah.
Program ni menggunakan RAM untuk tujuan yang berlainan.
Ada fungsi lain.
Orang lain telah menulis di dalam komputer saya.
Jadi bit-bit telah digunakan untuk nilai-nilai yang lain, dan apa yang saya melihat
adalah sisa-sisa beberapa penggunaan terdahulu memori itu.
>> Jadi tidak ada masalah besar, kerana sebaik sahaja sebagai saya menaip depan dan kemudian mencetak y,
ia dimulakan untuk nilai yang saya cari.
Jadi sekarang, mari kita pergi ke depan sedikit lebih cepat.
N untuk seterusnya.
Mari kita buat sekali lagi.
Tetapi saya tidak mahu untuk memukul di sini, kerana jika saya
mahu melihat apa yang berlaku di dalam swap, apa arahan?
>> PENONTON: langkah.
>> DAVID J. MALAN: langkah.
Jadi ini langkah saya ke dalam fungsi, dan bukannya di atasnya.
Dan sekarang, ia sedikit samar jujur, tetapi ini adalah hanya
memberitahu saya saya di talian 33 sekarang.
Dan mari kita buat ini lagi.
Cetak temp.
Nilai sampah, negatif masa ini, tetapi itu hanya masih nilai sampah.
Jadi mari kita buat akan datang, cetak temp.
Ia dimulakan dengan 1, yang adalah nilai x, aka a.
>> Sekarang, di mana adalah kita dan x datang dari?
Nah, notis utama, kami dipanggil nilai-nilai ini x dan y.
Kami kemudian lulus mereka untuk menukar seperti berikut.
X datang pertama, koma y.
Dan kemudian, swap boleh menghubungi mereka x dan y.
Tetapi untuk kejelasan, ia memanggil mereka dan b.
Tetapi a dan b kini akan menjadi salinan x dan y masing-masing.
>> Jadi, jika saya kembali ke GDB, temp kini satu dan kini satu.
Tetapi jika saya lakukan seterusnya dan kini melakukan cetak yang, telah pun berpindah ke atas.
Susu itu telah dicurahkan ke dalam bekas kaca jus oren, atau sebaliknya.
>> Dan jika saya lakukan seterusnya lagi, dan kini jika saya mencetak sebagai cek kewarasan,
yang masih dua, tetapi b kini satu.
Terus terang, ia masih di sana.
Saya tidak peduli apa temp adalah.
Tetapi sebaik sahaja saya kini menaip, katakan, terus kembali, kini saya di hujung
program ini.
Dan malangnya, x ialah masih satu dan y masih dua.
>> Jadi apa yang utiliti GDB sana?
Ia tidak membantu saya menetapkan masalah per se,
tetapi ia mudah-mudahan membantu saya memahaminya dengan menyedari
bahawa ya, logik saya adalah betul, tetapi kod saya tidak akhirnya mempunyai
kesan yang kekal.
Jadi, itu masalah kami kini akan menyelesaikan hari ini.
>> Tetapi mari kita ke sana dengan cara ini.
Rentetan adalah satu pembohongan.
Ia juga bukan jenis data yang wujud di C. Ia
merupakan sinonim untuk beberapa masa untuk sesuatu yang lain,
dan kita boleh mendedahkan bahawa seperti berikut.
>> Biar saya pergi ke hadapan dan membuka program yang dipanggil membandingkan-0.
Dan bukannya menaip satu ini keluar, kami akan mula berjalan melalui kod
Saya telah menulis, tetapi ia hanya beberapa baris.
Jadi ini adalah membandingkan-0.
Dan perkara pertama yang saya lakukan semakin barisan teks.
>> Tetapi melihat apa yang saya lakukan untuk kali pertama.
Apa yang berbeza dengan jelas garis 21?
Sebenarnya, tunggu satu minit.
Ini adalah salinan dua.
Itu bukan walaupun program yang betul.
Baiklah, spoiler amaran.
Baiklah, jadi tidak apa itu.
Itulah jawapan kepada soalan yang akan datang.
>> Berikut adalah membandingkan-0, dan saya kira-kira untuk mendapatkan baris teks.
Program ini lebih mudah.
Jadi ini adalah mudah.
Ini seperti Minggu Satu, Dua Minggu barangan pada masa ini. rentetan s = GetString.
Sekarang, saya berkata lagi di sini.
rentetan t = GetString.
Dan kemudian, perkara terakhir dalam ini program, seperti namanya,
adalah saya akan cuba untuk membandingkan mereka.
>> Jadi, jika s, tali yang pertama, sama = t, maka saya
akan mengatakan anda menaip perkara yang sama.
Yang lain, saya akan mengatakan anda taip perkara yang berbeza.
Jadi mari kita menyusun dan menjalankan program ini.
Oleh itu, membandingkan sifar.
Kelihatan baik.
Tiada kesilapan kompilasi.
>> Biar saya pergi ke hadapan kini dan taip ./compare-0.
Biar saya pergi ke hadapan dan mengatakan sesuatu : Daven dan sesuatu: Rob.
Dan saya menaip perkara yang berbeza.
Setakat ini, begitu baik.
Program seolah-olah betul.
>> Tetapi mari kita berjalan lagi.
Mengatakan sesuatu: Gabe.
Baiklah.
Mungkin saya memukul bar ruang atau sesuatu yang 'funky'.
Mari kita buat sekali lagi.
Jadi Zamyla.
Zamyla.
Perkara yang berbeza.
Jadi apa yang berlaku?
>> Jadi kita mempunyai dua baris kod, GetString dipanggil dua kali.
Dan kemudian, saya hanya cuba untuk membandingkan dan t.
Tetapi apa yang benar-benar maka yang sedang berlaku?
Nah, kira-kira tulisan tangan saya untuk penjual daging contoh ini agak.
Dan mari kita sebenarnya membuang ini sehingga di sini, juga.
>> Oleh itu, kita mempunyai talian seperti rentetan s = GetString.
Supaya hanya yang pertama garis yang menarik daripada program itu.
Tetapi apa yang selama ini telah berlaku di bawah hud?
Nah, di kiri sebelah adalah rentetan, yang beberapa jenis pembolehubah,
dan ia dipanggil s.
Jadi saya tahu bahawa ini adalah menggunakan memori, atau RAM, komputer saya entah bagaimana.
Jadi saya akan secara abstrak menarik bahawa segiempat.
32 bit, ternyata, tetapi lanjut mengenai bahawa pada masa akan datang.
Kemudian, apa yang berlaku di sini?
>> Nah, jelas GetString mendapat rentetan daripada pengguna.
Dan GetString mendapat Zamyla atau Gabe atau Daven.
Jadi mari kita memilih yang pertama dari orang-orang, yang merupakan Daven.
Dengan berkesan, apa GetString mendapat saya dalam kes pertama adalah D-a-v-e-n.
Dan kemudian, apa lagi melakukannya ia memberi saya diam-diam?
PENONTON: [didengar]
DAVID J. MALAN: Ya, yang / 0 atau batal watak.
Jadi ia berkesan memberikan saya rentetan.
Tetapi kita sudah tahu dari sebelumnya kelihatan bahawa rentetan hanya array
aksara, dan ia ditamatkan oleh watak sentinel istimewa ini, / 0.
>> Tetapi jika ini adalah benar dan ini ialah kuasa dua,
ini adalah jelas persegi panjang yang lebih besar.
Dan sesungguhnya, ini adalah, Saya menuntut, hanya 32 bit.
Dan ini adalah jelas lebih daripada 32 bit, kerana ini mungkin
lapan ditambah lapan ditambah lapan ditambah lapan ditambah lapan,
hanya kerana bait dalam ASCII.
Bagaimana palang pintu yang kita akan menyesuaikan Daven ke dalam kotak kecil ini di sini?
>> Nah, apa yang GetString sebenarnya lakukan?
Nah, grid ini di sini mewakili memori komputer saya atau RAM.
Jadi mari kita sewenang-wenangnya mengatakan bahawa jika masing-masing mewakili satu bait,
maka kita boleh memikirkan setiap bait sebagai mempunyai alamat,
33 seperti Oxford Street, atau 34 Oxford Street, atau 35 Oxford Street.
>> Jadi seperti rumah mempunyai alamat dan bangunan mempunyai alamat,
begitu juga bytes individu ingatan mempunyai alamat atau nombor
yang unik mengenal pasti mereka.
Sekarang, ini sewenang-wenangnya.
Tetapi untuk memastikan ia mudah, saya akan menggunakan perenambelasan hanya dengan konvensyen,
tetapi 0x ertinya apa-apa selain daripada "ini adalah perenambelasan."
dan saya akan menuntut bahawa "D" berakhir di Byte Satu dalam ingatan.
>> Saya mendapat apa-apa lagi berlaku di memori, jadi Daven mendapat tempat pertama
di Byte Satu.
Ini, maka, akan menjadi 0x2.
Ini akan 0x3.
Ini akan menjadi 0x4.
Ini akan 0x5.
Ini akan menjadi 0x6.
>> Tetapi apabila anda mula berfikir tentang apa perbuatan komputer
di bawah hud, anda boleh mula untuk membuat kesimpulan
bagaimana anda, beberapa tahun yang lalu, akan telah melaksanakan C sendiri.
Apakah mungkin GetString returning-- kerana ia
berasa seperti ia tidak kembali Daven, per se,
kerana dia pasti tidak akan untuk menyesuaikan diri box-- kecil ini
jadi apa yang GetString mungkin kembali?
>> PENONTON: [didengar]
>> DAVID J. MALAN: Lokasi Daven.
Dan ia telah melakukan ini sejak Minggu Satu.
Apa GetString adalah benar-benar kembali bukan tali, per se.
Itulah salah satu pembohongan putih yang kecil.
Ia kembali alamat rentetan dalam ingatan, alamat unik.
Daven hidup pada 33 Oxford Street.
Tetapi yang lebih ringkas, Gavin tinggal di 0x1, Alamat Nombor Satu.
>> Jadi apa yang akan dimasukkan ke dalam ini kotak kecil itu, menjadi jelas,
hanya alamat rentetan itu.
Jadi selama ini, ini mempunyai telah berlaku.
Tetapi apa yang ini mengisyaratkan sekarang ialah jika semua s mempunyai
adalah nombor di dalamnya, siapa yang untuk menghalang anda, pengaturcara,
daripada meletakkan sebarang nombor di apa-apa ubah dan hanya melompat
dengan sebahagian memori?
Dan sesungguhnya, kita akan melihat itu adalah satu ancaman masa depan.
>> Tetapi untuk sekarang, ini berasa tidak mencukupi.
Jika saya katakan, dapatkan saya rentetan, anda memberi saya Daven.
Tetapi anda tidak benar-benar memberi saya Daven.
Apa yang anda berikan saya adalah alamat Daven ini.
Bagaimana saya kemudian pasti mana Daven bermula dan ends--
cerita ini mendapat weird-- Daven di mana bermula dan berakhir,
dan kemudian, seterusnya rentetan dalam ingatan bermula?
>> Nah, jika anda menyerahkan saya awal Daven,
dasarnya, bagaimana saya tahu di mana akhir namanya?
Itulah watak null khas yang adalah lebih penting sekarang
jika tali itu di bawahnya hud yang hanya dikenal pasti
unik mengikut lokasi mereka dalam ingatan.
Jadi selama ini, itu apa yang telah berlaku.
>> Oleh itu, apabila kita melihat di kod itu di sini, terangkan
jika anda akan pepijat dalam talian 26.
Mengapa Zamyla dan Zamyla berbeza?
Mengapa Gabe dan Gabe berbeza?
Ya, di belakang.
>> PENONTON: Mereka mempunyai alamat yang berbeza.
>> DAVID J. MALAN: Hanya kerana mereka mempunyai alamat yang berbeza.
Kerana apabila anda memanggil GetString sekali lagi, yang saya akan lakukan dengan cepat di sini,
jika ini adalah barisan kedua, tali t, seperti yang saya lakukan dalam program itu,
sama satu lagi panggilan untuk GetString.
Lain kali saya panggil GetString, saya akan
untuk mendapatkan sebahagian yang berbeza ingatan.
>> GetString dibenarkan untuk meminta operasi
sistem untuk lebih banyak memori.
Ia tidak akan menggunakan semula yang sama enam bait setiap kali.
Ia akan untuk mendapatkan yang baru sebahagian daripada ingatan, yang
t bermakna akan mendapatkan beberapa nilai lain di sini.
>> Oleh itu, apabila saya buat s sama = t, anda tidak membandingkan
D terhadap ini dan A terhadap ini dan V terhadap ini.
Anda membandingkan ini terhadap ini, yang
terus-terang adalah useless-- cukup useful-- ini agak tidak berguna, kerana yang benar-benar
mengambil berat di mana tali dalam memori?
>> Dan sesungguhnya, kita tidak mempunyai.
Dan kami tidak akan memulakan terutamanya penyayang.
Hanya setakat bahawa pepijat boleh timbul dan ancaman keselamatan boleh timbul akan
kita sebenarnya mula mengambil berat tentang perkara ini.
Jadi mari kita menyelesaikan masalah ini.
Rupa-rupanya, anda menetapkan ia hanya super.
>> Dan mari kita sebenarnya, sebelum saya mendedahkan bahawa sekali lagi, apa yang akan
anda lakukan jika dalam kelas CS50, dan anda mempunyai untuk melaksanakan
perbandingan terhadap dua tali.
Anda jelas tidak boleh hanya menggunakan s sama = t.
Tetapi secara logik, bagaimana anda akan membandingkan tali ini
terhadap rentetan ini menggunakan kod C?
Yeah.
>> PENONTON: Hanya melakukan untuk gelung [didengar]
DAVID J. MALAN: Perfect.
PENONTON: [didengar]
DAVID J. MALAN: Yeah.
Hanya menggunakan satu untuk gelung atau manakala gelung atau apa sahaja.
Tetapi hanya menggunakan idea asas yang jika ini adalah sebahagian daripada ingatan atau array
dan ini adalah, melelar lebih kedua-dua pada masa yang sama.
Dan hanya membandingkan huruf.
>> Dan anda perlu menjadi sedikit berhati-hati, kerana anda
tidak mahu satu jari pergi masa lalu yang lain
kerana satu rentetan adalah lebih lama daripada yang lain.
Jadi anda akan mahu untuk memeriksa nilai ini khas di akhirnya, null.
Tetapi ia benar-benar adalah, dalam akhir, semudah itu.
Dan terus-terang, kita tidak perlu untuk mencipta semula roda itu.
Berikut adalah Versi Dua.
Dan apa yang saya akan katakan di sini ialah bukannya membandingkan s sama = t,
Saya bukannya akan berkata, jika tali perbandingan s koma t sama = 0.
Kini, apa yang istimewa pada tali?
>> Ternyata, ia adalah fungsi yang datang dengan C, yang tujuan dalam hidup
adalah untuk membandingkan dua tali.
Dan kacau bandingkan, jika kita membaca yang Laman lelaki atau dokumentasi atau CS50
rujukan, ia akan hanya memberitahu anda bahawa kacau
membandingkan pulangan sama ada negatif nombor atau nombor positif atau sifar,
di mana sifar bermakna mereka sama.
>> Jadi hanya sangkaan semata-mata.
Apa yang ia mungkin bermakna jika kacau pulangan istimewa
nilai negatif atau nilai positif?
PENONTON: Lebih daripada atau kurang daripada.
DAVID J. MALAN: Ya, lebih besar daripada atau kurang daripada.
Jadi, jika anda mahu untuk menyusun keseluruhan sekumpulan tali dalam dictionary-- yang
seperti yang kita akan akhirnya turun road-- yang fungsi sempurna menggunakan berpotensi,
kerana ia akan berbuat demikian perbandingan tali untuk anda, dan memberitahu
anda tidak datang sebelum b, atau melakukan b sebelum datang satu abjad.
Kita boleh melakukan perkara tersebut.
>> Dan notis saya lakukan satu lain perkara dalam contoh ini.
Apa lagi yang telah berubah lebih tinggi dalam ini fungsi utama?
Char *.
Dan ini adalah yang dusta putih lain.
Semua masa ini, apabila anda telah telah menulis rentetan,
kami telah diam-diam menulis semula tali sebagai char * jadi dilafaz yang benar-benar
memahami anda.
>> Dalam erti kata lain, dalam CS50.h dan seperti yang kita akhirnya akan melihat,
kami membuat tali sinonim dipanggil itulah perkara yang sama seperti char *.
Dan buat masa ini, hanya tahu bahawa *, Dalam konteks ini, sekurang-kurangnya,
ertinya alamat.
>> Alamat apa?
Nah, hakikat bahawa saya berkata char *, dan tidak int * atau terapung *,
bermakna char * adalah alamat char a.
Jadi kotak kecil ini di sini, aka tali, adalah benar-benar jenis char *,
yang hanya satu cara mewah untuk mengatakan, ruang ini akan alamat.
Dan apakah alamat yang merujuk kepada?
Rupa-rupanya, char a.
>> Tetapi kita boleh benar-benar mempunyai int * dan lain-lain.
Tetapi untuk sekarang, char * adalah benar-benar yang paling mudah dan salah satu faedah.
Jadi masalah ini akan meningkat, walaupun, sekali lagi.
>> Katakan saya membuka program ini.
Mari kita lihat jika sekarang kita boleh meramalkan apa yang salah dengan kod ini.
Jadi, dalam program ini, copy-0, saya akan pergi ke depan dan sekali lagi memanggil
GetString dan menyimpan nilai dalam s.
>> Kemudian, mengapa saya lakukan ini, hanya sebagai peringatan dari minggu yang lalu?
Kami telah mengatakan bahawa GetString kadang-kadang kembali null.
Apakah ertinya jika GetString kembali batal?
Sesuatu telah berlaku.
Ia mungkin bermakna tali terlalu besar, daripada komputer ingatan.
Ia berlaku super, super, super jarang, tetapi ia boleh berlaku.
Kami mahu menyemak untuk itu, dan itu semua kita lakukan.
>> Oleh kerana kita akan melihat sekarang, jika anda tidak mula memeriksa lazimnya untuk perkara-perkara
seperti null, anda mungkin sebenarnya mula pergi
ke alamat dalam ingatan yang tidak sah.
Dan anda akan mula mendorong lebih dan lebih segmentasi kesalahan.
Atau Mac atau PC, hanya menyebabkan komputer untuk menggantung
atau program untuk membekukan, berpotensi.
>> Jadi sekarang, saya menuntut dalam salinan-0.c, bahawa saya Aku akan menyalin tali ini dengan cara
dari beratur 28.
Kemudian, saya akan menuntut di bahagian bawah
di sini bahawa saya akan untuk menukar salah seorang daripada mereka.
>> Jadi notis ini.
Saya memanggil rakan strlen lama.
Dan hanya menjelaskan dalam bahasa Inggeris apa baris ini 34 melakukan?
Apa yang t kurungan 0 mewakili di sebelah kiri.
Yeah.
>> PENONTON: aksara Pertama t?
DAVID J. MALAN: aksara Pertama t.
Itu sahaja.
Watak pertama t, saya mahu untuk memberikan versi huruf besar
watak pertama dalam t.
Jadi, ini adalah kesempatan surat pertama.
Dan kemudian, perkara yang terakhir saya lakukan dalam program ini saya menuntut di sini
asal, s, dan di sini salinan, t.
>> Tetapi berdasarkan kisah kita memberitahu tentang apa yang tali benar-benar adalah,
apa yang benar-benar talian 28 lakukan, dan apa yang
bug yang terhasil akan untuk berada di skrin?
>> Jadi pertama, soalan pertama, 28.
Apa yang tali t = s benar-benar buat?
Jika kita mempunyai di sebelah kiri-tangan sebelah sini rentetan t = s;
yang memberikan saya satu kotak di sini dan satu kotak di sini.
Dan andaikan alamat ini adalah 0x, katakan, 50 kali ini, sewenang-wenangnya.
Apa rentetan t = s lakukan di bawah hood?
>> PENONTON: [didengar]
>> DAVID J. MALAN: Ia menyimpan memori menangani sana, jadi 0x50 pergi ke sana.
Jadi jika sekarang, saya pergi ke pertama watak dalam t dan huruf besar itu,
apa yang saya lakukan untuk berkesan s?
Saya benar-benar melakukan perkara yang sama, bukan?
Kerana jika Alamat 0x50-- dan adil, saya tidak mempunyai banyak ruang di atas kapal di sini,
tetapi menganggap bahawa ini adalah 0x50 turun di sini, di suatu tempat di memori komputer saya.
>> Dan saya, misalnya, Gabe dalam huruf kecil di sini, seperti ini.
Sehingga aku berkata t kurungan 0 mendapat dipermodalkan.
Nah, t kurungan 0 adalah huruf pertama dalam t.
Jadi sedikit g akan menjadi besar G. Tetapi masalahnya
adalah, apa s juga menunjukkan?
>> PENONTON: Perkara yang sama.
>> DAVID J. MALAN: Perkara yang tepat sama.
Jadi penjelasan yang mudah mungkin, walaupun sintaks adalah sedikit pelik.
Jadi mari kita buat ini.
Membuat salinan-0 dan kemudian ./copy-0.
Mengatakan sesuatu: Gabe.
Dan malangnya, kedua-dua mereka kini telah dipermodalkan,
tetapi untuk yang asas sebab itu kami hanya
kini berhadapan dengan alamat.
>> Jadi bagaimana kita mula address-- pun tidak intended--
bagaimana kita mula menangani masalah tertentu ini?
Nah, dalam copy1.c, mereka akan berdepan untuk mendapatkan sedikit lebih rumit.
Tetapi saya akan menuntut penyelesaian dari segi konsep yang mudah.
>> Begitu sukar untuk mendapatkan pada pandangan pertama.
Tidak akan mudah untuk yang pertama masa anda menaip keluar, mungkin,
tetapi jika masalahnya ialah bahawa hanya melakukan t = s hanya
salinan alamat, apa, sekali lagi jika saya boleh mengambil kepada kamu,
akan menjadi penyelesaian sebenarnya untuk menyalin rentetan?
>> PENONTON: Kami akan mungkin menggunakan gelung lagi.
>> DAVID J. MALAN: Yeah.
Jadi, kita akan memerlukan gelung lagi.
Dan kerana jika kita mahu untuk menyalin yang s tali ke tali yang lain,
kita mungkin mahu melakukannya watak oleh watak.
Tetapi masalahnya ialah, jika ini adalah asalnya s,
kini kita perlu mula dengan jelas memperuntukkan memori untuk t.
>> Dalam erti kata lain, mari kita melukis semula kali terakhir ini.
Jika ini adalah rentetan s = GetString.
Dan mari kita meletakkan ini di sini, juga.
Ini adalah GetString.
Kemudian, gambar sesuatu seperti itu akan menjadi seperti dahulu,
g-a-b-e / 0.
Yang kelihatan sesuatu yang kecil seperti ini.
Dan s Oleh itu, kita panggil ini 0x50, dan itu akan menjadi 51, 52.
>> Jadi ini adalah 0x50.
Dan kemudian, saya tali t.
Dalam ingatan, itu hanya akan memberi saya satu persegi kecil seperti ini.
Jadi apa langkah penting sekarang?
Jika saya hendak salin ke dalam t, apa kosong yang kita perlu mengisi di sini?
Atau apa yang kita perlu melakukan pada tahap yang tinggi?
Yeah?
Seseorang?
Yeah.
>> PENONTON: Kita perlu [didengar].
DAVID J. MALAN: Ya, kita perlu mengisi kosong ini.
Saya tidak boleh menyalin dan kemudian kesempatan Nama Gabe ini
sehingga saya bertanya sistem operasi untuk satu lagi sebahagian daripada memori
itu sekurang-kurangnya sama besar seperti yang asal.
Supaya meninggalkan kita dengan soalan.
>> Bagaimana saya meminta sistem operasi tidak hanya untuk pointer-- sedikit mudah
kerana ini dipanggil, satu alamat, yang tidak pointer--
untuk kotak kecil mudah seperti ini dipanggil rentetan?
Bagaimana saya meminta operasi sistem untuk sebahagian besar daripada memori?
Setakat ini, saya hanya mendapat belakang yang tidak langsung dengan memanggil GetString.
Jadi bagaimana GetString walaupun mendapat ingatan?
>> Nah, ternyata bahawa ada fungsi lain ini di sini
bahawa kita kini akan mula digunakan.
Sekarang, ini kelihatan than-- cara yang lebih samar dan saya satu-satunya yang boleh melihat it--
baris ini kelihatan cara yang lebih samar maka sepatutnya pada pandangan pertama.
Tetapi mari kita mengusik berasingan.
>> Di sebelah kiri, saya mempunyai char * t.
Jadi, dalam Bahasa Inggeris, mari kita mulakan untuk merumuskan ayat yang betul dalam jargon teknikal.
Jadi ini memperuntukkan ubah jenis char * dipanggil t.
Sekarang, apakah yang benar-benar bermakna?
>> Nah, itu bermakna, apa yang saya akan untuk dimasukkan ke dalam pembolehubah ini dipanggil t?
Alamat char a.
Jadi itu hanya lebih mudah, cara yang lebih munasabah
menggambarkan sebelah kiri.
Jadi yang mencipta kotak ini di sini sahaja.
Oleh itu, sebelah kanan, mungkin, akan
untuk memperuntukkan bahawa lebih besar sebahagian memori bagaimana?
Jadi mari kita mengusik ini selain.
>> Ia hangat pada pandangan pertama, tetapi apa yang berlaku di dalam sini?
Pertama, ada malloc, yang nampaknya rakan baru kami,
"Memori memperuntukkan."
Jadi ini adalah hujah yang dihulurkan ke dalamnya, maka ia adalah satu hujah yang cukup besar.
Jadi mari kita mengusik ini selain.
>> strlen s, sudah tentu, mewakili the--
PENONTON: Bilangan aksara.
DAVID J. MALAN: Hanya Bilangan aksara dalam s.
Jadi panjang s, tali asal.
Jadi G-a-b-e.
Jadi ia mungkin empat dalam kes ini.
Mengapa saya lakukan selepas +1 memanggil strlen s?
PENONTON: [didengar]
DAVID J. MALAN: Untuk itu watak null khas.
Jika anda bertanya kepada saya apa yang panjang Nama Gabe ini, saya akan mengatakan empat.
Di bawah hood, walaupun, saya perlu bahawa bait kelima untuk watak null.
Jadi itulah sebabnya saya lakukan +1 itu.
>> Sekarang hanya dalam kes anda menjalankan ini program pada komputer selain daripada, katakan,
perkakas CS50 ini, di mana saiz yang char
mungkin berbeza dari computer-- saya sendiri
ternyata bahawa saya boleh memanggil ini Pengendali sizeof, hanya meminta komputer,
apa yang saiz char pada komputer ini?
>> Dan dengan mendarabkan lima ini contohnya dengan saiz arang, yang
pada kebanyakan komputer akan hanya menjadi satu, malloc
akan memperuntukkan bagi saya ini besar sebahagian memori di sini di sebelah kanan.
Dan ia akan return-- ia adalah function-- yang jadi
akan kembali kepada saya apa?
PENONTON: Alamatnya?
DAVID J. MALAN: Alamat apa?
PENONTON: Daripada memori ia diperuntukkan?
DAVID J. MALAN: Daripada memori ia diperuntukkan.
Jadi saya tidak tahu, terus-terang, di mana ini akan berakhir.
Saya akan mencadangkan ia akan berakhir di 0x88.
Benar-benar sewenang-wenangnya, tetapi di tempat lain selain 0x50,
kerana sistem operasi, apa yang Windows dan Mac OS lakukan untuk saya, adalah
memastikan bahawa ia memberi saya ketulan berbeza RAM.
>> Jadi ini adalah nilai di mana ini sebahagian memori mungkin berakhir.
Jadi ini adalah apa yang berakhir di sini, 0x88.
Jadi sekarang jelas, saya boleh memahami ini tidak sama seperti ini,
kerana mereka menghala ke arah ketulan berbeza ingatan.
Jadi, jika saya kini benar-benar mahu untuk menyalin ini dalam, mari kita buat penyelesaian yang dicadangkan anda.
>> Mari kita pergi, buat untuk gelung, dan melakukan t kurungan i mendapat s kurungan i.
Oleh kerana sekarang saya boleh menggunakan ini notasi pelbagai-suka,
kerana walaupun malloc sangat secara umum saya memperuntukkan ingatan,
ingatan adalah bait hanya berdampingan.
Bait, bait, bait, kembali ke belakang ke belakang.
>> Saya boleh pasti sebagai programmer memperlakukannya sebagai array, yang
ertinya saya boleh menggunakan ini akhirnya akrab notasi hanya beberapa kurungan persegi.
>> Jadi biarlah saya berhenti di sana, kerana ini adalah banyak sekali gus, walaupun
walaupun idea asas imbasan kembali adalah rentetan itu, selama ini,
bukan jenis data baru per se.
Ia hanya satu penunjuk yang dipanggil, alamat aksara,
yang hanya bermakna ia sebilangan bahawa dengan konvensyen manusia
kita cenderung untuk menulis sebagai 0x sesuatu.
>> Tetapi ia hanya nombor, 33 seperti Oxford Street,
yang berlaku untuk menjadi Alamat bangunan CS ini.
Apa-apa soalan mengenai butiran ini?
Yeah?
>> PENONTON: Mengapa kita semak untuk t sama dengan nol?
>> DAVID J. MALAN: Mengapa kita memeriksa t sama dengan nol?
Jika kita membaca documentation-- yang question-- hebat untuk malloc,
ia akan berkata dalam cetakan halus, kadang-kadang malloc mungkin kembali batal,
seperti GetString.
Dan sesungguhnya GetString kembali null jika, sebaliknya, malloc kembali batal,
kerana GetString menggunakan malloc.
>> Dan yang mungkin berlaku jika OS, Mac OS, Windows, apa sahaja, semata-mata
daripada memori untuk anda.
Jadi, apa yang berlaku di sana.
>> Dan biarlah saya mendedahkan satu perkara lain yang mungkin akan meniup fikiran anda
atau benar-benar terlalu jauh lebih garisan.
Tetapi saya tarik yang sama untuk gelung untuk menyalin,
yang masa lalu, ingat adalah ini. t kurungan i mendapat s kurungan i.
>> Nice dan user-friendly.
Terasa seperti Minggu Dua lagi.
Tetapi versi ini sebenarnya boleh ditulis semula kerana ini, yang kelihatan samar.
Ia adalah satu teknik yang dikenali sebagai penunjuk aritmetik, alamat aritmetik.
Tetapi mengapa ini berfungsi?
>> Sekarang annoyingly, yang pengarang C memutuskan untuk menggunakan
simbol * untuk tujuan yang berlainan.
Kita telah melihat ia digunakan sekali pun, char *, yang bermaksud "memberi saya pembolehubah
itu akan mengandungi alamat char a. "
* Jadi char dalam konteks itu bermaksud "memberi saya pemboleh ubah."
>> Malangnya, jika anda menggunakan * tanpa perkataan di hadapannya, seperti arang,
ia kini dikenali sebagai Pengendali dereference.
Dan kita akan melihat lebih banyak daripada ini tidak lama lagi.
Tetapi ia hanya bermaksud "pergi ke sana."
Ia seperti mengatakan, jika seseorang menyerahkan saya di atas sekeping kertas "33 Oxford Street,"
jika saya buat "* 33 Oxford Street," yang bermakna "Pergi jalan ke bangunan CS itu."
>> Jadi * ertinya hanya pergi ke sana jika tidak ada perkataan di hadapannya.
Jadi apa yang t, menjadi jelas?
t ialah alamat sebahagian daripada memori yang telah diberikan semula kepada saya.
adalah alamat apa, menjadi jelas, dalam contoh kita telah berbincang,
daripada Gabe huruf kecil?
adalah alamat daripada--
PENONTON: string ini.
DAVID J. MALAN: Daripada nama asal Gabe ini.
Jadi ia alamat sebahagian memori ini.
Jadi, jika saya katakan t + i-- i, notis, hanya kawan lama kami.
Ia hanya satu pembolehubah indeks yang yang iterating dari sifar ke atas sehingga
dengan panjang tali s.
Jadi ia akan menjadi sifar, maka satu, kemudian dua, kemudian tiga, kemudian empat.
Jadi mari kita memasang ini baru Keping teka-teki Scratch-suka, jika anda akan,
walaupun, sekali lagi, sintaks adalah jauh lebih sukar difahami berbanding Scratch.
Jadi t adalah alamat + i akan memberi saya
nombor, kerana semua ini adalah nombor yang kita telah lukisan sebagai hex.
Tetapi mereka hanya nombor.
>> Jadi, jika alamat t kita berkata adalah 0x88, 0x88 apa yang ditambah sifar.
Walaupun anda tidak selesa dengan hex lagi, mengambil meneka.
>> PENONTON: asal.
>> DAVID J. MALAN: Masih 0x88.
Jadi apakah * 0x88 bermakna?
Ia bermaksud, "pergi ke sana" yang bermaksud berkesan, "meletakkan jari anda di sini."
Dan sekarang di sebelah kanan ungkapan ini, * dan kemudian di parens,
s + i bermakna s, yang merupakan menangani di sini g kecil.
s + 0 adalah, sudah tentu, s, apa sahaja adalah.
>> Jadi sekarang, ia * s, yang seperti 33 * Oxford Street bermakna pergi ke alamat yang
s.
Jadi di sini adalah jari ini, tangan kanan.
Jadi, apa yang saya akan menyalin ke apa?
Perkara yang di sebelah kanan, yang merupakan Gabe, g sedikit di sini, ke sini.
>> Dan kesan yang lelaran pertama gelung,
seperti yang dicadangkan walaupun ia kelihatan gila lebih rumit daripada apa-apa
yang kita lihat sebelum ini, adalah semata-mata mengatakan pergi di sini dan menyalin aksara yang di sini.
Ia memberikan anda peta untuk kedua-dua lokasi.
>> Dan kita akan melihat lebih banyak daripada ini.
Tetapi untuk sekarang, harapan hanya kepada memperkenalkan beberapa idea-idea asas.
Dan sesungguhnya, mari kita lihat satu program akhir di sini,
dan kemudian claymation yang dijanjikan, yang akan membuat segala-galanya hak semua.
Baiklah.
Jadi biarlah saya membuka up-- ada kita pergi.
Oleh itu, marilah me-- kita akan kembali untuk gambar ini tidak lama lagi.
Biar saya membuka contoh terakhir ini di sini.
>> Jadi di sini adalah super, super program yang Kuasa melakukan
apa-apa dalam kehidupan yang melakukan yang berikut.
Ia pertama mengisytiharkan dua pembolehubah, x dan y, yang tidak nombor kali ini,
per se.
Mereka bukan integer, per se.
Mereka nampaknya int *.
Jadi, sesiapa sahaja, apa yang dimaksudkan jika jenis data, pembolehubah anda,
adalah jenis int * bintang?
Itulah alamat int satu.
>> Jadi saya sudah tidak tahu di mana ia adalah lagi.
Ia hanya bermaksud "meletakkan, akhirnya, alamat satu int di sini. "
0x50, 0x88, di mana ia adalah di ingatan, alamat akan ada.
Dan itulah yang y adalah akan menjadi, juga.
>> Jika saya kini mengatakan x = malloc (sizeof (int)), ini adalah cara yang mewah untuk mengatakan,
hey sistem operasi, melalui malloc, memberi saya memori yang cukup untuk saiz
daripada int, yang mungkin akan menjadi 32 bit atau empat bait.
>> Jadi apakah malloc kembali?
Malloc kembali alamat.
Jadi apa yang akan mendapat disimpan di dalam x?
Alamat sebahagian daripada ingatan, empat bait, malloc yang
hanya dijumpai untuk saya dengan meminta sistem operasi.
>> Sekarang Sementara itu, garis empat di sini, * x = 42.
Hanya untuk jelas, apa yang berlaku di bawah sana?
Di sebelah kiri, * x.
itu seperti * 33 Oxford Street.
Jadi * x bermaksud apa?
>> PENONTON: Pergi ke.
>> DAVID J. MALAN: Pergi ke alamat itu.
Di mana sahaja bahawa sebahagian daripada ingatan adalah, pergi kepadanya.
Dan meletakkan apa yang ada, jelas?
PENONTON: 42.
DAVID J. MALAN: 42.
Baiklah, * y, idea sama.
Pergi ke alamat dalam y.
Letakkan nombor 13 ada, tetapi apa yang y pada masa ini?
PENONTON: Tidak ada memori untuk y.
DAVID J. MALAN: Ada ada memori untuk y.
Jadi apakah y mungkin mengandungi, seperti yang kita telah berkata?
>> PENONTON: Sampah.
>> DAVID J. MALAN: Sesetengah nilai sampah.
Sekarang, nilai sampah masih nombor.
Ia masih boleh dikelirukan dengan alamat.
Ia seolah-olah seseorang menulis sesuatu sesuatu ke bawah,
dan saya disalah tafsir sebagai makna beberapa bangunan di jalan.
Dan jika anda hanya cuba untuk pergi ke beberapa bangunan yang bukan milik anda,
atau beberapa sebahagian memori anda tidak mempunyai telah diberikan, perkara-perkara buruk mungkin berlaku.
Komputer mungkin kemalangan, atau lain-lain tingkah laku mungkin berlaku tidak dapat ditentukan.
>> Jadi intro, kemudian, untuk Binky adalah ini.
Saya masih ingat, 20 beberapa tahun ganjil kemudian,
di mana saya adalah apabila saya akhirnya difahami petunjuk.
>> Yang mengatakan, jika anda meninggalkan di sini dalam tiga minit
dan rasa saya tidak memahami petunjuk, menyedari
Saya telah diingati kerana 20 tahun atas sebab tertentu gila
bila dan mengapa ia akhirnya tenggelam dalam, duduk dengan pengajaran saya
rakan-rakan, Nishat Mehta dalam belakang Dewan Makan Eliot.
Sekarang, saya ingat ini kerana ini adalah
salah satu topik yang saya, di tertentu, bergelut dengan.
Dan kemudian, ia akhirnya diklik, seperti saya berani mengatakan banyak topik
akhirnya akan.
Dan kini, untuk membuat yang merasakan semua lebih bahagia dan semua yang lebih meyakinkan,
mari kita lihat akhir kami lepas tiga minit di sini di Binky,
daripada rakan kami, Nick Parlante dari Stanford.
>> [VIDEO MAIN SEMULA]
>> -Hey, Binky.
Bangun!
Ia adalah masa untuk pointer menyeronokkan.
>> -Apa Itu?
Belajar mengenai petunjuk?
Oh, goody!
>> -Well, Untuk bermula, saya rasa kita akan memerlukan beberapa petunjuk.
>> -OK.
Kod ini memperuntukkan dua petunjuk, yang boleh menunjukkan kepada integer.
-OK.
Well, saya melihat kedua-dua petunjuk, tetapi mereka seolah-olah tidak menjadi menunjuk ke apa-apa.
>> -Itu Betul.
Pada mulanya, petunjuk tidak menunjukkan apa-apa.
Apa yang mereka menunjukkan dipanggil pointees, dan menetapkan mereka itu
langkah yang berasingan.
>> -Oh, Betul, betul.
Saya tahu bahawa.
Yang pointees adalah berasingan.
Er, jadi bagaimana anda memperuntukkan pointee satu?
>> -OK.
Nah, kod ini memperuntukkan yang pointee integer baru,
dan ini sebahagian set x untuk menunjukkan kepadanya.
>> -Hey, Yang kelihatan lebih baik.
Oleh itu, ia melakukan sesuatu.
>> -OK.
Saya akan dereference x penunjuk untuk menyimpan nombor 42 ke dalam pointee itu.
Untuk silap mata ini, saya perlu saya Magic Wand of penyahrujukan.
>> Your Magic Wand of penyahrujukan?
Bahawa- yang hebat.
>> -Ini Adalah apa kod kelihatan seperti.
Saya hanya akan menubuhkan nombor tersebut, dan [POP]
>> -Hey, Melihat.
Terdapat ia pergi.
>> -So Melakukan dereference pada x berikut anak panah untuk mengakses pointee itu.
Dalam kes ini, sebuah kedai 42 di sana.
Hey cuba menggunakannya untuk menyimpan bilangan 13 melalui penunjuk lain, y.
>> -OK.
Saya hanya akan pergi ke sini untuk y, dan mendapatkan nombor 13 set up.
Dan kemudian, mengambil Wand daripada Penyahrujukan dan hanya [BUZZ]
>> -Oh!
>> -Oh, Hey!
Yang tidak berjaya.
Katakanlah, Binky, saya tidak fikir penyahrujukan y adalah idea yang baik, kerana anda tahu,
menubuhkan pointee yang adalah langkah yang berasingan.
Dan saya tidak fikir kita pernah melakukannya.
>> Titik -Good.
Yeah.
Kami diperuntukkan penunjuk y, tetapi kita tidak menetapkannya untuk menunjukkan pointee a.
>> -Sangat Taat.
-Hey, Anda mencari yang baik di sana, Binky.
Bolehkah anda menetapkan ia supaya y titik untuk pointee yang sama seperti x?
>> -Sure.
Saya akan menggunakan Wand Magic saya Penyerahan Hak pointer.
>> -ialah Yang akan menjadi masalah seperti sebelum ini?
-Tiada.
Ini tidak menyentuh pointees.
Ia hanya mengubah satu penunjuk kepada menunjuk kepada perkara yang sama seperti yang lain.
>> -Oh, Saya melihat.
Sekarang y mata kepada tempat yang sama x.
Jadi tunggu.
Sekarang, y adalah tetap.
Ia mempunyai pointee a.
Jadi, anda boleh mencuba Wand daripada Penyahrujukan lagi untuk menghantar 13 ke atas.
>> -Uh, OK.
Di sini ia pergi. [POP]
>> -Hey, Melihat itu.
Sekarang penyahrujukan kerja-kerja y.
Dan kerana petunjuk berkongsian bahawa satu pointee, mereka berdua melihat 13.
Yeah.
Berkongsi, apa sahaja.
Jadi kita akan bertukar tempat sekarang?
>> Oh, melihat.
Kami keluar dari masa.
>> -But--
>> -Hanya Ingat tiga peraturan pointer.
Nombor Satu, struktur asas adalah bahawa anda mempunyai penunjuk,
dan ia menunjuk kepada pointee a.
Tetapi penunjuk dan pointee adalah berasingan,
dan kesilapan yang sama adalah untuk menubuhkan penunjuk,
tetapi lupa untuk memberikan pointee a.
>> Nombor Dua, penunjuk penyahrujukan daftar masuk bermula pada penunjuk
dan mengikuti anak panah ke atas untuk mengakses pointee itu.
Seperti yang kita semua tahu, ini hanya berfungsi jika terdapat
yang pointee, yang jenis mendapat kembali Peraturan Nombor Satu.
>> Nombor Tiga, penunjuk tugasan mengambil masa satu penunjuk
dan perubahan itu untuk menunjuk kepada pointee sama seperti penunjuk lain.
Jadi selepas tugasan, kedua-dua petunjuk
akan menunjukkan kepada pointee yang sama.
Kadang-kadang, yang dinamakan perkongsian.
Dan itu semua ada kepadanya, benar-benar.
Selamat tinggal sekarang.
[VIDEO AKHIR MAIN SEMULA]
DAVID J. MALAN: Itu sahaja untuk CS50.
Kami akan melihat anda minggu depan.