>> [MUSIC PLAYING]
Camille REKHSON: Hi, semua orang.
Selamat datang di kuis CS50 nol ulasan sesi.
Aku Camille.
Dan aku akan pergi atas beberapa topik dengan Anda
orang hari ini untuk membantu Anda mempersiapkan kuis.
Jadi, inilah kami non lengkap daftar topik Anda
harus akrab dengan untuk kuis.
Ini diambil langsung dari silabus.
Aku tahu sepertinya banyak.
Tapi percayalah, Anda telah belajar semua hal-hal ini dalam beberapa minggu terakhir.
>> Jadi kita akan pasti akan lebih banyak hari ini.
Tetapi juga mengambil beberapa waktu pada Anda sendiri untuk meninjau hal-hal ini.
Dan jika Anda tidak akrab dengan apa beberapa hal-hal ini,
pastikan Anda meminta salah satu dari kami.
Juga, untuk kata resmi pada kuis, pergi ke link ini.
Ini akan memiliki semua informasi yang dengan kamar yang Anda butuhkan untuk masuk,
berpisah abjad, dan juga beberapa tips tentang apa bahan
Anda harus belajar, dan jenis pertanyaan kuis yang dapat Anda harapkan.
Jadi pastikan untuk memeriksa yang keluar.
>> Juga, beberapa tips ketika Anda sedang mempersiapkan untuk ujian.
Berlatih coding di atas kertas.
Aku tahu kau sudah terbiasa untuk memiliki cek IDE untuk kesalahan Anda untuk Anda,
dan it's-- ketika Anda mengetik itu, itu sedikit berbeda daripada memiliki
untuk menulis hal-hal.
Jadi berlatih melakukan beberapa coding.
Beberapa fungsi yang baik untuk berlatih melakukan yang strlen dan atoi,
melihat apakah Anda bisa menulis mereka keluar pada Anda sendiri.
Jadilah akrab dengan set masalah.
Kebanyakan tahun ada pertanyaan yang berhubungan
untuk beberapa materi masalah set.
Jadi pastikan bahwa Anda memahami bagaimana melakukan semua set masalah.
>> Mencoba melakukan beberapa kuis tua di bawah kendala waktu 75 menit.
Banyak kuis dapat jenis panjang.
Jadi itu adalah cara yang baik untuk memberikan sendiri beberapa praktek,
dan berapa lama itu akan membawa Anda, dan bagaimana Anda
harus membagi waktu Anda untuk memastikan Anda menyelesaikan segala sesuatu dengan akhir.
Dan juga, Anda mendapatkan halaman satu, dua lembar referensi sisi
bahwa Anda dapat menulis apa pun yang Anda ingin untuk menggunakan selama kuis.
Jadi, ketika Anda sedang menciptakan itu, itu juga
cara yang hebat untuk belajar karena Anda akan jenis meninjau hal-hal
Anda sedang menulis itu.
>> Jadi pertanyaan umum tentang kuis, atau cara kerjanya?
Ya.
>> AUDIENCE: Will bahwa daftar topik bahwa Anda hanya menunjukkan akan tersedia untuk kita
on line?
>> Camille REKHSON: Seluruh Slide ini Acara akan diposting ke website.
Juga, video review hari ini sesi akan di website.
Jadi jangan terlalu khawatir tentang menulis hal-hal bawah seluruh.
Itu semua akan berada di sana.
Ada pertanyaan lain?
OK, jadi mari kita mulai.
>> Jadi satu hal untuk menjadi akrab dengan adalah jenis data yang berbeda dan ukuran
bahwa mereka mengambil.
Ini juga dapat menjadi hal yang besar untuk menuliskan pada lembar referensi Anda,
hanya untuk memastikan Anda ingat semua ini.
Tapi-- sehingga karakter adalah 1 byte.
Int adalah 4 byte.
Sebuah panjang, lama, yang pada dasarnya lebih ruang untuk integer, adalah 8 byte.
Sebuah float adalah 4 byte.
Sebuah ganda, yang pada dasarnya memberi Anda lebih banyak ruang untuk menyimpan pelampung, adalah 8 byte.
Dan kemudian pointer juga 8 byte.
Pertanyaan tentang ini?
>> Jadi biner adalah topik yang lain kita sudah ditutupi sedikit semester ini.
Jadi mari kita lakukan beberapa berlatih dengan mengkonversi
antara biner dan desimal.
Jadi ada yang punya ide apa yang pertama akan?
Siapa saja?
Ya, itu 42.
Jadi, jika Anda ingat, setiap tempat di biner
pada dasarnya seperti 2 berkuasa bahwa tempat itu.
>> Sehingga tempat pertama adalah 2 ke 0 kekuasaan.
Dan kami memiliki 0 sana, jadi tidak ada.
Tempat berikutnya adalah 2 pangkat pertama.
Dan kita memiliki 1 ada, sehingga pada dasarnya adalah 2.
Tempat berikutnya adalah 2 sampai kedua, yaitu 4.
Kami tidak memiliki apa-apa di sana.
Tempat berikutnya adalah 2 sampai lebih ketiga, yang akan menjadi 8.
Dan kami memiliki satu di sana.
Dan kita terus.
Bahwa last-- terjauh ke yang tersisa adalah di mana kita memiliki 32.
Dan, kita pada dasarnya memiliki 32 ditambah 8 ditambah 2 untuk mendapatkan 42.
Ada pertanyaan?
>> AUDIENCE: Apa subscript untuk?
>> Camille REKHSON: subscript The pada dasarnya memberitahu kita itu biner.
Jadi ada 2 ada.
Jika ada like-- di depan satu, atau ketika kita mengkonversi desimal
ke biner, ada 10 menunjukkan kepada kita bahwa jumlah ini awalnya dalam desimal.
>> AUDIENCE: Terima kasih.
>> Camille REKHSON: Ya.
Pertanyaan lain yang satu itu?
OK, jadi mari kita coba berikutnya satu maka, desimal ke biner.
Jadi mengambil 50 dan menempatkan bahwa dalam biner.
Bagaimana Anda melakukan itu?
Ya.
>> AUDIENCE: 110.010.
>> Camille REKHSON: Ya.
Jadi satu-- cara mudah untuk berpikir tentang mengkonversi dari desimal ke biner
adalah to-- sering membantu untuk menuliskan apa kekuatan yang berbeda dari 2 yang.
Dan kemudian pergi melalui itu, dan melihat apapun yang tertinggi dari mereka
adalah bahwa Anda dapat dimasukkan ke dalam ke angka desimal tanpa melampaui itu.
>> Jadi dalam hal ini, salah satu kekuasaan 2 adalah 32.
Jadi 32 masuk ke 50.
Tapi kekuatan berikutnya akan 64, yang jelas tidak sesuai dengan 50.
Jadi tertinggi yang kita miliki adalah 32.
Yang berikutnya ke 16.
Dan 32 ditambah 16 hanya 48.
Sehingga masih cocok dengan 50.
Jadi kita punya 1 di kedua dari mereka.
Dan kemudian jika kita terus turun, satu-satunya hal yang kita perlu meninggalkan
adalah 2 lebih untuk mendapatkan 48-50.
Jadi kita memiliki 1 di posisi itu, dan 0 di posisi terakhir.
Karena tidak ada di 2 ke tempat-0 th.
Pertanyaan pada mengkonversi desimal ke biner?
>> Jadi sekarang mari kita coba melakukan Selain beberapa biner.
Bagaimana bila Anda menambahkan dua sampai?
Ya.
>> AUDIENCE: 11100.
>> Camille REKHSON: Ya.
Jadi melakukan penambahan biner cukup sama seperti melakukannya dalam desimal.
Kecuali jika Anda memiliki dua makhluk 1 ini ditambahkan bersama-sama, 1 ditambah 1 adalah 2,
tapi 2 dalam biner adalah 1 0.
Jadi, Anda harus membawa 1, dan menjaga membawa untuk orang-orang beberapa kolom.
Dan selain itu, hanya menambahkan normal.
Pertanyaan itu?
Ya.
>> AUDIENCE: Maaf, apa adalah tempat terakhir?
Ada enam angka.
Jadi kolom paling kiri, nilai apa itu?
Camille REKHSON: Di satu bawah ini?
AUDIENCE: Di atas satu, untuk 50.
Camille REKHSON: Untuk 50?
Oh, jadi yang paling kiri adalah 32.
>> AUDIENCE: 32?
>> Camille REKHSON: Ya, jadi itu akan menjadi 32, 16, kemudian 8, 4, 2, atau 1 0--.
Yah, itu 2 yang ke nol, yang 1.
Ya.
Pertanyaan lain tentang hal ini?
OK, jadi maka kita akan melakukan sedikit dengan heksadesimal.
Jadi mungkin ini sedikit kurang akrab,
karena saya tahu kami telah melakukan lebih banyak dengan biner.
Tapi cara yang sangat baik untuk berpikir tentang heksadesimal
adalah untuk memecah biner jumlah menjadi 4 potongan bit.
Karena setiap 4 bit dari bilangan biner pada dasarnya
salah satu nomor heksadesimal.
>> Jadi jika kita memiliki satu pertama ini, kami memiliki dasarnya delapan 1 ini.
Jadi mereka dapat dibagi up--
>> AUDIENCE: 255.
>> Camille REKHSON: Katakan itu lagi.
AUDIENCE: 255 dalam desimal, atau 0xFF dalam heksadesimal.
Camille REKHSON: Ya, itu.
Jadi, jika Anda membagi bahwa sampai menjadi dua potongan 4-bit,
kita pada dasarnya memiliki empat set 1.
Yang maximum-- yang pada dasarnya maksimum
kita bisa mendapatkan dengan 4-bit dalam biner.
Dan maksimal kita bisa mendapatkan untuk bahwa dalam heksadesimal akan menjadi F.
Jadi kita akan memiliki dua F.
Pertanyaan itu?
Ya?
>> AUDIENCE: Dapatkah Anda ulangi.
Camille REKHSON: Tentu.
Jadi masing-masing, pada dasarnya, tempat heksadesimal adalah
setara dengan 4-bit dari biner.
Jadi cara termudah untuk melakukannya adalah untuk istirahat itu menjadi 4-bit potongan.
Jadi dalam hal ini, kami memiliki delapan 1 ini.
Jadi jika kita membagi mereka menjadi dua potongan 4-bit,
kita akan memiliki dua set empat 1 ini.
Dan masing-masing dari mereka setara dengan F.
Jika Anda berpikir about-- Aku tahu otak kita
jenis kabel untuk berpikir lebih melalui desimal,
karena itulah apa yang kita digunakan untuk.
Jadi salah satu cara Anda bisa menganggapnya sebagai empat 1 adalah sama dengan 15 dalam desimal.
Dan 15 dalam heksadesimal adalah F. Jadi itu cara lain Anda dapat memikirkan itu.
Ya.
>> AUDIENCE: Apa 0x untuk?
>> Camille REKHSON: The 0x menunjukkan bahwa itu heksadesimal.
Jadi kita hanya menempatkan bahwa awalan ada, biasanya.
Pertanyaan lain itu.
OK, jadi mari kita coba akan cara lain kemudian.
Dalam hal ini kita have-- maaf?
AUDIENCE: [tidak terdengar].
Camille REKHSON: Kami akan biner.
Jadi, pergi ke arah lain.
Tapi dalam kasus ini, kami memiliki 5 dan A. Jadi, jika kita berpikir tentang hal ini,
jika masing-masing dari those-- 5 dan A adalah berdua akan mewakili sepotong 4-bit,
bagaimana Anda akan mengatakan 5 dalam biner?
>> AUDIENCE: 0101.
>> Camille REKHSON: Ya, jadi itulah 0101 bagian.
Dan kemudian bagaimana Anda akan mengatakan A in--
>> AUDIENCE: 10.
Camille REKHSON: Katakanlah itu-- maaf?
AUDIENCE: 10.
Camille REKHSON: Ya, jadi itulah bagian kedua dari itu.
Dan kemudian, jika Anda menempatkan kedua bersama-sama, itu
bagaimana Anda mendapatkan penuh biner untuk heksadesimal tersebut.
Ya?
>> AUDIENCE: Untuk mengetahui bahwa A adalah 1010, Anda harus menghafal itu?
Atau dapat Anda like--
>> Camille REKHSON: Jadi jika you-- differe-- sehingga
ketika Anda akan melalui biner, pada dasarnya biner
memiliki 0 sampai 9 dan kemudian A melalui F sebagai 16-nya hal.
Jadi jika semua jalan 0 sampai 9-- jika you-- 9 dan kemudian A, pada dasarnya
jika kita dikonversi ke desimal, A akan seperti 10, B akan seperti 11.
Dan jika Anda berpikir tentang biner 1010 adalah 8 dan 2,
karena mereka adalah dua tempat-tempat yang menambahkan hingga 10, yang
adalah apa A setara dengan.
Jadi itu semacam mudah cara untuk berpikir tentang hal itu.
Pertanyaan lain pada heksadesimal.
>> OK, jadi sekarang kita akan mengambil a melihat operator bitwise.
Jadi ini pasti dapat datang pada kuis.
Aku tahu kita tidak bekerja dengan mereka banyak.
Tapi kami hanya akan melakukan sedikit review ini.
Jadi mudah-mudahan ini akan menjadi sedikit lebih akrab bagi Anda.
Jadi enam operator bitwise bahwa kita telah tercantum di sini.
Dan mereka memberitahu kami memanipulasi bit individual.
Jadi operator AND adalah ampersand tunggal.
Jangan bingung bahwa dengan ampersand ganda,
yang merupakan logika AND yang memungkinkan kita bandingkan dua hal.
>> Single DAN adalah bagaimana kita bisa memanipulasi hal bitwise.
Jadi ini memberikan kita hasil 1 jika kedua argumen bahwa kita sedang membandingkan
adalah same-- atau yang 1.
Dan bar vertikal, OR, akan memberikan kami 1 jika setidaknya salah satu dari mereka adalah 1.
Jadi pada dasarnya persis apa kata-kata menyiratkan.
DAN, jika dua bit 1, 1 dan 1 memberi kita 1.
Tetapi dengan OR, jika itu 0 atau 1, atau 1 atau 1, dalam kedua kasus,
kita memiliki 1 sebagai salah satu dari mereka.
Jadi kita akan mendapatkan 1.
AUDIENCE: Apa maksudmu yang mengatakan ia memberikan 1?
>> Camille REKHSON: The hasil. Jenis, seperti Anda
would-- jika Anda melakukan 0 dan 1, Hasil yang akan 1-- atau 0
dan 1 dengan hasil yang akan 0, maaf.
Ya, itu adalah jenis yang Hasil dari ekspresi.
Dan kemudian, simbol tanda sisipan ini adalah XOR, atau eksklusif OR.
Jadi itu berarti secara eksklusif satu atau tepatnya salah satu dari dua argumen sama dengan 1.
Dan kemudian akan memberikan 1.
>> Garis berlekuk-lekuk kecil adalah operator NOT.
Jadi tidak seperti sisa dari mereka, yang beroperasi pada sepasang bit,
operator tidak hanya membutuhkan satu bit, dan akan flip itu.
Jadi jika Anda give-- jika Anda melakukan TIDAK 0, itu akan memberi Anda 1.
Dan jika Anda melakukannya TIDAK 1, itu akan memberikan 0.
Ya?
>> AUDIENCE: Apa bedanya antara OR dengan satu baris
dan OR dengan dua?
Camille REKHSON: Jadi OR dengan dua baris adalah OR logis.
Jadi itulah untuk membandingkan dua bilangan bulat penuh, atau two--
untuk melihat apakah hal-hal yang sama.
Atau seperti melakukan hal ini sama dengan ini, OR ini sama dengan jenis hal ini.
Sedangkan bar tunggal OR, untuk melakukan hal-hal bitwise.
Ya.
>> AUDIENCE: Apa yang Anda maksud dengan bitwise?
>> Camille REKHSON: Jadi bitwise bekerja langsung dengan bit dalam biner.
>> AUDIENCE: Oh, saya melihat.
>> Camille REKHSON: Ya, jadi bekerja dengan 0 dan 1.
Kami akan melakukan beberapa contoh ini setelah itu, hanya sehingga tidak terlalu membingungkan.
Dan kemudian dua terakhir adalah pergeseran kiri dan shift kanan.
Yang pada dasarnya kurang dari dua tanda-tanda atau dua lebih besar dari tanda-tanda.
Dan mereka bergeser ke bit jumlah yang diberikan dari tempat
yang Anda berikan ke arah.
Jadi baik akan bergeser ke kiri, atau ke kanan.
Ya?
AUDIENCE: Apa sintaks untuk menjalankan?
>> Camille REKHSON: Kami akan melalui contoh dalam detik.
Jadi mudah-mudahan, yang akan membantu.
Pertanyaan hanya apa di sini, before-- OK.
Jadi akan melalui beberapa contoh.
Mari kita mulai dengan yang DAN.
Apa yang akan kita dapatkan jika kita lakukan 0 DAN 1?
>> AUDIENCE: 0.
Camille REKHSON: OK, dan jika kita melakukan 1 DAN 1?
AUDIENCE: 1.
Camille REKHSON: Ya, bagaimana jika kita lakukan 0 OR satu?
AUDIENCE: 1.
Camille REKHSON: Bagaimana 1 OR 1?
AUDIENCE: 1.
Camille REKHSON: OK, bagaimana dengan 0 XOR 1?
AUDIENCE: 1.
Camille REKHSON: Dan 1 XOR 1?
AUDIENCE: 0.
Camille REKHSON: Kalian baik.
Bagaimana TIDAK 0?
>> AUDIENCE: 1.
Camille REKHSON: Dan TIDAK 1?
AUDIENCE: 0.
Camille REKHSON: OK, dan kemudian terakhir ini satu adalah satu kecil dengan pergeseran.
Jadi jika kita awalnya ditetapkan x menjadi 8, dan maka y adalah x bergeser ke kiri 3,
apa yang akan yang memberi kita?
>> AUDIENCE: [tidak terdengar].
Camille REKHSON: Katakan itu lagi.
AUDIENCE: [tidak terdengar].
Camille REKHSON: Jadi, ini benar-benar memberikan kita 64.
AUDIENCE: [tidak terdengar].
Camille REKHSON: Jadi aku hanya akan menulis ini di sini,
jadi ini membuat sedikit rasa.
Jika kita memiliki 2 ke 0, 2 ke 1, 2 ke 2, 2 sampai 3 akan menjadi 8.
Dan jika kita ingin mengubahnya 3 bit lebih ke kiri, yang akan menjadi 2 dengan 4,
2 ke 5, dan 2 ke 6, dan 2 ke 6 adalah 64.
Apakah itu masuk akal?
Iya nih.
>> AUDIENCE: Apakah pergeseran bahwa semua 1 ini dan 0 dari bilangan biner ke the--
>> Camille REKHSON: Ya.
Dan Anda tidak perlu khawatir pada kuis tentang ini menjadi negatif.
Kami tidak akan membuat Anda berurusan dengan pergeseran negatif dengan cara apapun.
Pertanyaan lain tentang hal ini?
Iya nih.
>> AUDIENCE: Jika itu bergeser ke kanan, adalah segala sesuatu yang wasn't-- apapun yang
awalnya tidak bagian dari hal 0?
>> Camille REKHSON: Ya, Anda akan hanya menambahkan 0 pada aslinya.
Ya.
>> AUDIENCE: Jadi apa yang 100 bergeser ke kanan tiga kali?
Camille REKHSON: 100 bergeser ke kanan,
sehingga akan mengambil semua 1 dan 0 dan hanya menggeser mereka
ke kanan sebanyak Anda itu bergeser ke kanan.
>> AUDIENCE: [tidak terdengar]?
Camille REKHSON: Nah, 100-- adalah Anda berbicara tentang 100 dalam biner,
atau 100 dalam desimal?
AUDIENCE: Maaf, 100 dalam biner.
>> Camille REKHSON: 100 dalam biner, jika Anda menggeser ke right--
jika Anda menggeser ke kanan sekali, itu akan menjadi 10.
Jika Anda bergeser ke kanan dua kali, itu akan menjadi 001.
Dan kemudian jika Anda menggeser lagi, Anda jenis kehilangan bit.
Ya, itu hanya 0.
Pertanyaan lain tentang hal ini?
Iya nih.
>> AUDIENCE: Jadi maka menjadi 000.
>> Camille REKHSON: Ya.
OK, jadi mari kita pergi melalui sedikit matematika ASCII.
Jadi karakter dasarnya dapat diperlakukan sebagai bilangan bulat
berdasarkan nilai-nilai ASCII mereka.
Jadi jika kita duduk int A sama dengan 65, int B sama dengan A plus 1, int arang C sama
D minus 1, dan arang D sama 68, apa yang akan mencetak di bagian bawah?
>> Jadi, kita mencetak these-- memberkati you-- kami
mencetak semua ini sebagai karakter didasarkan pada persen C.
Jadi kita pada dasarnya mencetak nilai karakter keempat
variabel-variabel ini.
Sebagai petunjuk, 65 adalah nilai ASCII modal A. Mungkin itu membantu.
Apa?
>> AUDIENCE: ABCD.
>> Camille REKHSON: Ya, jadi ini akan mencetak persis
ABCD karena kita mengatur int A sama dengan nilai ASCII dari A.
Jadi jika kita mencetak yang keluar sebagai karakter, kita hanya mendapatkan modal A,
A plus 1 akan menjadi modal B di ASCII.
D minus 1 akan menjadi modal C di ASCII.
Dan 68 adalah nilai ASCII D. Pertanyaan di ASCII?
Iya nih.
>> AUDIENCE: Jadi, kutip menandai sekitar A, apakah itu perubahan A ke ASCII?
>> Camille REKHSON: Ini uses-- itu count-- tanda kutip tunggal di sekitar A
membuat karakter.
Dan jika Anda sedang berhadapan dengan dalam jumlah form--
jadi ketika, seperti dalam kasus ini, itu sedang ditangani sebagai int--
maka akan berurusan dengan itu nilai ASCII.
Iya nih.
>> AUDIENCE: Apakah Anda menyarankan kita memiliki tabel referensi ASCII?
>> Camille REKHSON: Saya tidak think--
>> AUDIENCE: Atau akan itu hanya berurusan dengan ini?
>> Camille REKHSON: Saya pikir kita akan melakukannya dengan hal-hal yang mudah.
Saya tidak berpikir itu akan sakit untuk menuliskan mungkin
apa modal A dan huruf kecil A adalah, hanya apa rentang mereka mulai dengan.
Tapi saya tidak berpikir Anda perlu mengambil semua ruang untuk menempatkan meja ASCII seluruh.
Ya.
>> AUDIENCE: Apa bedanya antara mengatakan int A dan C arang,
seperti yang Anda lakukan di atas?
>> Camille REKHSON: Jadi itu hanya bagaimana yang tersimpan dalam memori.
Tapi Anda bisa mengobatinya dengan cara baik.
Seperti yang kita lihat di sini, kita lakukan cetak keluar A sebagai karakter.
AUDIENCE: Jadi itu sama dengan A?
Camille REKHSON: Ya.
Ada pertanyaan lain?
>> AUDIENCE: Jadi, persen C mengatakan mencetak char?
>> Camille REKHSON: Ya.
>> AUDIENCE: Jadi bahkan jika A hanya memiliki didefinisikan sebagai integer,
jika kita mencoba untuk mencetak arang sebagai 65, itu would--
Camille REKHSON: Ini akan pergi ke pada dasarnya pergi ke grafik ASCII
dan mendapat apa karakter dalam grafik ASCII untuk itu 65.
>> AUDIENCE: Terima kasih.
>> Camille REKHSON: Ya.
Iya nih?
>> AUDIENCE: Jadi jika Anda melakukannya% saya, saya%, Saya%,% aku, kan hanya print--
Camille REKHSON: Ya, jika Anda melakukan semua 4% saya, itu
akan mencetak ASCII nilai-nilai keempat ini.
Ada pertanyaan lain?
OK, jadi ruang lingkup, pada dasarnya ini membantu kita menentukan mana
variabel yang ada dalam program Anda.
Jadi kita sudah bicara tentang dua yang berbeda jenis lingkup, global dan lokal.
>> Jika sebuah variabel global scoped, itu berarti seluruh program Anda
memiliki akses ke variabel tersebut.
Dan jika Anda secara global lingkup variabel, Anda
menyatakan sebelum fungsi utama Anda.
Jadi hal itu dilakukan langsung dari kelelawar.
Dan kemudian seluruh Anda Program dapat mengaksesnya.
>> Jika itu hanya secara lokal scoped, yang variabel terbatas pada wilayah tertentu.
Jadi jika Anda menyatakan dalam untuk loop, hanya itu untuk loop dapat mengaksesnya.
Atau jika Anda menyatakan dalam fungsi tertentu,
hanya fungsi yang dapat mengaksesnya.
Pertanyaan pada lingkup.
>> OK, jadi fungsi prototyping.
Pada dasarnya karena C, ketika mengkompilasi, membaca top down.
Jika Anda menyatakan fungsi di akhir kode Anda,
compiler tidak tahu bahwa fungsi yang ada.
Jadi apa yang kita gunakan adalah prototipe, yang pada dasarnya memberitahu compiler,
fungsi ini ada, pergi mencari untuk itu kemudian dalam kode.
Jadi cara yang Anda lakukan prototipe fungsi
adalah persis bagaimana Anda memulai off menulis fungsi.
Anda memberikan jenis kembali, nama fungsi,
dan kemudian argumen bahwa fungsi yang mengambil.
>> Jadi, untuk melihat contoh cepat, dalam hal ini huruf fungsi kita bahwa kita gunakan di sini
pada dasarnya adalah fungsi kubus.
Jadi mengambil dalam integer dan mengembalikan kubus integer yang.
Jadi karena kita telah menulis bahwa Fungsi bawah fungsi utama,
dan kami ingin menggunakan output itu-- atau kita
ingin fungsi yang fungsi utama kami,
kita menempatkan cara prototipe di bagian atas program kami.
Dan kemudian ketika kita sebut dalam fungsi utama kami,
compiler tahu bahwa fungsi yang ditulis kemudian, dan akan pergi mencarinya,
dan akan menggunakannya dengan benar.
Pertanyaan tentang prototyping?
Iya nih.
>> AUDIENCE: Jadi apa gunanya?
Saya tidak mendapatkan titik prototyping.
Mengapa tidak hanya memiliki itu di sana?
>> Camille REKHSON: Nah jika itu di sini, maka ketika
Anda bisa melapisi kubus x fungsi utama Anda,
compiler akan tidak tahu bahwa fungsi kubus benar-benar ada.
>> AUDIENCE: tidak Bisa Anda hanya menaruhnya di depan?
>> Camille REKHSON: Ini praktek coding yang lebih baik
untuk meletakkannya di bawah fungsi utama Anda.
Jadi itu sebabnya kami akan melakukan prototyping tersebut.
Hanya karena, jika Anda memiliki banyak fungsi,
itu akan benar-benar berantakan untuk membaca semua fungsi yang
sebelum Anda sampai ke daging dari program Anda.
Ya, dan Anda harus q-- sebuah
>> AUDIENCE: Jadi, yang menyatakan variabel Anda di atas
sehingga Anda dapat mengaksesnya, membuat variabel global?
Apakah yang seperti ini mana itu menyatakan itu
di sana, sehingga tahu bahwa itu akan mengaksesnya nanti
dan Anda dapat menggunakannya?
>> Camille REKHSON: Ya.
Iya nih.
>> AUDIENCE: Haruskah the-- setiap tambahan fungsi Anda membuat kunci luar
hal ini, or--
>> Camille REKHSON: Ya, jika Anda menciptakan utama functions-- lainnya
sendiri adalah function-- jadi jika Anda sedang menciptakan fungsi lainnya,
mereka harus berada di luar.
Iya nih?
>> AUDIENCE: Apa persen D?
Camille REKHSON: Persen D adalah hal yang sama seperti persen I.
Hal ini mengacu pada bilangan bulat.
Iya nih.
>> AUDIENCE: Jadi apa perbuatan utama int?
Apa kekosongan itu?
Camille REKHSON: Void mengatakan dibutuhkan tidak argumen.
AUDIENCE: [tidak terdengar].
Camille REKHSON: Dapatkah Anda berbicara sedikit lebih keras, maaf?
AUDIENCE: Ya, maaf, mengapa Anda menempatkan membatalkan untuk yang pertama,
dan kemudian int masukan untuk yang kedua?
Camille REKHSON: Oh, untuk dua different-- untuk fungsi utama
versus fungsi kubus?
Jadi dalam fungsi utama, kita menggunakan void karena ada
ada parameter yang diambil di.
Sedangkan dalam kubus fungsi, kita memiliki sebuah input.
Itulah mengapa dikatakan int, masukan, karena ada argumen bahwa kita
mengambil dalam menjalankan fungsi kita.
Ya.
Apakah ada pertanyaan?
>> OK, dan kemudian dengan cepat floating-point ketidaktepatan.
Jadi kita memiliki tak terhingga banyaknya bilangan real.
Tapi hanya ada jumlah terbatas bit
yang bisa kita gunakan untuk menampilkan mereka angka, dan mewakili mereka.
Jadi kita berakhir dengan beberapa ketidaktepatan.
Dan nomor Anda tidak akan selalu cukup apa
Anda pikir mereka ketika Anda berurusan dengan floating-point.
Ini hanya sesuatu yang baik untuk tahu.
Pertanyaan tentang ini?
Iya nih.
>> AUDIENCE: Apakah mengacu ini dengan ide bit meluap
yang berada di kuliah?
Apakah itu sesuatu yang terpisah?
>> Camille REKHSON: Mereka benar-benar terpisah, yeah.
OK bagus.
PULAK GOYAL: Hi, semua orang.
Nama saya pulak, dan aku akan menjadi akan lebih pointer.
OK, jadi mari kita berpikir pertama tentang apa yang tampak seperti memori.
Jadi seperti yang Anda lihat di sini, kami mengambil memori dan kami membaginya
ke sekelompok blok.
Dan kami referensi masing-masing memblokir oleh alamat, kan?
Dan tidak ada yang ingat apa jenis notasi yang kita gunakan untuk menunjukkan alamat?
>> AUDIENCE: Heksadesimal, 0x.
>> PULAK GOYAL: Heksadesimal, kan?
Jadi 0x berarti kami berbicara tentang heksadesimal.
OK, jadi bagaimana kita menciptakan pointer?
Jadi kami mengambil jenis, kita menempatkan itu-- menambahkan bintang untuk itu,
dan kemudian kita menambahkan nama variabel.
Jadi contoh kita lihat adalah int star x, y bintang arang, dan mengapung mulai z.
Jadi ketika saya mengatakan int bintang x, bisa seseorang mengatakan padaku
apa yang saya jenis bicarakan di sana?
>> AUDIENCE: Lokasi disk.
>> PULAK GOYAL: Maaf, apa?
Bisa diulang?
AUDIENCE: Lokasi disk.
>> PULAK GOYAL: Jadi actually-- jadi apa Aku berarti, adalah ketika kita memiliki int bintang x,
kita katakan adalah menciptakan pointer, dan itu
dapat menyimpan alamat dari variabel itu int, kan?
Jadi dengan bintang arang y, kita menciptakan pointer
yang dapat menyimpan alamat dari variabel yang char.
Sehingga masuk akal untuk semua orang?
OK keren
>> OK, jadi dengan pointer, ada dua operasi penting yang dapat kita lakukan.
Ada referensi, dan ada yang dereferencing.
Ya?
>> AUDIENCE: Bisakah Anda pergi sedikit lebih lambat?
>> PULAK GOYAL: Tentu.
Ya, so-- ya, mengajukan pertanyaan saat aku pergi bersama jika you-- jika sesuatu yang tidak jelas.
Jadi kita telah referensi dan dereferencing.
Jadi, ketika Anda ingin mendapatkan alamat variabel, kemudian gunakan ampersand.
Jadi katakanlah saya menyatakan int x di suatu tempat.
Dan saya ingin mendapatkan alamat yang dan lulus dalam, saya akan melakukan ampersand x.
Dan ketika Anda ingin mendapatkan nilai yang terkait dengan pointer,
Anda menggunakan dereference operator, yang merupakan bintang.
>> Jadi katakanlah saya memiliki int bintang x, dan Aku sudah menunjuk ke sesuatu.
Jika saya ingin mendapatkan nilai apa itu menunjuk ke, saya hanya akan melakukan star x.
Apakah itu jelas?
Pertanyaan tentang itu?
Ya.
>> AUDIENCE: Jadi umumnya, Anda tidak akan dapat melakukan pada x dan bintang
x dengan x sama.
Apakah itu benar?
Karena jika x adalah variabel, maka Anda memiliki
yang harus dilakukan pada x untuk mendapatkan bahwa itu pointer.
Tetapi jika x adalah pointer, maka Anda perlu untuk melakukan star x untuk mendapatkan variabel.
>> PULAK GOYAL: Ya, jadi pertanyaan adalah tentang kapan
kita menggunakan star-- saat Anda akan menggunakan bintang,
dan ketika kita menggunakan ampersand, dan bisa kita
menggunakannya dengan jenis yang sama variabel?
Jadi biasanya jika Anda memiliki, misalnya, int x,
Anda akan sebagian besar akan menggunakan ampersand untuk mendapatkan alamat itu.
Karena itu tidak membuat akal untuk rasa hormat ke x.
Padahal, jika kita memiliki int bintang x, Anda akan menggunakan operasi dereference
karena akan tidak masuk akal untuk menggunakan x dalam kasus itu.
Apakah itu masuk akal?
>> AUDIENCE: Jadi Anda tidak bisa dan, dan kemudian pointer?
PULAK GOYAL: Jadi Anda teknis, sebenarnya
dapat melakukan ampersand dari pointer.
Tapi itu keluar dari lingkup kelas ini.
Untuk purpose-- untuk orang-orang Anda ' tujuan, setiap kali Anda memiliki pointer,
Anda ingin menggunakan operator dereference untuk mendapatkan nilai yang terkait dengan itu.
Dan ketika Anda memiliki biasa variabel, seperti int x,
Anda ingin menggunakan ampersand operator untuk mendapatkan alamat itu.
OKE?
>> OK, jadi mari kita lihat pointer dan apa yang terjadi di bawah tenda.
Jadi hal pertama yang saya lakukan di sini adalah menyatakan int x sama dengan 5.
Alamat variabel ini adalah 0x04, dan nilai 5.
Jadi mari kita lihat apa yang terjadi dengan baris berikutnya.
Jadi sekarang kita mendeklarasikan pointer.
Alamatnya adalah 0x08, dan yang Nilai adalah alamat x.
Apakah itu masuk akal untuk semua orang?
Pertanyaan tentang itu?
>> OK, dan sekarang mari kita lihat apa terjadi dengan baris berikutnya.
Jadi dengan baris berikutnya ini, kita memiliki alamat copy menjadi 0x10,
dan nilainya adalah 5.
Jadi alasan kita punya lima adalah kita berkata, kita dereference
pointer, yang kita menyatakan sebuah bintang int.
Dan sehingga went-- ketika kita dereference itu, katanya, OK, apa yang ada dalam 0x04 Slot.
Dan pergi ke itu.
Dan apa x adalah x0-- 0x04, dan nilai 5.
Apakah itu masuk akal?
Ya?
>> AUDIENCE: Mengapa alamat salinan ini hanya 4 byte di atas x pointer?
>> PULAK GOYAL: Ya, ini adalah kesalahan on--
>> Camille REKHSON: Jadi, ya, ingat ini ditulis dalam heksadesimal.
PULAK GOYAL: Oh, ya.
Camille REKHSON: Jadi ini sebenarnya 8 dan kemudian 16
karena kita mengatakan bahwa, pointer, ingat,
di IDE kami akan menjadi 8 byte panjang.
PULAK GOYAL: Ya.
Jadi hanya harus jelas, pointer 8 byte panjang.
Int adalah 4 byte.
Jadi alasan mengapa apa melompat dari 0x04 ke 0x08
karena kita harus melakukan lompatan dari 8 byte.
Dan kemudian for-- sejak copy hanya sebuah int,
itu 4 byte, yang merupakan setengah dari 8 byte.
Jadi kami hanya melompat ke 0x10, yang dua dari 0x08.
Ada pertanyaan lain?
OK, let's-- ya?
>> AUDIENCE: Mengapa tidak nilai int copy
hanya the-- mengapa 5 bukannya 0x04?
>> PULAK GOYAL: OK, mengapa 5?
OK, jadi ketika the-- jadi mari kita pertama berpikir tentang hal ini dalam hal jenis.
Jadi saya katakan int copy adalah sama dengan bintang pointer.
Jadi apa adalah jenis pointer?
Ini adalah bintang int.
Dan ketika saya dereference itu, Jenis menjadi int.
Jadi apa yang kita harapkan untuk menyimpan di sini sebenarnya merupakan int.
Apakah itu masuk akal?
AUDIENCE: Tentu, sedikit.
PULAK GOYAL: Jadi biasanya ketika Anda berpikir dalam hal jenis,
membantu Anda memahami apa yang jenis nilai yang harus pergi ke sana.
Sehingga Anda biasanya dapat menyingkirkan banyak kesalahan ini umum
dengan berpikir dalam hal jenis.
Biarkan aku pergi melalui slide sedikit lebih.
Dan kita bisa mendapatkan pertanyaan di akhir bagian pointer.
OK, jadi kami memiliki program kereta di sini.
Dan begitu juga anyone-- bisa seseorang mengatakan apa yang salah dengan program ini?
Tepat, sehingga apa yang kita mengharapkan untuk lakukan di sini
is-- apa yang ingin kita lakukan adalah mengambil variabel int x
dan mengubahnya itu-- membuatnya sama 5 bukan 3 dan kemudian mencetak itu.
Tapi itu tidak terjadi.
Dapatkah seseorang mengatakan padaku mengapa?
Iya nih?
>> AUDIENCE: Bila fungsi to_five mengambil x seperti itu argumen,
tidak mengambil x itu sendiri, tetapi bukannya menciptakan salinan, sebuah, itu.
Dan membentuk operasi itu.
Tapi karena itu, Anda tidak mengubah nilai sebenarnya dari x.
Karena Anda [tidak terdengar].
>> PULAK GOYAL: Benar, tepat, jadi ketika kita sebut
fungsi to_five, apa kita lakukan adalah berpikir,
memberi saya salinan nilai fungsi tersebut.
Fungsi itu, maka, akan dan melakukan beberapa manipulasi.
Tapi setelah itu kembali, sekarang keluar dari lingkup fungsi utama di sini.
Dan x masih, pada kenyataannya, sama dengan 3, dan kami mencetak 3.
OK, jadi mari kita lihat bagaimana hal ini terjadi.
>> OK, jadi tidak ada yang menyatakan.
Kemudian, di sini, x sama dengan 3.
Dan sekarang is-- pada posisi dua, satu masih belum di lingkup.
Dan sekarang kita pergi ke posisi tiga, di mana sekarang mengasumsikan nilai 3.
Pada empat, kita sekarang mengubah ke 5.
Tapi sekarang, ketika kita melompat kembali ke lima, yang merupakan pernyataan cetak,
adalah sekarang keluar dari ruang lingkup.
Dan x masih sama dengan 3.
Apakah ini masuk akal untuk semua orang?
OK, jadi sekarang mari kita bicara tentang bagaimana kita dapat menggunakan pointer untuk memperbaiki ini.
Apakah ada yang punya ide bagaimana kita bisa memperbaiki ini dengan menggunakan pointer?
>> AUDIENCE: Anda mengambil sebuah bintang int bukan sebuah int untuk to_five.
>> PULAK GOYAL: Maaf, bisa Anda berbicara?
>> AUDIENCE: Anda mengambil sebuah bintang int bukan sebuah int untuk to_five.
PULAK GOYAL: OK, ya.
Jadi mari kita pass-- bukan hanya lewat nilai, mari kita lulus dengan referensi.
Fungsi baru, kan?
Dan dengan melewati alamat, kami dapat melakukan manipulasi pada alamat.
Dan jadi kita benar-benar, pada kenyataannya, mengubah x.
Jadi mari kita lihat bagaimana yang bekerja.
>> OK, jadi dalam contoh ini kita tetap itu.
Kami telah mengubah tanda tangan kami dari to_five untuk mengambil di int
membintangi bukan hanya sebuah int sini.
Kemudian kita dereference ini dan menetapkan 5 untuk itu.
Dan sekarang akan ini, pada kenyataannya, mencetak 5.
Jadi mari kita lihat bagaimana langkah-langkah bekerja di sini.
>> Jadi dengan langkah pertama, tidak ada yang menyatakan belum.
Jadi di sini, dengan langkah kedua, kami telah mengatakan x sama dengan 3,
tapi masih keluar dari ruang lingkup.
Sekarang dengan baris ketiga, kita memiliki x masih sama dengan tiga.
Dan sekarang, kami telah melewati in-- apa disimpan dalam sekarang alamat x.
Apakah itu masuk akal untuk semua orang, bagaimana kita punya itu?
Benar, kita memiliki amper-- itu bagaimana kami melewati ampersand x ke fungsi
to_five.
Dan kemudian ke baris berikutnya, apa kita lakukan, adalah kita dereference.
>> Dan oleh dereferencing, kita dapat untuk mengubah nilai x 3-5.
Karena x tinggal di alamat 0x12.
Dan kemudian, akhirnya, ketika kita kembali kembali ke utama,
meskipun ini sekarang keluar dari lingkup, kami telah, pada kenyataannya, berubah x.
Dan itu adalah 5.
Pertanyaan tentang hal ini?
Ya?
>> AUDIENCE: Bisakah Anda ceritakan apa ampersand x adalah?
Saya pikir ampersand seperti DAN.
>> PULAK GOYAL: Ya, jadi kami menggunakan yang sama Simbol untuk banyak hal yang berbeda.
Jadi di sini, ketika Anda have-- di hal ini, ketika Anda memiliki,
Saya guess-- sehingga dalam kasus ini, ketika Anda sedang berhadapan dengan pointer,
ketika Anda menaruh ampersand di depan dari sebuah int, int variabel, atau char,
atau aliran, apa yang Anda katakan adalah, memberi saya alamat ini.
Tapi apa yang Anda pikirkan, kapan lagi Anda akan menggunakan ampersand adalah, katakanlah,
dalam sebuah pernyataan jika.
Anda memiliki yang benar, dan beberapa variabel yang mengevaluasi beberapa Boolean,
dan beberapa variabel lain yang memvalidasi beberapa Boolean
dan Anda ingin mendapatkan dan itu.
Maka Anda akan menggunakan ampersand.
SPEAKER 1: Ya, jadi hanya hari ini, kami telah berbicara tentang tiga penggunaan yang berbeda
dari ampersand.
Kami memiliki dua ampersands, yang apa pulak baru saja dijelaskan.
Kami memiliki satu ampersand, yang adalah apa yang dijelaskan Camille
sebelumnya, yang merupakan salah satu ampersand.
Dan itu sudah bitwise DAN.
Dan perhatikan bahwa kedua dan- bersyarat atau, maaf,
logika AND dan bitwise DAN, mereka memiliki dua nomor, kan?
Itu sesuatu yang Ampersand sesuatu ampersand,
sesuatu sesuatu ampersand.
Di sini, ketika kita hanya memiliki ampersand sesuatu, yang dereferencing.
>> PULAK GOYAL: Ya, pertanyaan besar.
Ya.
>> AUDIENCE: Mengapa sejalan 5a dan bintang yang menjadi N / A?
Mengapa mereka tidak hanya jenis mempertahankan nilai yang sama dari baris sebelumnya?
>> PULAK GOYAL: Karena kita sudah keluar fungsi.
Dan jadi apa happens-- jadi-UMPC sekarang kita
keluar dari ruang lingkup fungsi itu, apa yang terjadi sebenarnya
adalah mereka akan dihapus dari memori.
Ya.
>> AUDIENCE: Antara 3 atau 4 bintang sama dengan 5.
PULAK GOYAL: Ya.
AUDIENCE: Apa yang sebenarnya menunjukkan?
PULAK GOYAL: Apa artinya?
AUDIENCE: Ya.
PULAK GOYAL: Jadi pertanyaan adalah, apa yang
itu-- apa yang Anda lakukan secara online ketika kita mengatakan, bintang adalah sama dengan 5?
Jadi ingat bintang yang dereference operator.
Jadi ketika, dalam hal ini, adalah pointer.
Ini adalah bintang int.
Jadi ketika kita dereference oleh menggunakan bintang, apa yang kita katakan
adalah, pergi ke apa pun yang disimpan di alamat, disimpan dalam a-- sehingga take-- jadi,
sekarang, memiliki beberapa alamat yang tersimpan di dalamnya.
Pergi ke mana alamat poin ke, dan sekarang mengubah apa pun itu untuk lima.
Ya.
>> AUDIENCE: Dapatkah Anda mengatakan dalam istilah sederhana?
Mengubah alamat untuk 5.
>> PULAK GOYAL: Kami tidak mengubah alamat untuk 5.
A memiliki beberapa alamat di dalamnya, yang merupakan alamat dari variabel yang menarik.
Dan apa yang kita katakan ketika kita dereference adalah,
sekarang kami ingin change-- kita sekarang referensi
bunga variabel langsung.
Apakah itu masuk akal?
>> SPEAKER 1: Cara lain untuk berpikir dari itu go-- sehingga adalah alamat.
Bintang mengatakan pergi ke yang mengatasi dan melihat nilainya.
Dan sekarang set nilainya ke 5.
Jadi ia mengatakan, pergi ke alamat x, yang
akan menjadi apa yang disimpan dalam, dan mengubahnya ke 5.
PULAK GOYAL: Ya?
AUDIENCE: Jadi posisi mana pointer akan, alamat.
Tetapi nilai tersebut merupakan ditugaskan nilai berdasarkan alamat.
PULAK GOYAL: Ya.
Pertanyaan lain tentang hal ini?
AUDIENCE: Saya punya pertanyaan.
PULAK GOYAL: Ya, maaf.
AUDIENCE: Jadi, ketika Anda store-- sehingga jika Anda mengatakan [tidak terdengar] a.
PULAK GOYAL: Ya.
AUDIENCE: Apakah Anda harus menyimpan x dengan ampersand?
Mengapa kau tidak bisa hanya mengatakan x sebelum int Anda [tidak terdengar]?
PULAK GOYAL: So--
AUDIENCE: [tidak terdengar].
PULAK GOYAL: Jadi question-- Anda oh.
Jadi pertanyaan Anda, mengapa tidak bisa we-- untuk fungsi to_five, mengapa tidak bisa kita
hanya lulus x, kan?
>> AUDIENCE: Benar.
>> PULAK GOYAL: OK, ya, jadi ini lagi kembali ke diskusi kita pada jenis.
Jadi fungsi to_five sekarang mengharapkan jenis int bintang.
Jadi apa adalah jenis x?
X hanya sebuah int.
Tapi apa fungsi ini mengharapkan adalah bintang int.
Jadi mengharapkan variabel yang memiliki alamat yang tersimpan di dalamnya.
Jadi itulah bagaimana you-- menempatkan ampersand, dan jadi itu
bagaimana kita lulus dalam alamat, yang sekarang--
dan yang menafsirkan bahwa sebagai bintang int, ya.
Pertanyaan besar.
Pertanyaan lain tentang hal ini?
OK keren.
>> OK, jadi sekarang mari kita bicara tentang pointer aritmetika.
Jadi di sini, menambahkan dan mengurangkan i menyesuaikan pointer
oleh i kali ukuran jenis pointer byte.
Jadi mari kita lihat bagaimana yang terlihat seperti.
Jadi di sini, kami sudah menyatakan int x sama dengan 5.
Dan sekarang kita akan mendeklarasikan pointer y, dan lulus di alamat x ada.
Jadi kita harus itu.
Jadi x disimpan di 0x04.
Jadi sekarang y sama dengan itu.
Dan bisa seseorang mengatakan padaku apa yang mereka pikirkan akan terjadi ketika kita melakukan y ditambah sama dengan 1?
Ya?
>> AUDIENCE: Apakah akan mengubah ke 0 kali 0 8?
>> PULAK GOYAL: Ukuran, dan type--
>> AUDIENCE: Anda akan pindah alamat.
PULAK GOYAL: Ya itu was-- ya.
Benar sekali.
Sehingga akan berubah menjadi 0x08.
Dan because-- sehingga Anda akan menggunakan ini rumus, 1 kali ukuran pointer
dan pointer dari size--
>> [MAHASISWA menggerutu]
>> PULAK GOYAL: Benar.
>> [MAHASISWA menggerutu]
>> SPEAKER 1: Jadi jenis yang poin pointer to--
>> PULAK GOYAL: Apakah, yeah, ya, itu 4 byte.
>> SPEAKER 1: Jadi int adalah 4 byte.
>> PULAK GOYAL: Jadi jika kita telah a-- mari mengatakan kami menyatakan, saya kira, char.
Apa yang akan itu-- sehingga katakanlah kita memiliki x arang sama dengan atau sesuatu.
Dan kami memiliki alamat yang di 0x04, apa yang akan y ditambah equals 1 lakukan sekarang?
Maaf apa?
>> AUDIENCE: 0x05.
PULAK GOYAL: 0x05, benar.
Apakah semua orang melihat itu?
OK, dan sekarang mari kita mengatakan itu pelampung.
Apa yang akan terjadi?
Siapa saja?
Jadi mengapung adalah berapa banyak byte?
>> AUDIENCE: 4 bytes.
>> PULAK GOYAL: Benar.
Jadi itu akan menjadi hal yang sama seperti ini.
Keren.
OK, dan sekarang mari kita bicara tentang pointer dan array.
Jadi Anda melihat ini pada sebelumnya dua p set,
di mana kita bisa treat-- array begitu dan pointer tidak hal yang sama.
Tapi kita bisa memperlakukan array sebagai pointer.
Jadi di sini, kita memiliki array ini di sini, yang memiliki tiga slot.
Dalam kami slot-- pertama memiliki satu, dua, dan tiga.
>> Jadi jika we-- sehingga kita dapat menetapkan itu dengan mengatakan, kita memiliki array,
dereference itu.
Dan kemudian ketika kita dereference bahwa, apa yang kita benar-benar melakukan
adalah mengacu pada slot yang sama.
Jadi Array bintang sama dengan 1.
Kami bisa- bagaimana mungkin kita menulis itu-- apa
cara alternatif kita bisa menulis itu?
>> AUDIENCE: Array 0 sama 1.
>> PULAK GOYAL: Tepat, tidak semua orang melihat itu?
Hal yang sama sehingga dengan di sini.
Jadi ketika kita memiliki array yang ditambah 1, kami do-- sehingga even--
ingat dengan aritmatika yang kita hanya berbicara tentang, ketika kita melakukan ditambah 1
atau memindahkannya alih oleh 4 byte, benar.
Apakah semua orang melihat itu?
Dan sisi itu, ketika kita dereference itu, kita dapat mengatur bahwa untuk 2.
Dan itulah bagaimana kita mengatur blok sebelah 2.
Dan jadi alternatif cara untuk menulis yang juga akan berbagai braket
0 bracket sama dengan 1.
>> AUDIENCE: Apakah Anda memerlukan tanda kurung?
>> PULAK GOYAL: Ya, karena kau dereferencing seluruh kuantitas
Array ditambah 1.
OK, dan hal yang sama untuk array ditambah 2.
Pertanyaan tentang hal ini?
Ya.
AUDIENCE: Jadi array otomatis ditetapkan pada 0?
>> PULAK GOYAL: Array is-- maaf, apa?
>> AUDIENCE: Array adalah 0.
Alamat array hanya 0.
>> PULAK GOYAL: Jadi pertanyaannya adalah, adalah alamat array hanya 0?
Jadi, tidak ada, berbagai memiliki beberapa alamat.
Jadi ketika kita dereference itu, that's-- sehingga Anda dapat berpikir about--
benar seperti pointer menunjuk ke awal array.
Sehingga memiliki beberapa alamat.
Kami tidak tahu apa itu.
Tetapi ketika kita dereference itu, kita tahu itulah awal dari array.
Dan jadi ketika kita bergerak dengan 1, kita hanya bergerak
relatif terhadap mana alamat yang.
Ada pertanyaan lain?
Ya?
>> AUDIENCE: Jadi jika Anda melakukan Array braket ditambah 1--
PULAK GOYAL: Maaf, Aku-- bisa Anda berbicara?
AUDIENCE: Ya, jika Anda melakukan Array braket [tidak terdengar].
Jadi jika Anda menempatkan pointer-- yang
PULAK GOYAL: Maaf, saya tidak bisa mendengar Anda.
Dapatkah Anda mengatakan itu sekali lagi?
>> AUDIENCE: Kau OK.
>> PULAK GOYAL: OK, maaf.
OK keren.
Any-- ya.
Jadi, ketika Anda pergi dalam array braket 3--
>> PULAK GOYAL: Ya.
>> AUDIENCE: --isn't there-- tidak akan itu empat tempat seperti 0, 1, 2, dan 3?
Mengapa tidak int array yang 2?
>> PULAK GOYAL: Tidak, jadi hanya konvensi C is-- ketika kita mendeklarasikan array,
we-- jumlah kita diletakkan di sana adalah berapa banyak slot yang kita inginkan.
Tapi indeks dari array yang sebenarnya Array 0, berbagai 1, dan berbagai 2.
Jadi itu hanya konvensi tentang bagaimana kita menyatakan array.
Ya, pertanyaan lain?
Ya.
AUDIENCE: Jadi kita masih berbicara tentang pointer, kan?
PULAK GOYAL: Ya.
AUDIENCE: Bisakah Anda masih melakukan membintangi untuk array 0 sama dengan 1?
PULAK GOYAL: Tidak, tidak, so-- OK, jadi pertanyaannya adalah bisa
Anda hanya melakukan star braket berbagai nol, dan kemudian mengatakan bahwa sama dengan 1.
Jadi, tidak ada, apa yang kita katakan di sini adalah bahwa kita dapat think--
kita bisa memperlakukan array sebagai pointer.
Jadi kita have-- apa yang kita katakan adalah kami memiliki dua cara
sekarang referensi ke blok yang sama.
Jadi doing-- jika Anda memiliki array yang nol, jenis yang sekarang int.
Dan jika Anda mengambil bintang itu, Anda mendapatkan hal yang tidak valid.
Jadi apa yang kita katakan di sini, adalah ada dua cara alternatif
untuk merujuk pada blok yang sama.
Anda juga dapat melakukan berbagai bracket 0 sama dengan 1.
Atau Anda dapat melakukan dereference array, dan memiliki yang sama dengan 0.
Jadi hanya dua cara melakukan hal yang sama.
Ya.
>> AUDIENCE: Mengapa bukan ukuran int 1 untuk menambahkan to--
>> PULAK GOYAL: Ukuran int 1.
>> AUDIENCE: Karena itulah bergerak satu off.
>> PULAK GOYAL: Karena itulah hanya cara C bekerja.
Ini hanya cara pointer aritmatika didefinisikan.
Ini akan mengambil pointer.
Dan kemudian apa pun yang Anda tambahkan untuk itu, itu akan kalikan
dengan ukuran apa pun toko pointer adalah, ya.
Ya.
>> AUDIENCE: Jadi kalau kita dapat mengobati pointer dan array yang sama,
tetapi mereka berbeda.
Jadi apa yang membuat mereka berbeda?
Apa yang bisa kita lakukan dengan tidak satu tetapi tidak yang lain?
>> PULAK GOYAL: Untuk tujuan ini kelas, saya pikir it's-- apa yang you--
>> SPEAKER 1: Jadi, we-- OK, jadi, untuk Misalnya, jika Anda mengalokasikan memori
dan Anda memiliki pointer ke integer, misalnya.
Jika Anda mencoba untuk memulai melakukan aritmetik pointer
dan melampaui jumlah memori yang Anda dialokasikan, Anda akan mengalami kesalahan.
Kita tahu dengan array, kita mengatakan di depan waktu, OK, saya
ingin allocate-- ini pada dasarnya mengatakan, saya ingin mengalokasikan
cukup ruang untuk tiga bilangan bulat.
Dan jadi sekarang kita dapat memperlakukan memori seakan kami memiliki semua tiga dari mereka bilangan bulat.
Apakah itu semacam masuk akal?
>> PULAK GOYAL: Ya.
Ya.
>> AUDIENCE: Jadi bintang array, adalah bahwa menetapkan 1
dengan 0 indeks array?
PULAK GOYAL: Ya.
>> AUDIENCE: Jadi, apa setelah Dua baris berikutnya dalam hal the-- saya
memahami bahwa Anda sedang berusaha menggunakan aritmetik pointer di sini,
tapi sekali lagi, saya tidak mengerti apa pointer aritmatika.
Jadi array ditambah 1, Anda mengatakan bahwa Anda sekarang
akan ingin berbicara tentang indeks pertama ke array.
>> PULAK GOYAL: Benar, sehingga Alasan yang bekerja adalah array,
di sini, kita bisa memikirkan sebagai bintang int.
Dan jadi ketika kita pointer aritmatika di atasnya, ingat rumus mana
kita mengambil the-- Saya kira apa pun alamat saat ini,
dan kemudian ketika kita menambahkan 1 untuk itu, kita benar-benar
kalikan 1 dengan ukuran hal kita memanipulasi.
Jadi dalam hal ini, ukuran int.
Dan kemudian kami memindahkannya meneruskan oleh yang banyak.
>> SPEAKER 1: Jadi berpura-pura Anda memiliki bintang b array.
PULAK GOYAL: OK, ya.
SPEAKER 1: Dengan tangan Anda.
Kesini.
PULAK GOYAL: Atau aku bisa hanya-- ya.
OK jadi di sini-, sehingga susunan di mulai, tepat di sini.
Jadi ketika kita dereference array, kami hanya mengacu pada blok pertama di sini.
Tapi sekarang ketika saya melakukan berbagai ditambah 1, yang is-- panah yang sekarang di sini.
Apakah itu masuk akal?
Tepat, karena blok ini ukuran int, yaitu 4 byte.
Dan, apa yang kita lakukan adalah kita bergerak yang pointer oleh 4 byte lebih.
Setiap kali kita melakukan aritmatika di atasnya, itu akan selalu
memindahkannya dengan pertambahan 4 byte.
Karena ini adalah seperti bintang int.
Apakah itu masuk akal?
OKE.
>> AUDIENCE: Jadi hal-hal dalam array adalah 5 byte, kami akan memindahkannya 5 bytes--
>> PULAK GOYAL: Benar, jadi jika kita memiliki bintang char, kami akan memindahkannya dengan 1 byte saja.
Jadi dalam kasus bintang char, itu hanya akan memindahkannya alih oleh 1.
AUDIENCE: Untuk mendapatkan berikutnya Anda perlu sebuah bintang.
PULAK GOYAL: Ya, ya, apakah itu masuk akal?
SPEAKER 1: Kami dapat chatting tentang hal itu lagi nanti.
PULAK GOYAL: Yeah, yeah, pasti.
OK keren.
Mari kita lanjutkan ke bagian berikutnya.
SPEAKER 1: Oh, OK keren.
Ya, itu saya.
Baiklah, mengagumkan.
OK, keren, jadi sekarang kita ke sedikit informasi yang lebih umum tentang memori.
Juga, saya menghargai kenyataan bahwa mereka akan cukup cepat.
Ini banyak bahan untuk mendapatkan melalui dalam satu jam setengah.
Tapi jika ada topik Anda ingin pergi lebih mendalam ke dalam,
kita akan memiliki jam kantor minggu ini
di mana Anda dapat chatting dengan kami satu lawan satu.
Atau Anda bisa datang di berakhir dan kami akan mengobrol tentang hal-hal.
Dan seperti biasa, merasa ragu untuk mengajukan pertanyaan.
Mengagumkan.
Jadi, inilah gambaran kita memori yang yang kami lihat dalam kuliah miliar kali.
Dan kita tahu bahwa tumpukan ini tumbuh dari bawah
dan tumpukan tumbuh ke bawah.
Dan apa perbedaan antara hal-hal bahwa kita terus tumpukan dan hal-hal
bahwa kita tetap di stack?
Seseorang membuang sesuatu di luar sana.
Ya.
>> AUDIENCE: Apakah tumpukan untuk hal-hal yang hanya
variabel kekal bahwa kita hanya menyatakan menggunakan fungsi tertentu?
SPEAKER 1: Beautiful, ya.
Jadi setiap saat di mana, mari kita mengatakan kami berada di fungsi,
dan kami hanya memiliki beberapa variabel lokal.
Mereka akan berakhir di stack.
Jika, sebaliknya, kita sebut malloc dan benar-benar mengalokasikan memori,
yang selalu datang dari tumpukan.
Jadi, ya keren?
>> Dan ingat bahwa memori setiap Anda mengalokasikan menggunakan malloc,
yang akan berakhir di heap.
Dan jika Anda lupa untuk itu gratis, komputer
tidak akan tahu bahwa Anda selesai dengan itu.
Jadi itu hanya akan menggantung di luar sana di memori.
Dan kau dasarnya bocor memori itu.
Anda kehilangan itu.
Karena Anda tidak pernah mengatakan kepada komputer, hey aku sudah selesai menggunakannya, merasa bebas untuk menggunakan,
menempatkan hal-hal lain di sana.
Keren.
Pertanyaan ada?
Iya nih.
>> AUDIENCE: Jadi, apa jenis memori adalah tumpukan?
Pakan non dinamis, didelegasikan?
Apa yang akan Anda menyebutnya?
>> SPEAKER 1: Tentu, sehingga Anda bisa menganggapnya sebagai variabel lokal.
Panggilan sebenarnya untuk fungsi akan menumpuk.
ada lagi?
Ya?
AUDIENCE: Bagaimana Anda gratis memori Anda tambahkan ke the--
SPEAKER 1: Tentu, jadi ketika Anda mengalokasikan memori di heap, Anda menelepon malloc.
Dan kemudian yang memberikan Anda kembali pointer ke beberapa alamat di memori.
Jadi mengatakan Anda disebut pointer itu, kan?
Kemudian, Anda hanya mengatakan pointer gratis.
Dan yang membebaskan memori.
Keren.
Pertanyaan lain?
Iya nih.
>> AUDIENCE: Apa dialokasikan secara dinamis berarti?
>> SPEAKER 1: dinamis dialokasikan berarti, dalam perjalanan program anda.
Jadi ketika Anda menelepon malloc di tengah program Anda,
pada awal program, tidak ada memori yang dialokasikan.
Dan sebagai komputer langkah melalui kode itu,
itu akan mengalokasikan memori.
Jadi itulah yang kita maksud dengan dinamis.
Pertanyaan bagus.
Ya?
AUDIENCE: Ketika Anda mendefinisikan array dengan kurung persegi,
apakah itu masih [tidak terdengar]?
SPEAKER 1: Itu pertanyaan yang bagus.
Saya pikir ketika Anda mengalokasikan array, itu benar-benar menempatkan pada stack.
Aku tidak positif tentang itu, jadi jangan mengutip saya.
>> SPEAKER 2: Saya pikir itu-- ya menempatkan itu di stack.
>> SPEAKER 1: Menempatkan pada stack.
OK, keren, dikonfirmasi.
Pertanyaan lain?
Ya?
>> AUDIENCE: Ketika Anda mendelegasikan malloc, tidak komputer secara otomatis
mengalokasikan memori untuk variabel Anda?
SPEAKER 1: Ya, untuk variabel lokal Anda,
secara otomatis menempatkan memori di stack.
AUDIENCE: Jadi apa titik menggunakan malloc?
SPEAKER 1: Apa titik menggunakan malloc?
Jadi kita melihat sekelompok contoh, seperti, misalnya, menggunakan swap,
di mana kita ingin ruang lingkup variabel menjadi sesuatu
sekedar fungsi panggilan nya.
Dan kami ingin sesuatu bahwa kita dapat melewati sekitar
dan bahwa kita dapat mengakses dari tempat yang berbeda.
Di situlah kita akan ingin menempatkan memori di heap.
Sehingga semua yang berbeda fungsi dapat mengaksesnya.
>> AUDIENCE: Dapatkah Anda hanya menjelaskan bahwa?
>> SPEAKER 1: Jadi salah satu pilihan is-- sehingga pertanyaan adalah, bisakah kita allocate--
Maaf, dapat kita mendeklarasikan variabel global, pada dasarnya.
Itu adalah salah satu pilihan.
Tapi dengan banyak dari mereka, mereka cenderung untuk mendapatkan benar-benar berantakan.
Dan kita biasanya berpikir itu desain buruk.
Ya.
Keren, pertanyaan lain?
Mengagumkan.
OK, pindah.
Jadi ini sebenarnya bagaimana kita mengalokasikan memori.
Kami berbicara tentang ini sedikit.
Kami menggunakan fungsi ini disebut malloc.
Dan Anda mengatakan itu berapa banyak byte di memori, sehingga berapa banyak byte di heap,
kamu ingin.
Dan itu akan kembali alamat, sehingga pointer ke, sepotong memori
bahwa itu dialokasikan untuk Anda.
Jadi jenis akan menjadi batal bintang.
Ini akan menjadi pointer ke apa pun yang Anda memutuskan untuk menempatkan di sana.
Setiap kali Anda menelepon malloc, kita sudah mengatakan
Anda harus membebaskan begitu kami tidak memiliki kebocoran memori.
>> Apa hal lain bahwa Anda benar-benar
harus melakukan setiap satu kali Anda memanggil malloc?
OK, Anda harus membebaskan itu.
Apa hal lainnya?
Memeriksa null, indah.
Jadi, ya, itu benar ada di papan.
Jika Anda akan mencoba untuk mengalokasikan memori dan Anda telah tidak ada memori yang tersisa,
komputer akan mengatakan, Aku punya apa-apa untuk memberikan.
Dan memberikan Anda kembali nol.
Pertanyaan itu?
Ya.
>> AUDIENCE: Mengapa Anda pernah ingin mendeklarasikan pointer dengan tipe tertentu
ketika kekosongan star dapat menangani semua jenis pointer lagian?
SPEAKER 1: Pertanyaan yang bagus.
Mengapa kita akan mengatakan int bintang sebagai lawan membatalkan bintang
ketika kekosongan bintang bisa menangani semuanya?
Jadi kita tidak ingin pernah eksplisit cast pointer.
Ini hanya praktik buruk.
Tapi kita akan berbicara tentang bintang int hanya sebagai pemahaman,
ini adalah pointer ke integer.
>> AUDIENCE: OK.
>> SPEAKER 1: Ya, dan itu memungkinkan Anda untuk memanipulasi nilai-nilai di dalamnya
sebagai bilangan bulat.
>> AUDIENCE: Oh, OK.
Dan kekosongan bintang tidak akan membiarkan Anda melakukan itu?
>> SPEAKER 1: Hal ini tergantung pada konteks Ya, jadi jangan khawatir
jangan khawatir terlalu banyak tentang jenis ada.
Hanya tahu bahwa, secara umum, malloc mengembalikan pointer ke sesuatu.
Pertanyaan bagus.
>> AUDIENCE: Mengapa Anda kalikan itu kali 10? [Tidak terdengar].
>> SPEAKER 1: Tentu, jadi saya hanya melakukan contoh acak di sini di mana
Saya ingin mengalokasikan cukup ruang untuk menyimpan 10 bilangan bulat.
Hanya pilihan acak.
Ya.
Ya, ada apa?
>> AUDIENCE: Apa yang Anda maksud dengan memeriksa null?
Apakah Anda ingin memeriksa pointer for atau malloc?
SPEAKER 1: Ya, persis.
Jadi pertanyaannya adalah, apa yang yang kita maksud dengan cek oleh nol?
Kami ingin to-- kapan saja kita sebut malloc dan kami kembali pointer,
kami ingin mengatakan, adalah pointer sama dengan null?
Jadi secara harfiah PTR.
Apakah PTR sama dengan nol.
Iya nih.
AUDIENCE: Jadi, aku agak bertanya-tanya, jika Anda
menginisialisasi pointer ke malloc, tidak itu menunjuk ke awal malloc?
Karena jika itu sebuah array--
SPEAKER 1: Itu pertanyaan yang bagus.
Ya, jika Anda memanggil malloc, yang pointer yang itu-- katakanlah,
jadi di sini kita mengalokasikan 10 byte memori.
Jadi, saya minta maaf, cukup ruang untuk 10 bilangan bulat,
kita akan mendapatkan alamat bahwa bagian pertama dari memori.
Itu pertanyaan yang bagus.
Ya.
>> AUDIENCE: Dengan mengalokasikan 10 bilangan bulat luas,
bisa Anda benar-benar menggunakan pointer sebagai like-- hampir
seperti sebuah array bilangan bulat?
SPEAKER 1: Ya, Anda juga bisa menggunakannya sebagai sebuah array bilangan bulat?
Ya, tepatnya, ini adalah apa pulak hanya menunjukkan Anda on-- beberapa slide yang lalu,
di mana kita mengatakan, OK, ini adalah benar-benar hanya jenis of-- kami
dapat menganggapnya sebagai sebuah array 10 bilangan bulat.
Itu hanya kebetulan di heap.
AUDIENCE: Tapi Anda tidak bisa akses dengan notasi braket persegi?
SPEAKER 1: Anda benar-benar bisa mengakses dengan notasi braket persegi, ya.
Anda dapat memperlakukan mereka sama.
Iya nih.
>> AUDIENCE: Mengapa pointer pernah null?
>> SPEAKER 1: Mengapa pointer pernah null?
Jika Anda akan menggunakan semua memori di heap Anda.
Jika program anda memakan, makan sampai, makan memori,
dan tidak ada yang kiri, kemudian malloc akan say-- jika Anda mengatakan,
Saya ingin 100 byte lagi, itu akan mengatakan, saya tidak memiliki 100 byte.
Berikut null.
Itu berarti, saya gagal.
Iya nih.
>> AUDIENCE: Dalam hal ini, nol adalah apa-apa, kan?
>> SPEAKER 1: Ya, dalam kasus, null ada.
Anda tidak memiliki alamat.
Tidak ada memori.
Baiklah, pindah.
OK, mari kita bicara sangat cepat tentang buffer overflow.
Ketika kita mungkin mengalami buffer overflow?
Katakanlah kita memiliki kita a-- mengalokasikan sepotong memori,
dan kita akan menulis string dalam.
Dan kita akan mengatakan, OK, aku akan mengalokasikan
cukup ruang untuk enam karakter.
Dan aku akan meminta pengguna untuk beberapa masukan.
Dan input pengguna, misalnya, halo.
Dan yang sangat cocok baik karena kita memiliki
ruang untuk semua karakter halo, dan karakter terminating null.
Banyak ruang, tidak ada masalah.
>> Tapi bagaimana kalau kita beri kesempatan untuk pengguna yang jahat untuk menggunakan program kami,
dan mereka ketik tidak enam karakter, atau tidak lima karakter, tapi satu juta.
Mereka terus mengetik, dan mengetik, dan mengetik, apa yang akan terjadi?
Yah kami hanya memberikan enough-- komputer atau menyesal,
kami hanya memberikan string ini cukup ruang untuk 5 karakter.
Jadi, kita akan mendapatkan sesuatu seperti ini, di mana orang jahat siapa
mengetik di masukan dapat menimpa ukuran buffer,
dan bisa benar-benar masa lalu jumlah bahwa itu awalnya dialokasikan.
Dan kemudian apa yang dapat Anda lakukan, Yang benar-benar jahat yang dapat Anda lakukan,
adalah menimpa alamat pengirim.
Yang pada dasarnya berarti Anda dapat mengambil jenis
kontrol perilaku program.
Jadi pada tingkat yang sangat tinggi buffer overflow adalah ketika
Anda mengalokasikan beberapa jumlah memori.
Dan kemudian you-- ini karena Anda mengambil input pengguna atau sesuatu
seperti itu-- Anda pergi ke batas dari apa yang telah Anda awalnya dialokasikan
dan mulai mengacaukan program anda.
Iya nih?
>> AUDIENCE: Mengapa tidak yang hanya kembali kesalahan segmentasi?
>> SPEAKER 1: Mengapa tidak yang kembali kesalahan segmentasi?
Itu bisa.
Kadang-kadang kompilator atau selama salah satu runtime Anda
sebenarnya akan memeriksa itu.
Jika hal-hal tertentu terjadi, dan ini adalah jenis tingkat yang lebih rendah,
maka Anda perlu tahu.
Tapi jika Anda tidak merancang sistem ini benar,
maka Anda memiliki kesempatan tidak menangkap itu dan hanya
memungkinkan komputer take-- yang orang jahat untuk mengontrol komputer Anda.
Ya.
>> AUDIENCE: [tidak terdengar]?
SPEAKER 1: Tentu.
Oh, ketika saya mengatakan penyangga, saya hanya berarti jumlah memori yang telah Anda dialokasikan.
Jadi di sini saya berkata, oh, kami telah dialokasikan enam char-- cukup ruang untuk enam karakter.
Dan aku hanya menyebut bahwa buffer saya di mana saya bisa menulis informasi.
Ya.
Pertanyaan lain tentang hal ini?
Ya.
>> AUDIENCE: Bagaimana Anda menghentikannya?
Bagaimana Anda menghentikannya?
SPEAKER 1: Awesome pertanyaan.
Bagaimana Anda menghentikannya?
Bagaimana Anda mencegah buffer overflow?
Nah salah satu cara untuk melakukannya adalah sesuatu seperti GetString, di mana kita terus-menerus meningkatkan
jumlah memori yang kita mengalokasikan jika pengguna memasukkan banyak teks.
Lain masalahnya, jika Anda hanya ingin enam karakter, melakukan pemeriksaan cepat.
Mengatakan hanya masukan enam karakter.
Ya.
Jadi katakanlah Anda bekerja on-- kita akan
untuk pergi ke hal-hal web sedikit kemudian di course-- tapi mari
mengatakan Anda bekerja pada formulir, Anda akan hanya membatasi berapa banyak bisa diserahkan.
Ya.
>> AUDIENCE: GetString menarik memori dari stack, kan?
Hanya untuk mengklarifikasi?
SPEAKER 1: Sekali lagi?
AUDIENCE: Apakah GetString mengambil memori dari stack?
SPEAKER 1: Saya percaya Getm-- get int mengambil memori dari tumpukan
karena panggilan alokasi.
AUDIENCE: Oh.
OKE.
SPEAKER 1: Ya, malloc dan realloc.
Pertanyaan lain?
Ya.
>> AUDIENCE: Jadi dengan mendefinisikan ukuran buffering,
Anda mencegah seseorang dari mampu menyuntikkan kode
yang dapat meluncur melewati [tidak terdengar].
>> SPEAKER 1: Jadi, dengan mendefinisikan ukuran buffer,
Anda mengatakan, OK inilah cara banyak memori kita dapat menggunakan.
Jika Anda memungkinkan pengguna untuk menulis di atasnya, maka Anda akan mengalami masalah.
Masuk akal.
Mengagumkan.
Mari kita bergerak bersama.
Baiklah.
Berbicara tentang kesalahan, di sini adalah beberapa pesan kesalahan umum
yang mungkin telah muncul saat Anda berada coding, bekerja pada set masalah Anda.
Kesempatan baik bahwa salah satu ini muncul di kuis
jika tahun terakhir adalah indikasi.
Jadi, jawaban yang sejenis di sini di papan.
Tetapi merasa bebas untuk berteriak lagi.
>> Mengapa kesalahan segmentasi terjadi?
Mengapa Anda mendapatkan kesalahan segmentasi ketika Anda menjalankan program anda?
>> AUDIENCE: [tidak terdengar].
>> SPEAKER 1: Baik.
Ya, jika kita mencoba untuk mengakses memori yang tidak diberikan kepada kita.
Jika kita dereference pointer null.
Sebagai contoh, jika kita sebut malloc, dan lupa untuk memeriksa apakah itu nol,
dan kami hanya mencoba menggunakannya, komputer ini akan memberi kita kesalahan segmentasi.
Baik.
Bagaimana implisit deklarasi fungsi?
Maksudnya itu apa?
AUDIENCE: Anda mencoba untuk menggunakan fungsi yang Anda belum ditentukan.
SPEAKER 1: Baik.
Anda mencoba untuk menggunakan fungsi Anda belum didefinisikan.
Sehingga bisa menjadi salah satu dari dua hal.
Mungkin itu seperti contoh Camille menunjukkan Anda sebelumnya.
Dan Anda memiliki fungsi utama yang menyebut sesuatu yang disebut kubus.
Dan katakanlah Anda lupa menulis prototipe ini.
Anda lupa mengatakan, hey komputer, Saya memiliki fungsi ini disebut kubus.
Anda akan melihatnya nanti.
Katakanlah Anda lupa untuk menulis prototipe, Anda mungkin mendapatkan error ini.
Hal lain adalah, katakanlah Anda mencoba menggunakan printf,
dan lupa untuk menyertakan perpustakaan standar,
maka itu akan mengatakan implisit deklarasi fungsi.
Dan terakhir, namun tidak sedikit, identifier dideklarasikan.
Ya.
>> AUDIENCE: Anda punya ruang lingkup masalah.
Seperti mungkin Anda mencoba untuk memanggil variabel lokal yang
dalam jenis yang berbeda dari daerah.
SPEAKER 1: besar, jadi jika Anda memiliki variabel yang tidak dalam lingkup,
dan Anda mencoba untuk menggunakannya, Anda akan mendapat masalah.
Dan hanya lebih umum, katakanlah Anda mencoba untuk menggunakan x, dengan pernah mengatakan int
x sama dengan 5, maka Anda akan mengalami kesulitan.
Permisi, pertanyaan tentang ini?
Mengagumkan, menenggak kanan sepanjang.
>> OK, rekursi, mengapa might-- mari see-- saya kehilangan saya sch-- oh di sini kita pergi,
pastikan kami kasar pada jadwal.
Baiklah, keren.
OK, rekursi, ide umum rekursi, fungsi rekursif
adalah fungsi yang memanggil dirinya sendiri.
OK, jadi itulah yang saya maksud dengan konsep Program
dimana fungsi menyebut dirinya.
Apa yang akan menjadi some-- apa yang alasan yang baik untuk menggunakan rekursi?
Ketika mungkin itu berguna?
Atau whats program yang benar-benar cocok untuk rekursi?
>> AUDIENCE: Pencarian biner.
>> SPEAKER 1: pencarian biner cocok untuk rekursi,
karena Anda memiliki masalah ini yang Anda dapat terurai menjadi potongan-potongan kecil,
dan terus melakukan algoritma yang sama di atasnya.
Hal ini menyebabkan, dalam banyak kasus, lebih kode elegan itu lebih tepat.
Kami hanya adalah contoh pencarian biner.
Contoh lain adalah menggabungkan semacam.
Kadang-kadang, ketika Anda memikirkan algoritma, seperti faktorial,
itu hanya terasa rekursif, kan?
Karena kita tahu bahwa faktorial 5 adalah faktorial 4 kali 5.
Dan ketika Anda mengatur masalah seperti itu, itu hanya terasa rekursif.
Sehingga akan menjadi cara yang bagus untuk menulis itu.
Pertanyaan?
Iya nih.
>> AUDIENCE: Apa kasus dasar?
>> SPEAKER 1: Oh apa kasus dasar?
Aku berkata, jangan lupa untuk menyertakan kasus dasar.
Katakanlah kita sedang menulis fungsi faktorial,
dan kami melakukan faktorial dari 5.
Dan kita tahu faktorial dari 5 adalah 5 kali faktorial 4,
bla, bla, bla, bla.
Bagaimana kita tahu kapan harus berhenti?
Bagaimana kita tahu bahwa kita benar-benar memiliki nomor?
Karena jika kita terus memanggil faktorial, maka kita tidak akan pernah mendapatkan jawaban, kan?
Jadi ketika kita tahu bagaimana berhenti di contoh faktorial.
Siapapun, ya.
>> AUDIENCE: Ketika 1 faktorial adalah 1.
SPEAKER 1: Baik.
Jadi kita tahu.
Kita bisa mengambil begitu saja bahwa 1 faktorial adalah sama dengan 1.
Jadi jika kita mendapatkan ke titik di mana kita memanggil faktorial atas 1,
hanya pergi ke depan dan kembali 1.
Dan itu yang terjadi dasar Anda.
Karena kita tahu setelah kita memukul itu, dan kami selalu akan memukul itu, kami akan never--
kita tidak akan hanya terus selamanya.
Pertanyaan lain pada rekursi?
Iya nih.
>> AUDIENCE: Jadi, ketika Anda kembali 1, itu hanya secara otomatis
akan menghentikan program, kan?
>> SPEAKER 1: Ya jadi ketika Anda memanggil kembali 1, if-- katakanlah,
katakanlah faktorial 2 panggilan faktorial dari 1, faktorial dari 1
hanya akan menyerahkan kembali 1.
Dan sekarang faktorial 2 akan mengatakan OK, 2 kali 1 adalah 2, dan kembali jawaban itu.
Iya nih.
>> AUDIENCE: Apakah kita perlu khawatir tentang ruang lingkup di rekursi
ketika Anda pergi ke sebuah algoritma?
>> SPEAKER 1: Ah, ya.
Ya, Anda perlu khawatir tentang lingkup dalam konteks rekursi.
Sehingga hanya variabel didefinisikan dalam menjalankan fungsi
akan berguna.
Ya pertanyaan yang bagus.
Baiklah, mari kita terus bergerak bersama.
Karena kita memiliki banyak bahan untuk melewati.
Tapi seperti yang saya katakan, jangan ragu untuk memukul jam kantor, atau kita setelah fakta.
>> Ini hanya slide benar-benar cepat.
Kami belajar banyak tentang pencarian dan macam.
Mohon mohon mohon, bagian ini secara online,
Saya percaya di cs50.net/quizzes.
Jadi pergi mengambil grafik ini dan meletakkannya di lembar ulasan Anda,
karena akan ada pertanyaan tentang ini.
Jangan melakukan kesalahan.
Hanya sangat cepat, apa grafik ini berarti,
itu berbicara tentang o besar, yang kita tahu menjadi batas atas suatu algoritma
waktu berjalan.
Dan kami memiliki omega, yang akan menjadi batas bawah
sebuah runtime algoritma.
OKE?
>> AUDIENCE: [tidak terdengar].
>> SPEAKER 1: Ya, apa hal terakhir?
Apa theta?
Hal ini jika we-- kita hanya akan peduli di kelas ini dalam kasus
di mana kami batas atas dan batas bawah kami adalah sama.
Ya, itulah satu-satunya waktu itu akan datang di kelas ini.
OK, aku akan terus berjalan.
Jika Anda tidak mengambil gambar Anda, Aku berjanji ini akan online.
>> OK, mengagumkan, struct.
Mengapa kita ingin struct?
Apa alasan yang berguna kita mungkin ingin struct.
Seseorang berteriak sesuatu.
Nah mari kita lihat pada contoh di papan tulis.
Katakanlah kita sedang berhadapan dengan semua siswa ini.
Jika kita membuat program untuk CS50, ada seperti 800 orang.
Kita perlu write-- kita akan perlu menangani banyak informasi
tentang siswa.
Akan lebih baik jika kita bisa jenis kelompok
this-- semua informasi yang hubungannya dengan mahasiswa tertentu
menjadi salah satu jenis data.
Tapi kita tahu ada data ketik disebut, Mahasiswa, kan?
Kami memiliki sebuah integer, kita memiliki pelampung, kita memiliki string, atau bintang char,
tapi kami tidak punya, mahasiswa.
>> Jadi kita bisa lakukan adalah benar-benar jenis mendefinisikan struktur kita sendiri, sebut saja mahasiswa,
dan kita dapat mengasosiasikan beberapa bidang yang berbeda dengan struct itu.
Jadi dalam hal ini, mari kita mengatakan bahwa kita memiliki seorang mahasiswa.
Dan hal-hal yang kita peduli tentang adalah jumlah siswa ID
dan nama siswa.
Dan sekarang kita bisa mengasosiasikan ID ini dan nama ini dengan mahasiswa diberikan.
Jadi mari kita lihat beberapa contoh.
>> OK, jadi di sini saya katakan, OK, mari kita mengatakan kami ingin membuat mahasiswa.
Aku memanggilnya siswa 1.
Dan nomor ID nya, di kasus ini, kita dapat mengakses
dengan hanya melakukan nama siswa dot bidang kita ingin mengakses.
Jadi ini akan hanya menjadi mahasiswa 1 dot ID, dan kami mengaturnya sama dengan 1.
Karena ingat, kita mengatakan bahwa ID akan menjadi integer.
Dan sangat mirip, kita dapat mengatakan, ini Nama siswa akan menjadi Davin,
sebagai contoh.
Jadi kami hanya dapat mengakses lapangan dari struct menggunakan dot ini.
Pertanyaan itu?
Ya.
>> AUDIENCE: Apakah ada cara untuk melindungi variabel Anda?
Apakah ada cara untuk melindungi variabel dari yang eksternal diakses?
>> SPEAKER 1: Apakah ada pula untuk melindungi variabel Anda
dari yang eksternal diakses?
Tidak dalam lingkup CS50.
Pertanyaan lain?
Ya.
>> AUDIENCE: Apa struct typedef?
Apa artinya setiap komponen?
SPEAKER 1: Ah, apa struct typedef?
Apa setiap komponen berarti orang ini?
>> AUDIENCE: Ya.
>> SPEAKER 1: OK, keren.
Jadi ini mengatakan, hey komputer, saya ingin membuat struktur baru.
Dan aku akan menentukan definisi untuk itu, sehingga saya bisa menggunakannya
seolah-olah itu tipe seluruh program saya.
OK, jadi saya ingin mendefinisikan struktur.
Dan aku sekarang akan menjadi dapat menggunakannya sebagai tipe.
Dan namanya adalah mahasiswa.
Dan di sini adalah bidang nya.
>> AUDIENCE: Jadi adalah bahwa typedef struct [tidak terdengar]?
SPEAKER 1: Jika Anda ingin dapat menggunakan struct ini seluruh program Anda,
dan dalam kebanyakan kasus di CS50 kami lakukan, kita harus mengatakan jenis Def.
Dan yang memungkinkan untuk menggunakannya sama Cara yang kita gunakan seperti int atau float.
Komputer akan selalu tahu apa itu.
Ya.
>> AUDIENCE: Dapatkah kita menulis ini dalam file header?
>> SPEAKER 1: Oh, maaf.
Apakah kita menulis ini dalam file header?
Anda bisa menulis ini di bagian atas Anda Program, di bagian atas program c Anda.
Ya, itu akan menjadi yang paling Tempat wajar untuk itu.
Kembali ke sana.
AUDIENCE: pertanyaan yang sama, jadi sebelum main?
SPEAKER 1: Benar, Anda perlu ini menjadi suatu tempat yang semua orang bisa mengaksesnya.
Jadi sebelum utama dalam kasus Anda, ya.
AUDIENCE: Apakah ada perbedaan antara menempatkan siswa di atas dan di bawah?
SPEAKER 1: Ah, apakah ada perbedaan antara menempatkan siswa
di atas atau di bawah?
Let-- menyimpan pertanyaan itu, dan ketika kita sampai ke daftar terkait,
kita akan melihat bahwa, OK?
Jadi berpegang pada itu untuk satu detik.
Hal terakhir yang saya ingin menyebutkan di sini, adalah bukan memiliki struktur,
kami memiliki pointer ke struktur, kita bisa mengubah notasi kami
menjadi sedikit lebih bagus.
>> Kita dapat mengatakan, katakanlah kita memiliki pointer ke siswa bukan hanya
mahasiswa.
Jika kita ingin akses ke lapangan, bukannya Melakukan, juga pergi dereference pointer,
dan kemudian mengakses nama field.
Notasi ini terlihat sedikit berantakan dengan bintang di titik ini.
Benar-benar benar, tetapi jenis dari cara bersih untuk melakukannya,
hanya untuk mengatakan nama pointer panah.
Dan yang benar-benar menggabungkan dereferencing dan mengakses dalam satu simbol yang indah.
Pertanyaan itu?
>> AUDIENCE: Hanya mengatakan bahwa sekali lagi.
>> SPEAKER 1: Katakanlah bahwa sekali lagi.
>> AUDIENCE: Tepat apa yang Anda katakan.
SPEAKER 1: Tentu, tepatnya apa yang saya katakan.
Jika kita memiliki pointer ke mahasiswa daripada siswa itu sendiri,
kami can-- salah satu cara yang kita dapat mengakses lapangan adalah untuk dereference itu, dan kemudian
Nama akses.
Lain, cara yang lebih baik kami dapat melakukannya, yang hanya
sedikit gula sintaksis, hanya untuk melakukan pointer nama panah.
Dan yang akan menggabungkan dereferencing dan mengakses itu.
Ya, cukup keren.
Baiklah.
>> Jadi mari kita bicara tentang pertanyaan lainnya.
Mari melompat ke node, yang kita akan menggunakan
di daftar terkait hanya dalam detik.
Jadi di sini, Anda akan melihat bahwa ada adalah simpul kata kedua di bawah,
dan di atas.
Sebelum, ketika kami mendefinisikan mahasiswa, kami hanya memiliki mahasiswa di bagian bawah.
Kami tidak memiliki siswa di atas.
Ada yang tahu mengapa yang mungkin?
Apa perbedaan?
Ya.
AUDIENCE: Jadi Anda menggunakan simpul adalah definisi node,
jadi itu hal yang rekursif?
SPEAKER 1: Baik.
Ya, kita perlu node untuk memiliki pointer ke node lain.
Jadi karena kita menggunakan jenis sebelum itu sebenarnya didefinisikan,
kita harus meletakkannya di atas hanya sehingga tahu apa itu.
AUDIENCE: Jadi kita masih membutuhkannya di bagian bawah?
SPEAKER 1: Ya.
AUDIENCE: Jadi selalu di bagian bawah.
SPEAKER 1: Selalu di bagian bawah.
Jadi semua Anda akan memilikinya di bagian bawah.
Ada pertanyaan lain?
Baiklah, sehingga memungkinkan benar-benar berbicara tentang terkait daftar benar-benar cepat.
Jadi daftar terkait are-- kita menggunakannya bukannya array dalam beberapa kasus,
karena kita tahu bahwa array adalah panjang tetap, sedangkan daftar terkait
kita dapat tumbuh dan menyusut seperti yang kita inginkan.
Jadi ini adalah contoh dari apa yang linked list mungkin terlihat seperti.
Apa yang kita butuhkan untuk melihat adalah kepala daftar.
Jadi di mana daftar dimulai.
Dan kemudian dia simpul, masing-masing simpul berikutnya, adalah
jawab untuk mengetahui di mana node berikutnya adalah.
Jadi dalam hal ini, node yang menyimpan 1 bertanggung jawab untuk mengetahui di mana 3 adalah.
Orang yang menyimpan 3 adalah jawab untuk mengetahui di mana 9 adalah.
Dan 9 tidak memiliki orang lain untuk menunjuk ke.
Ini akhir dari daftar, sehingga hanya mengatakan null.
OKE?
>> AUDIENCE: Apa gunanya ini?
>> SPEAKER 1: Apa gunanya ini?
>> AUDIENCE: Ya.
SPEAKER 1: Karena, mari kita mengatakan bahwa kita memiliki beberapa data.
Dan kita tidak tahu persis bagaimana banyak data yang kita inginkan sebelumnya.
Jadi dengan array, katakanlah di mana kita ingin menghitung orang di baris pertama.
Kemungkinan itu tidak akan berubah.
Kami hanya bisa mengatakan, OK, saya ingin array ukuran enam.
Tetapi jika kita menginginkan sesuatu itu akan berubah.
>> Sebagai contoh, katakanlah saya sedang berusaha untuk melacak siswa
karena mereka datang ke ruangan untuk sesi ulasan.
Saya tidak tahu berapa banyak dari Anda orang-orang akan muncul.
Jadi saya mungkin ingin struktur data bahwa saya dapat memperluas dan menyusut.
Karena mungkin seseorang akan pergi, mungkin seseorang akan datang.
Dan setiap saat, kita dapat menambah atau menghapus node.
Keren, pertanyaan besar.
Ya.
>> AUDIENCE: Jika Anda dapat menggunakan sesuatu seperti GetString
yang membuat membiarkan Anda mendapatkan lebih banyak data Anda membutuhkannya, mengapa Anda perlu ini juga?
>> SPEAKER 1: Mengapa Anda menggunakan daftar bila dikaitkan
Anda dapat menggunakan sesuatu seperti GetString?
Itu pertanyaan yang bagus.
Ingat bahwa Get-- salah downfalls GetString
adalah bahwa kita tidak melakukan sangat pekerjaan yang baik membebaskan memori itu,
dan kami memperkenalkan sekelompok kebocoran memori ke dalam program Anda?
Anda bisa mengambil sebuah statis berbagai ukuran dan terus berkembang itu.
Tapi Anda harus menemukan tempat-tempat baru di memori.
Itu hanya akan menjadi banyak overhead.
>> Salah satu hal yang menyenangkan tentang terkait daftar sebagai lawan array, array adalah
semua di lokasi yang sama di memori.
Itu harus terus menerus potongan memori.
Sedangkan daftar terhubung, 2 dan 3 Mei sepenuhnya di lokasi yang berbeda.
Seperti 2 adalah di sini, dan 3 adalah di sini.
Dan selama mereka memiliki pointer satu sama lain, itu baik-baik saja.
Kita tahu kita bisa menemukan mereka.
Pertanyaan di sana?
>> AUDIENCE: GetString adalah fungsi di perpustakaan CS50, kan?
Ini tidak ada dalam program-program nyata.
>> SPEAKER 1: Benar.
Benar, itu hal lain.
GetString tidak ada di luar konteks CS50.
Ya.
>> AUDIENCE: Begitu juga fakta bahwa dua bisa benar-benar jauh terpisah,
apakah dampak efisiensi mengakses elemen dalam daftar?
SPEAKER 1: Itu adalah sebuah pertanyaan besar.
Pertanyaannya adalah, apakah itu dampak efisiensi mengakses
unsur-unsur yang berbeda dalam daftar.
Sebenarnya ya.
Karena kita tahu if-- mari mengatakan kita ingin mengakses
elemen kedua dari array, kita tahu kita hanya bisa melakukan berbagai bracket 1, kanan.
Itu selalu akan menjadi lokasi yang sama.
Tetapi jika kita ingin mendapatkan itu 3, kita tidak bisa hanya mengatakan, pergi mendapatkan bahwa 3.
Kita harus mengatakan, OK, mulai dari awal daftar,
dan sekarang kami benar-benar memiliki berjalan melalui sampai kita
menemukan nomor kita tertarik.
>> Jadi dalam hal ini kita katakan, OK ini adalah nomor pertama.
Jadi pada dasarnya, itu indeks 0.
Sekarang kita harus menemukan nomor kedua.
Itu index 1.
Sehingga benar-benar akan to-- hanya mengakses, akan mengambil waktu N.
Keren, N. tua besar Ya.
>> AUDIENCE: Apa setiap daftar?
Apakah mereka masing-masing array, atau apa?
SPEAKER 1: Itu pertanyaan yang bagus.
Apa masing-masing struktur yang saya sudah ditarik?
Mereka adalah node.
Jadi masing-masing sedikit Struktur memiliki dua bagian.
Ini memiliki integer yang memegang.
Itulah data aktual bahwa itu memegang.
Itulah jenis bagian yang berguna.
Dan, ini adalah apa yang membuat daftar link,
memiliki pointer ke node berikutnya.
Pertanyaan mengagumkan.
Baiklah, jadi mari kita lihat sangat cepat melihat beberapa contoh dari apa yang
kita mungkin lakukan dengan daftar terkait.
>> Jadi salah satu contoh yang sangat cepat adalah, misalkan kita ingin melakukan pencarian.
Apa jenis pencarian tidak bisa kita lakukan pada daftar terkait?
>> AUDIENCE: Binary.
>> SPEAKER 1: Binary.
Mengapa kita tidak bisa menggunakan pencarian biner?
>> AUDIENCE: [tidak terdengar].
SPEAKER 1: Benar, karena dengan biner pencarian, kita harus bergantung pada kenyataan
bahwa kita hanya bisa melompat ke dalam array pada setiap titik.
Kami hanya bisa mengatakan, pergi ke elemen tengah.
Dengan sini, seperti yang kita katakan sedikit sebelumnya,
kita tidak bisa hanya melompat ke elemen tengah.
Dalam rangka untuk menemukan elemen, kita benar-benar
harus berjalan melalui seluruh daftar kami.
>> Jadi jika kita ingin melakukan pencarian, yang terbaik yang bisa kita lakukan hanyalah pencarian linear.
Kami mulai kepala, kita check-- katakanlah kami
mencari 9-- kita mulai di kepala.
Kita katakan, adalah 9 ini?
Tidak.
Adalah 9 ini?
Tidak.
Adalah 9 ini?
Ya, kami menemukan itu.
OK, itu semua itu.
Berikut sedikit pseudo-code.
Aku akan meninggalkan ini untuk Anda orang untuk churn lebih pada Anda sendiri,
hanya karena kita menjalankan sedikit pendek pada waktu.
>> Mari kita bicara tentang penyisipan.
Kami melihat demo benar-benar keren dari ini di kuliah di mana kita mengatakan,
OK, kita memiliki daftar ini terkait mana semua orang menunjuk ke satu sama lain,
dan seseorang muncul di panggung.
Bagaimana kita memasukkan bahwa orang dalam linked list kami?
Nah, cara yang salah untuk melakukan, yang adalah saya pikir apa yang kita lihat pertama,
adalah ketika orang di depan secara otomatis
menunjuk orang baru.
Dan kemudian kami jenis meninggalkan paruh kedua daftar, kan?
Karena kita tidak tahu di mana itu adalah dalam memori lagi.
Jadi untuk sangat berhati-hati tentang urutan kita memasukkan hal-hal.
>> Jadi di sini, katakanlah kita ingin menempatkan 1 di depan daftar kami.
Pertama, kita memiliki 1 poin di element-- kedua atau elemen
yang berisi 1.
Jadi, kami melakukan itu, supaya kita tidak akan kehilangan babak kedua.
Dan sekarang, kita dapat memiliki titik kepala ke 1.
Jadi sekali lagi, ini hanya seperti tingkat super tinggi.
Ini adalah bagaimana kita akan memasukkan sebuah node.
Kami memiliki banyak pseudo-kode di sini-maaf,
Aku tidak tahu mengapa aku menyebutnya pseudo-code.
Ini kode aktual.
Anda dapat pergi check it out nanti.
>> Baiklah, mari kita sangat quickly-- pertanyaan lagi
pada daftar terkait sebelum aku pindah ke beberapa data lain
struktur dalam 10 menit terakhir.
>> AUDIENCE: Apakah kita perlu sekarang bagaimana menulis pada tes?
>> SPEAKER 1: Apakah kita perlu tahu bagaimana to--
>> AUDIENCE: Menulis pada tes.
>> SPEAKER 1: Kami membutuhkan to-- Anda harus siap
menulis, insert, menghapus, dan mencari daftar terkait pada tes.
Itu adalah sesuatu yang kita bisa mengharapkan Anda untuk melakukan.
Hanya pergi di atasnya.
Jika Anda memiliki pertanyaan pada kode, menembak TF Anda email,
datang ke kantor jam.
Masih ada banyak waktu untuk belajar, tidak perlu khawatir.
Baiklah, apapun lainnya pertanyaan tentang daftar terhubung?
Iya nih.
>> AUDIENCE: Jadi, jika Anda tidak menggunakan pointer untuk pergi ke satu di sebelah kanan
sebelum Anda menggunakan pointer untuk satu di sebelah kiri, yang
setara dengan menghapus segalanya, kan?
SPEAKER 1: Ya.
AUDIENCE: [tidak terdengar].
SPEAKER 1: Benar, karena kita tidak bisa mendapatkannya, itu sebenarnya lebih buruk.
Karena kita tidak hanya tidak tahu mana itu, kita tidak bisa lagi menggunakannya,
tapi we've-- kami tidak membebaskan memori itu lagi.
Jadi itu hanya berkeliaran dan tidak berguna karena kita tidak dapat menemukannya.
Ya, pertanyaan keren.
>> Baiklah, mari kita bicara tentang tumpukan.
Kami melihat tumpukan sangat cepat.
Mereka pertama di terakhir struktur data keluar.
Jadi kita berpikir tentang tumpukan di Annenberg nampan tempat kami tumpukan hal-hal di atas.
Dan jika Anda akan datang mendapatkan nampan, Anda
selalu akan mengambil satu di atas, yang merupakan paling recently--
yang merupakan hal yang paling kita baru-baru ini diletakkan di atas tumpukan.
Sehingga Anda dapat jenis memikirkan semacam ini visual bila Anda berpikir untuk tumpukan.
Dan kemudian, kita sudah muncul sesuatu dari atas tumpukan.
>> Jika kita are-- oh, dan kata-kata yang kita gunakan ketika kita berbicara tentang data ini
struktur biasanya, jika kita menempatkan sesuatu di stack,
kita katakan kita sedang mendorongnya di stack.
Dan jika kita mengambil sesuatu dari tumpukan, kita katakan kita sedang bermunculan dari tumpukan.
Jika Anda akan mengimplementasikan stack-- sebuah yang saya pasti
merekomendasikan Anda mencoba out-- Anda akan ingin melacak,
katakanlah Anda menggunakan array.
Aku tahu di kuliah kita berbicara tentang menggunakan kedua array
atau terkait daftar untuk melaksanakan stack.
Jika Anda menggunakan array, Anda perlu keep--
alasan me-- kita perlu melacak dari ukuran dan kapasitas.
Jadi jumlah maksimum bahwa tumpukan kita bisa terus.
Pertanyaan pada tumpukan?
>> AUDIENCE: Apa bedanya antara ukuran dan kapasitas?
SPEAKER 1: Perbedaan antara ukuran dan kapasitas, pertanyaan mengagumkan.
Jadi katakanlah kami menggunakan sebuah array, dan kami
mengalokasikan cukup ruang untuk 10 bilangan bulat.
Dan kami mulai mengisi bahwa sampai.
Dan kami mendorong hal-hal di, dan kami pop hal off.
Kami ingin melacak maksimal Jumlah kita bisa menahan, itu kapasitas.
Dan kami ingin melacak jumlah saat ini yang kita miliki, itu ukuran.
Pertanyaan bagus.
Apa pun di tumpukan?
Baiklah, mari kita bicara tentang kejutan, antrian.
>> Tidak seperti tumpukan, yang pertama di terakhir keluar, ini adalah pertama, keluar pertama.
Jadi ini adalah like-- memikirkan garis.
Pikirkan berbaris di Apple Store untuk mendapatkan produk apapun.
Dan orang pertama di lini harus menjadi orang pertama yang telah membantu.
Sehingga hal pertama yang mendorong adalah ini hal pertama yang muncul.
Keren?
Sangat similarly-- oh, kata-kata yang kita menggunakan bukannya push dan pop--
yang saya hanya digunakan, Aku sorry-- adalah kita katakan,
jika kita menempatkan sesuatu ke antrian, kami mengatakan enqueued itu.
Jika kita mengambil sesuatu dari antrian, kita katakan kita dequeued.
Saya t.
Saya dapat mengucapkan mereka salah, tetapi Anda mendapatkan ide.
Dan sekali lagi, seperti tumpukan, jika kita menerapkan ini sebagai array,
kita perlu melacak ukuran, kapasitas, dan kepala.
Apa yang saya maksud dengan kepala?
Mengapa kita perlu menjaga track kepala?
>> AUDIENCE: Karena di situlah awal daftar Anda.
SPEAKER 1: Ya, pada dasarnya kepala adalah di mana awal antrian kami.
Karena kita tahu, tidak seperti tumpukan, which-- Aku akan mencoba untuk menghadapi way-- ini
kita tahu bahwa itu selalu akan menyusut cara ini dan tumbuh dengan cara ini.
Antrian, orang datang ke akhir dan meninggalkan dari awal,
jadi kita harus melacak dari mana awal adalah.
Itulah yang saya maksud dengan kita perlu melacak di mana kepala adalah.
Keren?
Baiklah.
Delapan menit, beberapa topik yang lebih, kita bisa melakukannya.
>> Baiklah, tabel hash.
Kami berbicara sangat singkat tentang tabel hash.
Untuk kuis, Anda hanya perlu memahami mereka pada tingkat tinggi.
Ide dasarnya adalah Anda memiliki data ini.
Dan kami ingin mengaksesnya dalam waktu yang lebih cepat dari sesuatu seperti terkait
daftar.
Karena kita berkata, jika kita mencari melalui daftar link,
yang bisa mengambil waktu N.
Bahkan mengakses dapat mengambil N waktu dalam linked list.
Tabel hash memberi kita cara yang kita bisa lebih cepat mengakses hal-hal, dan lebih
cepat mencari hal-hal, tanpa memiliki kekangan array
di mana kita telah tetap ukuran.
>> Jadi kita berpikir tentang struktur data di mana, di mana kita memasukkannya ke dalam struktur data
tergantung pada ini Fungsi hash magis.
Jadi dalam hal ini, hash magis Fungsi hanya mengambil kata,
memeriksa apa huruf pertama adalah, dan kemudian hanya menyortir itu berdasarkan abjad.
Jadi kita pada dasarnya menempatkan mereka ke dalam ember yang berbeda.
Ketika kita melihat pisang, kita katakan, OK, mari kita dimasukkan ke dalam ember B.
Ketika kita melihat Apple, mari kita memasukkannya ke dalam ember A.
Jika kita melihat aprikot, mari kita dimasukkan ke dalam ember A.
OKE?
>> Jadi misalkan saya sedang mencari for-- Saya tidak tahu, apa buah lain?
Misalkan saya cari oranye.
Di mana saya harus mencari?
Dalam O ember.
Ya, hanya ada satu tempat oranye yang mungkin, OK?
Jadi saya katakan sebelumnya apa yang terjadi if-- baik saya katakan sebelumnya,
katakanlah kita menempatkan aprikot in-- tapi aku benar-benar mengatasi kenyataan bahwa, oh tidak,
jika saya menempatkan berry di, itu akan bertentangan dengan pisang.
Di mana kita meletakkannya jika ada sudah sesuatu di meja kami?
Yah, kita memiliki beberapa pilihan.
>> Pilihan nomor satu adalah linear menyelidik, yang pada dasarnya berarti,
katakanlah saya ingin mencoba menempatkan berry, dan saya melihat, oh tidak,
pisang sudah ada, Saya hanya mengatakan OK, mari
saya mencari tempat yang tersedia berikutnya.
Jadi saya berjalan, saya katakan, oh, tidak ada dalam ember D.
Saya tidak bisa memikirkan apa pun buah-buahan yang dimulai dengan huruf D,
jadi aku hanya akan menempatkan berry di sana.
Durian.
OK, jadi karena ada tidak ada di sana belum,
Aku mungkin juga hanya menggunakan tempat itu.
Apa kelemahan dari itu?
>> AUDIENCE: Ini rusak.
>> SPEAKER 1: Maaf?
AUDIENCE: Ini rusak.
>> SPEAKER 1: Ini out-- benar, kita mungkin berakhir
dengan hal-hal yang tidak in-- disimpan ke dalam ember di jalan
bahwa kita mengharapkan mereka untuk menjadi.
Jadi jika kita sedang mencari untuk berry, sebelum kita mengatakan,
oh kita dapat melihat dalam satu ember.
Ini hanya bisa berada di satu ember.
Tapi sekarang, benar-benar, itu bisa di semua ember, kan?
>> OK, inilah pilihan lain, chaining-- terpisah
yang merupakan gagasan bahwa kita akan menggunakan sedikit kemudian di P ditetapkan 5.
Daripada hanya memiliki satu ruang di setiap kotak,
mengapa kita tidak memiliki setiap kotak menjadi pointer ke sebuah linked list?
Di mana kita mengatakan, OK, ada ember untuk segala sesuatu yang dimulai dengan A.
Dan ada hanya akan menjadi terkait daftar buah yang dimulai dengan A.
Jadi jika kita mendapatkan buah baru, katakanlah kami get-- kita alpukat, kita memiliki apel,
katakanlah kita mendapatkan aprikot, bagaimana kita akan dimasukkan ke dalam daftar?
Nah kita akan pergi ke ember 0, dan kami akan hanya memasukkan dalam daftar menyukai kita,
sederhana seperti itu.
>> Sekarang saya selalu mengatakan ember.
Kita bisa menerapkan ini dalam sejumlah cara.
Salah satu cara khas yang ini jenis gambar menunjukkan,
adalah mungkin memiliki sebuah array pointer ke daftar terhubung.
Itu salah satu cara yang kami bisa mengimplementasikan tabel hash.
AUDIENCE: Apakah Anda perlu lain daftar karena pisang dan berry yang keluar
order?
SPEAKER 1: Akankah Anda need-- ah, akan Anda
perlu daftar lain karena pisang dan berry yang rusak?
Dalam hal ini, fungsi hash kami, yang memberitahu kita di mana harus menempatkan hal-hal
tidak peduli dengan surat kedua.
Tidak peduli alfabetis, hanya peduli tentang huruf pertama.
Pertanyaan?
>> AUDIENCE: Apa definisi dari yang fungsi, dan apa yang terlihat seperti?
SPEAKER 1: Ah, baik.
OK, jadi kita tidak perlu terlalu khawatir untuk kuis ini.
Jadi saya tidak dimasukkan ke dalam slide.
Kita akan diperkenalkan untuk itu untuk P ditetapkan 5.
Tapi pada dasarnya, ia mengatakan, diberi elemen baru, di mana saya harus meletakkannya?
Atau, katakanlah saya sedang mencari elemen, di mana mungkin?
Ya, pertanyaan besar.
>> OK, sangat cepat, pohon-pohon dan mencoba.
Jadi pohon hanya apapun dari struktur data yang terorganisir.
Dan kita akan melihat banyak gambar yang akan membuat ini super jelas.
Dan trie, yang kita lihat di kelas, adalah jenis yang sangat khusus dari pohon
yang pada dasarnya bekerja seperti tabel hash multi-level.
Ini super cool.
Kita akan melihatnya hanya sebentar.
Baiklah, jadi mari kita berbicara tentang pohon pertama.
Jadi ini adalah contoh yang sangat khas pohon, di mana kita memiliki beberapa hirarki.
Anda melihat bahwa satu di bagian paling atas, kan?
Dan saya dapat mengatakan atas karena ada jelas merupakan memesan karena kami
memiliki panah tersebut akan turun.
Sehingga, hal di atas, Saya menyebut bahwa simpul akar.
Jadi satu simpul akar.
Dan hal-hal di bagian bawah, yang telah ada datang dari mereka,
Saya mengatakan ini adalah node daun.
Jadi 8,9 5, 6, 7, OK.
Dan biasanya kita terminologi dapat katakan adalah, 1 adalah orangtua 3 ini.
Jadi itu hal yang datang tingkat di atasnya, dan poin untuk itu.
Dan 3 adalah anak 1 ini.
Ini hal yang 1 poin untuk.
Pertanyaan?
>> AUDIENCE: Dapatkah Anda kembali ke slide sebelumnya, please?
>> SPEAKER 1: Dapatkah saya kembali ke slide sebelumnya?
Yakin.
Pertanyaan tentang ini?
Atau Anda hanya ingin melihat itu?
AUDIENCE: Aku hanya tidak bisa melewatinya.
>> SPEAKER 1: OK, keren, ya.
Ini semua akan online sehingga tidak khawatir tentang mendapatkan setiap kata.
Dan untuk kepentingan waktu, aku akan pergi.
Apakah itu OK?
Mengagumkan.
OK keren.
Jadi mari kita bicara tentang kind-- sangat spesifik
jadi kita harus umum ini struktur pohon,
yang hanya apa yang memungkinkan kita untuk jenis peringkat hal hierarkis.
>> Pohon biner adalah hal-hal di mana setiap simpul memiliki paling banyak dua anak.
OKE?
Dan aku berkata, OK, sehingga tampaknya sesuai deskripsi ini.
Aku berkata node, bukan pohon pencarian biner.
Apa pohon pencarian biner?
Ini diurutkan.
Jadi Anda tahu bahwa di pohon pencarian biner,
semuanya ke tree-- segalanya ke kelenjar kiri lebih kecil,
dan segala sesuatu dengan node yang tepat adalah lebih besar.
Jadi ini bukan pohon pencarian biner.
Ini hanya sebuah pohon biner.
Jadi kita memiliki kategori besar pohon, kategori sedikit lebih kecil
pohon biner, pencarian oleh a-- pohon pencarian biner.
Keren?
Baiklah.
>> Dan sekarang, paling menyenangkan dari semua, kami telah mencoba kita.
Kalian melihat gambar ini di kuliah?
Ya, itu harus terlihat super familiar.
Mari kita lihat bagaimana kita mungkin benar-benar menerapkan ini.
Atau sebenarnya, mari kita lihat, apakah itu bahkan datang?
Nggak.
Baiklah, kita bahkan tidak perlu khawatir tentang itu hal tingkat rendah.
Kami akan memiliki banyak waktu untuk mengatasi kemudian P ditetapkan 5.
Tapi untuk saat ini, tingkat hanya sangat tinggi, kami tahu bahwa ini adalah apa yang tampak seperti.
Kami menggambarkannya sebagai jenis tabel hash multi-level
where-- apa toko ini?
Ini menyimpan nama-nama ilmuwan bahwa kita benar-benar dapat
mencari dengan hanya semacam mengikuti tabel hash yang berbeda turun, oke?
>> Dan tujuan ini, dalam teori, mereka menyediakan waktu konstan tampilan up.
Jadi jika saya ingin memeriksa itu, misalnya, siapa yang someone--
yang Mandel dalam ini trie, aku bisa sangat cepat
di linear-- Maaf, di waktu yang konstan, mencari tahu
apakah itu di trie.
Tapi con, adalah melihat seberapa besar ini.
Kami bahkan tidak menyimpan bahwa banyak data, dan itu sangat besar.
Jadi satu con besar adalah bahwa hal itu menggunakan sejumlah besar memori.
Iya nih.
>> AUDIENCE: Mengapa memberikan waktu yang konstan, tepatnya?
>> SPEAKER 1: Sekali lagi?
>> AUDIENCE: Apa intuisi mengapa ia menyediakan waktu yang konstan?
>> SPEAKER 1: Pertanyaan yang bagus.
Mengapa memberikan waktu yang konstan?
Jadi apa yang bisa kita lakukan adalah, mari kita mengatakan kami sedang mencari Mandel.
Kita tahu bahwa kita ingin memulai di tingkat pertama di M.
Kita tahu kita ingin mengikutinya ke E. Jadi itu mengambil satu langkah, dua langkah, kan?
Kami mengikuti ke N. kami mengikutinya ke D. Kami mengikuti ke E. kami mengikutinya ke L.
Dan kemudian hal berikutnya yang kita periksa says-- delta ini mengatakan Ya, itu
di meja kami.
Itu adalah sebuah kata.
Itu adalah entri yang valid di trie kami.
Jadi kau mengatakan, OK, yang mengambil tujuh langkah.
Tetapi jika kita menambahkan seperti miliaran lebih para ilmuwan untuk struktur data,
kita tidak harus memeriksa miliaran lebih banyak hal.
Kami hanya pernah akan harus mengambil tujuh langkah, panjang orang yang
nama.
>> Jadi, kita suka berpikir runtime sebagai, misalkan
kita meningkatkan ukuran kami struktur data, berapa lama lagi
itu akan mengambil?
Dalam hal ini, jika kita menambahkan a bunch lebih banyak ilmuwan, itu tidak masalah.
Ini masih akan mengambil jumlah waktu yang sama.
Ini waktu yang konstan.
Iya nih.
>> AUDIENCE: Bagaimana Anda tidak tahu untuk memindai melalui nomor lain?
SPEAKER 1: Bagaimana saya tahu bagaimana to--
AUDIENCE: Seperti bagaimana Anda tahu Anda pergi langsung dari M ke E dan tidak M ke A?
SPEAKER 1: Oh, tentu.
Karena aku tahu aku mencari kata Mandel,
dan aku hanya tahu itu M-E. Jadi itu-- ya, silakan.
AUDIENCE: Bukankah Anda memiliki untuk melihat surat-surat lainnya
di sisa [tak terdengar]?
>> SPEAKER 1: Ah, tidak akan saya untuk melihat OK the--, besar.
Ini adalah pertanyaan besar.
Itu tergantung bagaimana kita menerapkannya.
Jika kita menerapkannya hanya sebagai seperti serangkaian array
di mana kita tahu bahwa E adalah selalu pada posisi 0,
Saya tidak tahu, apa pun Indeks nomor di.
Ya, kita hanya bisa melakukan konstan waktu, jangan, jangan, jangan, lakukan.
Keren.
Pertanyaan di sana?
>> AUDIENCE: Apakah waktu yang konstan hal yang sama seperti real time?
SPEAKER 1: Apakah waktu yang konstan hal yang sama adalah real time?
Saya tidak benar-benar yakin real time adalah.
AUDIENCE: time Anda suka yang harfiah berlangsung kedua
oleh kedua sebagai lawan yang variabel independen.
>> SPEAKER 1: Oh, ya, Anda bisa memikirkan cara itu.
Dengan kata lain, itu tidak tergantung pada ukuran struktur data.
Itu cara untuk memikirkan itu.
Ada pertanyaan lain?
Mungkin dalam pertama kalinya dalam sejarah, kami selesai tepat waktu.
Jika Anda memiliki pertanyaan, merasa bebas untuk datang meminta kami, pergi ke bagian,
berbicara dengan Anda TF, kantor jam adalah 08:00 dan 08:30
sampai 11:00 pada hari Senin dan Selasa, sehingga itu adalah sedikit waktu yang berbeda,
jadi pastikan Anda perhatikan bahwa.
Ya.
>> AUDIENCE: Apakah kita perlu tahu hal-hal seperti argumen baris perintah,
ls dasbor, lari apapun?
>> SPEAKER 1: Command line argumen, dan perintah Linux,
ya, Anda perlu tahu mereka.
Very-- itu seperti jenis tingkat hal kita bahas dalam bagian 0,
sejauh perintah Linux pergi.
>> AUDIENCE: Apakah jam di Annenberg?
SPEAKER 1: jam kantor, aku tidak sepenuhnya yakin di mana mereka berada.
Tetapi Anda dapat memeriksa website, dan akan memberitahu Anda.