>> [Bermain muzik]
DAVID J. MALAN: ini adalah seperti seminar mahasiswa hari ini.
OKAY.
Jadi sangat hujan keluar.
Ini cenderung untuk berlaku pada hari Rabu, tetapi semua peluang yang lebih
untuk soalan hari ini.
Oleh itu, marilah kita mulakan sebenarnya dengan filem itu hanya seketika.
Tetapi kita akan bermula secara besar-besaran seperti biasa.
>> Ini adalah CS50, dan ini adalah akhir minggu 4.
Jadi, jika anda pernah menonton TV atau mana filem
ada beberapa pakar-pakar komputer dan polis, atau FBI, atau agensi beberapa
cuba untuk menangkap beberapa musuh, baik, anda telah
mungkin pernah mendengar ungkapan "meningkatkan," mana juruteknik yang entah bagaimana
ajaib Zum ke dalam tak terhingga jauh untuk melihat penjenayah
pengenalan atau nombor pendaftaran walaupun dalam kilauan cermin
atau bersinar mata seseorang.
Maka sesungguhnya, mari kita lihat pada beberapa adegan seperti dari Hollywood.
[VIDEO MAIN SEMULA]
-OK, Sekarang mari kita lihat yang baik pada anda.
>> -Pegang itu.
Berlari kembali itu.
>> -Tunggu sekejap.
Pergi ke kanan.
>> -Terdapat, Pembekuan itu.
-Skrin penuh.
-OK, Pembekuan itu.
-Tighten Pada itu, akan anda?
-Vector Dalam pada itu Lelaki oleh roda belakang.
-Zum Dalam di sini di tempat ini.
-Dengan Peralatan yang betul, imej boleh dibesarkan dan tajam.
-Apa itu?
-Ia Merupakan satu program peningkatan.
-Bolehkah Anda jelas bahawa apa-apa?
-Saya tidak tahu.
Mari kita mempertingkatkannya.
>> Seksyen -Meningkatkan A6.
>> -Saya Dipertingkatkan terperinci, dan- Saya fikir ada
cukup untuk meningkatkan, melepaskannya ke skrin saya.
-Saya Dipertingkatkan refleksi dalam mata dia.
>> -Biarkan Melarikan ini melalui peningkatan video.
-Edgar, Anda boleh meningkatkan ini?
>> -Bertahan.
>> -Aku Telah bekerja pada refleksi ini.
>> Renungan -Someone ini.
-Reflection.
-Ada Mencerminkan muka orang itu.
Renungan -The.
-Ada Pantulan.
-Zum Masuk pada cermin.
-Anda Boleh melihat pantulan.
-Boleh Anda meningkatkan imej dari sini?
-Boleh Anda meningkatkan dia di sini?
-Boleh Anda meningkatkan ia?
Bolehkah anda meningkatkan ia?
>> -Boleh Kita meningkatkan ini?
>> -Boleh Anda meningkatkan ia?
-Hold Sekejap, saya akan meningkatkan.
-Zum Di pintu.
-Times 10.
-Zum.
-Move Masuk.
-Lebih.
-Wait, Berhenti.
-Stop.
-Pause Ia.
-Putar Kita 75 darjah sekitar menegak, sila.
-Stop.
Kembali ke bahagian kira-kira pintu, sekali lagi.
>> -Got Penambah imej bitmap yang boleh?
>> Hey, mungkin kita boleh menggunakan Pradeep Kaedah Sen untuk melihat ke tingkap.
Perisian -Ini adalah keadaan seni.
>> Nilai eigen -The dimatikan.
>> -Dengan Kanan gabungan algorithm--
>> Penghapusan diambil -Dia ini algoritma untuk peringkat seterusnya,
dan saya boleh menggunakannya untuk meningkatkan gambar ini.
>> -Lock Pada dan membesarkan-paksi z.
>> -Meningkatkan.
-Freeze Dan meningkatkan.
>> [AKHIR MAIN SEMULA]
>> DAVID J. MALAN: Baiklah, jadi semua orang-orang yang benar-benar kata-kata.
Mereka hanya digantung bersama-sama dalam cara yang tidak benar-benar waras.
Dan, sebenarnya, CS50 dan kursus seperti itu cenderung untuk merosakkan banyak TV dan filem
untuk anda.
Kerana apabila mereka yang pakar komputer adalah suara ketuk-ketuk di luar terma dan berkata
perkara-perkara mewah seperti vektor eigen, dan paksi-z,
dan apa-apa bilangan lain sebenarnya terma yang lebih teknikal,
mereka benar-benar hanya meregang perkataan bersama-sama semua terlalu kerap.
Adakah itu salah satu harapan kita ialah, sebagai kesan sampingan kursus pengambilan
seperti ini, akan lebih ramai orang dalam dunia sebenarnya dapat menimbang dalam
dan hanya pernah jadi sedikit mempengaruhi kualiti dan ketepatan filem-filem?
>> Malah, mari kita lihat pada realiti.
Jadi di sini adalah gambar kakitangan daripada Mary, salah satu daripada rakan-rakan yang mengajar kami.
Dan andaikan dia disyaki sesuatu.
Namun, ada pancaran beberapa keping bukti mata dia,
atau pantulan cermin mata beliau.
Nah, jika kita betul-betul seperti filem-filem mencadangkan, di mana kita mengezum dan "meningkatkan",
ini adalah bagaimana banyak maklumat di muka Mary
apabila anda menangkap imej dengan resolusi asal.
>> Dan, sebenarnya, anda boleh melihat titik ini.
Dan ini adalah apakah dipanggil piksel, P-I-X-E-L-S,
yang hanya persegi biasanya iaitu titik yang menggubah imej.
Dan kembali pada hari itu, dan sebenarnya walaupun hari ini dengan beberapa LED TV hari ini
atau LCD TV, jika anda telah mendapat satu dalam bilik anda atau di rumah,
jika anda pergi ke super dekat kepadanya, dan terutamanya jika ia TV yang agak lebih tua,
anda boleh mungkin juga melihat titik ini dan itulah yang mengarang imej.
>> Dan tidak ada yang lebih maklumat daripada ini.
Kita boleh "meningkatkan", dalam erti kata melicinkan perkara yang lebih dan jenis
membuat kesimpulan jenis, jenis apa warna harus bersebelahan mata Mary
supaya ia tidak sebenarnya begitu pixelated.
Tetapi jika saya terus zoom masuk, terdapat adalah lelaki yang buruk di mata beliau.
Seperti yang semua maklumat yang kita ada.
Anda tidak boleh mencipta maklumat dari tiada.
Terdapat hanya terbatas Bilangan bit sana.
>> Jadi dalam Set Masalah 4, di mana anda mempunyai peluang
bermain dengan jenis ini dunia.
Dalam Set Masalah 4, anda akan meneroka dunia grafik dan forensik,
dan benar-benar menulis kod yang pulih hilang imej.
Anda akan menulis kod yang memanipulasi imej yang sedia ada
dan akhirnya memahami apa yang berlaku di bawah hood.
>> Dan, ternyata, ia sebenarnya tidak semua yang rumit.
Sebagai contoh, jika kita mahu mewakili muka senyum di mana
dengan ini piksel hitam, atau ini titik hitam,
baik, kita hanya boleh mewakili mereka benar-benar satu bitmap.
Dan jika anda pernah mendengar bahawa bitmap bersuara, mungkin
sekarang mula membuat rasa sedikit lebih hari ini.
>> Kita sudah tahu apa yang sedikit adalah.
Ia adalah 0 atau 1.
Dan peta sahaja sesuatu seperti sekeping kertas
yang memberikan anda arahan dan mempunyai mungkin grid x- dan y-koordinat.
Jadi di sini adalah bitmap.
Ia adalah satu peta bit mana 1 nampaknya
akan mewakili piksel putih, dan 0 akan mewakili piksel hitam.
Tetapi kita boleh flip sekitar.
Ia tidak benar-benar perkara supaya selagi kita konsisten.
Dan di sini adalah bagaimana, dalam binary-- dalam memori komputer, atau di dalam
fail pada keras anda drive-- boleh anda menyimpan
yang paling mudah imej wajah smiley.
Tetapi apakah kita, sudah tentu, kekurangan dalam imej ini?
Warna, bukan?
Ia merupakan satu langkah seterusnya yang jelas atau peningkatan untuk memperbaiki ini dengan warna.
Lebih malang lagi dengan hanya satu bit, 0 atau 1, kita boleh mewakili warna.
Itu boleh menjadi merah, atau biru, atau hitam, atau putih, atau hijau, atau merah jambu,
atau mana-mana pasangan warna.
Tetapi demi kesederhanaan ini, kita akan hanya menganggap hitam dan putih.
>> Jadi apa logiknya kita perlu jika kita mahu melaksanakan warna dalam imej?
Apa yang perlu kita lakukan?
Seperti jika faktor penghad sini adalah bahawa dengan satu bit anda hanya boleh
mewakili kedua-dua negeri, 0 atau 1, putih atau hitam, apa yang anda mahu lakukan?
PENONTON: Lebih data.
DAVID J. MALAN: Lebih bit, yeah lebih banyak data, lebih bit.
Dan, sememangnya, itulah bagaimana imej warna diwakili.
Daripada menggunakan sedikit tunggal, 0 atau 1 untuk setiap piksel, setiap dot,
anda hanya menggunakan berbilang.
Mungkin menggunakan 8, mungkin, lebih biasa menggunakan 24, dan sesungguhnya, dalam Set Masalah
4, anda akan bermain dengan fail format yang menggunakan 24 bit biasanya.
>> Namun yang paling penting anda mungkin biasa dengan JPEG.
Jika anda pernah diambil foto di telefon anda,
atau dimuat naik atau melihat sesuatu pada Facebook, atau Flickr, apa-apa bilangan
laman web berdasarkan gambar-, anda telah mungkin melihat imej JPEG sebelum ini.
Dan ternyata, ini adalah fail format kita akan gunakan dalam pset 4,
di mana anda akan perlu pulih imej
bahawa saya telah sengaja dipadam daripada kad memori rosak dengan kamera,
jika anda akan.
>> Dan ternyata bahawa walaupun JPEG adalah sophisticated-- cantik
ia lebih canggih daripada titik-titik hitam dan putih
kita lihat sebentar tadi, kerana ada algoritma sebenarnya mewah yang
digunakan untuk memampatkan JPEG, jadi bahawa anda boleh mempunyai benar-benar baik,
gambar berkualiti tetapi menggunakan relatif sedikit bit.
Dan kami akan kembali kepada mampatan tidak lama lagi.
Ia ternyata bahawa yang pertama tiga bait dalam image-- JPEG
tidak kira apa yang anda telah ambil gambar daripada- adalah nilai-nilai 255, 216, 255.
>> Dalam erti kata lain, jika anda hanya melihat bahawa corak bit,
diwakili di sini tiga bait, atau 24 bit jumlah,
dengan kebarangkalian tinggi anda boleh membuat kesimpulan bahawa anda sedang mencari pada itu tiga pertama ini
bait yang JPEG.
Dan ini adalah apa yang diketahui sebagai tandatangan seorang JPEG.
Banyak format fail di luar sana cenderung untuk mula
dengan corak tertentu 0 dan 1s, supaya Windows dan Mac OS, dan IOS,
dan Android tahu apa jenis fail mereka adalah, sebagai tambahan kepada fail yang dipanggil
lanjutan yang banyak fail ada.
Jika anda telah .jpg, itu satu lagi petunjuk ke komputer.
>> Jadi mari kita lihat sekarang ini lebih sedikit dari segi teknikal.
Kita tahu perpuluhan sistem adalah 0 hingga 9.
Kita tahu binari adalah 0 dan 1.
Dan jika anda berfikir kembali ke pset 0, kita mempunyai anda bergelut dengan,
yang sedikit, sesuatu dipanggil perenambelasan,
di mana anda mempunyai 16 digit, dan bukannya 10 atau bukan 2.
Dan orang-digit, oleh konvensyen, 0 hingga 9 dan kemudian
melalui f, di mana f mewakili apa nombor perpuluhan, hanya sebagai kewarasan cepat
cek?
Jadi, 15.
Dan mesti mewakili 10, hanya dengan sifat pesanan yang saya telah diberikan.
Ia hanya konvensyen sewenang-wenangnya, tetapi ia agak standard.
>> Jadi, jika kita melihat corak ini tiga bytes-- mari
hanya mula melihat ia dalam cara yang konsisten dengan bagaimana
saintis komputer umumnya melihat dan berfikir tentang fail.
Anda tentu boleh berfikir tentang gambar dalam 0s dan 1s, dan perpuluhan,
tetapi pada hakikatnya, kita cenderung untuk menggunakan binari atau lebih biasanya hexadecimal--
kembali dari Serangga 0.
Jadi biarlah saya mencadangkan supaya 255, 216, dan 255 hanya ini corak 0 dan 1s.
Dan anda boleh menyemak ini jika anda mahu lakukan matematik dari Minggu 0.
Tetapi, buat masa ini, hanya menganggap bahawa ini memang betul.
Saya baru sahaja ditulis semula tiga perpuluhan nombor sebagai tiga nilai binari.
Sekarang apa yang saya akan lakukan ialah hanya menambah sedikit ruang putih,
hanya demi pembacaan itu.
Dan notis, saya hanya akan untuk menggerakkan kereta.
Jadi sebelum, selepas, sebelum, selepas.
Saya melakukan apa-apa lain yang menarik daripada sekadar menyebarkan perkara-perkara di luar jadi
bahawa notis setiap set lapan bit kini dua set empat bit.
Ini berguna kerana perenambelasan amat bergaya
kerana setiap perenambelasan digit 0 melalui f, atau lebih khusus 0 hingga 15,
boleh diwakili dengan tepat empat bit.
Dengan kata lain, dalam perenambelasan jika anda mahu mewakili 0, ia hanya 0000,
empat sifar.
Dan jika anda mahu untuk mewakili 15, itu 1111, yang merupakan empat bit.
Dan jika anda matematik, jika ini adalah tempat sa,
ini adalah tempat 16s itu, yang akan memberi atasmu,
dan bukan yang akan supaya- maaf, dalam binari,
yang akan memberikan anda 15, orang-orang yang berlaku, tempat berdua-dua, merangkak dan lapan tempat.
Jadi biarlah saya mencadangkan bahawa set empat bit di sebelah kiri
adalah apa yang kita akan memanggil f.
Ia adalah jumlah yang paling besar anda boleh mewakili empat bit.
Dan kita sudah tahu dari perenambelasan, f adalah angka yang paling besar dalam perenambelasan.
Kami telah mendapat f lain di sana, dua lagi di sana.
Dan buat masa ini, hanya mengambil iman bahawa saya telah dilakukan dengan betul matematik
dan separuh kiri mereka bit, 1101,
adalah perkara yang sama seperti d dalam perenambelasan.
Dan tangan kanan, 1000, hanya 8.
>> Dan bahawa seseorang mudah untuk melihat, bukan?
8 represents-- yang tepat di bawah bahawa tempat lapan.
Oleh itu, kita mempunyai satu di ruangan lapan yang dan apa-apa dalam merangkak, berdua-dua atau orang-orang.
Jadi sekarang lebih konvensional, manusia cenderung untuk menulis digit perenambelasan seperti ini,
anda hanya squish mereka bersama-sama, dan kemudian anda awalan mereka dengan 0x.
Ini bermakna apa-apa selain daripada petunjuk visual untuk human-- yang
di sini datang value-- perenambelasan kerana ia mungkin yang tidak jelas.
>> Yang mengatakan, akhirnya, yang corak sifar dan satu,
atau corak perenambelasan digit setara bahawa anda
akan mula mencari dalam Set Masalah 4 adalah this--
dan Set Masalah 4 spec akan berjalan anda melalui ini dengan lebih detail--
tetapi menyedari sebagai jenis yang sukar difahami sebagai ini mungkin kelihatan pada pandangan pertama,
anda akan mula melihat banyak ini.
Dan sebenarnya, walaupun dalam GDB, yang penyahpepijat kami memperkenalkan pada Isnin
dan Dan memperkenalkan dalam Serangga 3, akan sering menunjukkan nilai-nilai perenambelasan
hanya kerana mereka cenderung untuk menjadi lebih konvensional daripada perpuluhan atau binari
dalam dunia komputer.
Sekarang mari kita meletakkan ini ke dalam konteks.
Ramai daripada anda mungkin ingat ini gambar di sini, yang datang dari apa?
Vista, jadi lebih awal daripada itu, Windows XP melakukan debut ini.
Jadi ini adalah landskap yang indah.
Dan sebenarnya, jika anda mencucuk di sekitar online-- Saya fikir ia adalah satu artikel Wikipedia,
di mana seseorang yang sangat menakjubkan keluar mendapati lokasi ini di dunia ditubuhkan
atau kamera beliau dalam tepat place-- yang betul
dan hari ini kelihatan like-- tetapi ia betul-betul tetapan yang sama.
Imej ini, walaupun, adalah dalam fail format dipanggil bitmap, b-m-p.
Dan kita akan mengambil yang super renungan pada apa yang bermakna.
>> Tetapi bitmap hanya cara yang berbeza imej yang mewakili masih menggunakan piksel
dalam 0 dan 1s, akhirnya.
Tetapi pada pandangan cepat, ia mempunyai tandatangan yang lebih menarik
pada awal fail.
Ia bukan hanya tiga bait, dan bukan ada
sejumlah besar pola bait yang telah ditentukan terlebih dahulu makna.
Sebagai contoh, di suatu tempat di Beberapa bait pertama imej bitmap
akan menjadi saiz imej, lebar imej,
ketinggian imej, jadi metadata berguna, jika anda akan.
Maklumat yang berguna yang Photoshop atau program apa-apa grafik anda menggunakan
sebenarnya mungkin hargai.
>> Jadi lebih mengenai ini dalam Set Masalah 4, tetapi ini
hanya untuk mengatakan bahawa pada akhir hari
semua format fail yang anda telah menggunakan untuk years-- fail Microsoft Word,
Nombor fail, fail Excel, apa-apa bilangan format fail
yang mungkin mempunyai beberapa dikenali sambungan fail
hanya 0s dan 1s bawah hood.
Dan manusia telah membuat keputusan apa konvensyen berada,
apa corak 0 dan 1s mewakili memfailkan Word berbanding fail Excel,
berbanding apa-apa bilangan format fail lain.
Jadi dalam pset 4, anda akan mempunyai peluang untuk bermain dengan itu.
>> Tetapi apakah ertinya mempunyai struct.
Ini sebenarnya Shalawat bagus sekarang ke dalam C, yang hanya mempunyai satu pasangan
ciri-ciri tambahan yang kami tidak melihat lagi.
Ia adalah satu bahasa yang cukup kecil dan salah satu ciri-ciri yang menarik mengenai C adalah struct.
Sebagai contoh, jika anda mahu represent-- mari
katakan anda mahu mempunyai pembolehubah yang mewakili pelajar dalam program tertentu.
Mungkin anda telah menulis kursus program pendaftaran, atau membeli-belah teras
alat, atau sesuatu seperti itu.
Apakah bahagian data yang berkaitan kepada pelajar yang datang ke fikiran?
Seperti pelajar adalah diwakili dengan nilai apa?
Ya?
Anda mempunyai nama sebagai pelajar.
Apa lagi perkara yang pelajar biasa ada?
>> PENONTON: [didengar]
>> DAVID J. MALAN: Jadi, maaf.
>> PENONTON: Age.
>> DAVID J. MALAN: Umur Satu atau hari jadi setara, yep.
Apa lagi?
PENONTON: nombor ID?
DAVID J. MALAN: Jadi nombor ID, mungkin nombor telefon, mungkin asrama, atau rumah,
atau kolej, atau sesuatu seperti itu.
Apa-apa bilangan bahagian data yang anda mungkin mempunyai dalam senarai kenalan anda
adalah apa yang mungkin menentukan pelajar.
Jadi, jika kita mahu melakukan ini, kod, mungkin kita lakukan sesuatu yang mudah seperti ini.
Kita mungkin mempunyai program supaya mempunyai katakan, int main (tidak sah).
Dan jika saya mahu untuk mewakili pelajar saya mungkin mempunyai, misalnya,
tali yang dikenali sebagai nama untuk pelajar itu, tali yang dikenali sebagai asrama untuk pelajar itu,
mungkin int dipanggil ID untuk pelajar itu.
Dan kerana saya menggunakan tali, Saya perlu kembali dan meletakkan CS50.h.
Mungkin saya akan memerlukan stdio.h.
Jadi biarlah saya preemptively cara orang-orang dan saya akan memanggil student.c ini buat masa ini
dan menyelamatkan ini.
>> Dan sekarang saya boleh melakukan sesuatu dengan pembolehubah ini.
Dan kami hanya akan menulis bahawa sebagai komen kod pseudo,
kerana ia tidak menarik apa yang kita lakukan sekarang.
OK, jadi ini adalah program yang entah bagaimana menyimpan pelajar.
Apa yang saya mahu lakukan jika saya mahu menyimpan dua pelajar?
Jadi naluri pertama saya akan menjadi hak semua, tunggu satu minit,
jika saya mempunyai pelajar lain mengapa tidak saya hanya melakukan rentetan nama 2, tali asrama 2,
int ID2.
Dan kita telah melakukan pergi ke jalan ini sebelum
dan apa yang penyelesaian kami untuk apa yang kelihatan untuk berbuat baik daripada copy paste hackish
kerja di sini?
PENONTON: Pelbagai.
DAVID J. MALAN: Ya, kita boleh menggunakan array.
Hak ini dengan cepat menjadi dikawal.
Anda perlu menyelesaikan sewenang-wenangnya mula menamakan semua pemboleh ubah ini.
Dan anda, manusia, perlu terus trek yang sepadan OK NAME2
dengan dorm2 sepadan dengan ID2.
Ia hanya menjadi kacau-bilau.
Jadi ia adalah lebih mudah, ingat dari beberapa minggu yang lalu,
hanya perlu memanggil nama rentetan dan mungkin memberi kita tiga daripada mereka.
Dan kemudian mungkin kita mempunyai asrama tali dan mempunyai
tiga daripada mereka, atau dengan tetap, int id dan mempunyai tiga daripada mereka.
Tetapi sekarangpun ini berasa ceroboh, bukan sedikit.
Kami bercakap tentang pelajar dan lagi Saya benar-benar kediaman pada tahap yang rendah
butir-butir pelaksanaan.
Pelajar adalah nama dan asrama dan ID.
>> Mengapa saya tidak boleh hanya mengisytiharkan pembolehubah dipanggil pelajar dan memanggilnya s.
Dan jika saya mahu pelajar lain, mengapa tidak saya hanya memanggilnya t.
Atau jika saya mahu sejumlah pelajar, mengapa tidak saya
mengatakan saya mempunyai kelas keseluruhan pelajar, dan ia adalah tiga daripada mereka.
Dengan kata lain, mengapa saya tidak boleh datang dengan jenis data saya sendiri, yang dipanggil
Pelajar, di dalam yang adalah nama, adalah ID, adalah asrama,
apa-apa beberapa bidang lain.
Dan ternyata anda boleh melakukan perkara tersebut.
>> Jadi C mempunyai ciri-ciri ini dipanggil struct.
Itu adalah ciri bahasa yang membolehkan kita untuk melakukan perkara ini.
Saya akan pergi ke hadapan dan membuka structs.h
di mana kita akan melihat mengikut definisi pelajar.
Ia ternyata - dan ini adalah juga lebih mudah daripada yang melibatkan satu ID
masa lalu.
Jika anda ingin datang dengan jenis data buatan sendiri anda,
dan sebagai tambahan kepada int, dan char dan terapung dan semua yang lain ini yang wujud,
anda boleh berbuat demikian dengan literal menulis typedef struct,
kemudian beberapa pendakap kerinting, di dalam yang anda
menyenaraikan pembolehubah anda mahu kaitkan dengan data adat baru ini
menaip seperti nama dan asrama, dan kemudian selepas pendakap kerinting
anda memberikan nama kepada jenis data yang baru.
Jadi, sebagai contoh, pelajar.
>> Dan apa yang baik tentang ini sekarang ialah jika kita melihat kod yang sama,
konvensyen, pertama sekali, adalah untuk meletakkan ini
dalam fail dipanggil sesuatu dot h, fail header, yang kita tidak mempunyai
mula menggunakan diri kita terlalu banyak.
Tetapi kita akan mula menggunakan agak sedikit sekarang.
Dan apa yang boleh kita lakukan dengan ini, akhirnya, dalam ayat-ayat ini beberapa kod
adalah mengisytiharkan perkara tersebut jenis data, pelajar.
Dan sekarang mari kita menggunakannya.
>> Saya akan pergi ke dalam sekarang fail yang dipanggil structs1.c.
Dan mari kita lihat pada Beberapa ciri-ciri di sini.
Jadi barangan di sini adalah kebanyakannya biasa, dan kita akan
kembali kepada apa yang tidak biasa dalam hanya seketika.
Ini sudah tentu termasuk saya sendiri file kepala, yang baru juga,
kecuali Serangga 3 di mana, ingat, kita ada helpers.h.
Jadi, anda mungkin ingat helpers.h #include.
>> Kenapa walaupun saya gunakan petikan bukannya kurungan bersudut?
Bilakah saya memilih di antara mereka?
Hampir selalu saya seolah-olah menggunakan kurungan bersudut.
Dan kemudian, tiba-tiba pada garisan enam saya menggunakan tanda petik.
Mengapa yang mungkin?
Ya?
>> PENONTON: [didengar]
DAVID J. MALAN: Itu yang sebenar, apa?
PENONTON: Itu dalam IDE anda.
DAVID J. MALAN: Ya, yang dalam IDE sebenar saya.
Dan jangan menyentuh mengenai IDE, kerana itu hanya alat yang saya gunakan.
Yang dalam semasa saya direktori, secara khusus.
Jadi structs.h adalah fail saya sendiri tidak dipasang dalam IDE,
dalam sistem operasi itu sendiri, sebaliknya ia adalah di dalam direktori semasa saya.
Jadi konvensyen itu jika anda mahu untuk memasukkan fail header anda sendiri,
anda hanya menggunakan tanda petik.
>> Apa yang kita panggil perkara ini dalam baris 8, secara umum?
Ini adalah apa?
# menentukan sesuatu.
Ini mewakili pemalar, bukan?
Jika anda ingin mempunyai nilai dalam program anda
bahawa anda menggunakan keseluruhan sekumpulan kali, adalah
adat baik untuk faktor ia keluar, mengisytiharkan ia, dengan simbol hash
menentukan, maka, oleh konvensyen, dalam semua huruf besar word-- walaupun ia bukan
tegas perlu, tetapi ia konvensyen manusia
untuk mengambil kesempatan pemalar supaya mereka melompat keluar
pada anda visually-- ruang dan maka nilai yang anda mahu
bersamaan dengan nama yang berterusan ini.
Tiada koma bertitik, tetapi anda hanya mengikuti corak yang di sana.
>> Jadi apa yang saya lakukan dalam kod sebenar ini.
Oleh itu, mari kita lihat pada program utama di sini.
Selaras 12 kerana saya telah merangkumkan structs.h,
Saya kini mempunyai ajaib pada saya gunakan jenis data baru.
Saya tidak hanya mempunyai akses kepada int, dan char, dan apungan, dan tali,
dan biru dan lain-lain.
Saya kini mempunyai akses kepada jenis data pelajar.
Jadi dalam talian 12, saya menggabungkan dua ideas-- satu jenis data adat dan dua,
menggunakan array.
Dan sebagainya dalam program ini jika Saya mahu sebenarnya menyokong
tiga pelajar yang berbeza dalam program saya, saya
hanya boleh mengatakan memberi saya pembolehubah dipanggil pelajar, setiap yang
adalah pelajar jenis, yang adalah jenis data peribadi saya.
Dan, khususnya, memberi saya tiga daripada mereka yang pelbagai saya.
>> Jadi sekarang apa yang kita lakukan dalam program ini?
Di sini hanya untuk gelung iterating 0-3, kerana itulah
apa nilai pelajar adalah.
Saya hanya mendorong pengguna memberi saya nama pelajar.
Dan kemudian dalam talian 17, kita mempunyai garis kebanyakannya biasa.
Kami mempunyai kawan lama kami GetString di sebelah kanan.
Dan apa yang sekeping sintaks nampaknya baru,
jika anda tidak pernah diprogramkan dalam C sebelum ini, dan tidak pernah menggunakan structs?
Ya?
>> PENONTON: .name ini.
DAVID J. MALAN: .name ini.
Tetapi ini tidak terlalu banyak lompat, kerana sekarang pelajar braket i
memberikan anda i-ke-pelajar.
Dan jika anda mahu untuk menyelam dalam struktur itu,
anda hanya menggunakan masa yang tunggal dan kemudian nama pembolehubah di dalam,
atau kekayaan di dalam yang anda ingin mendapatkan akses kepada.
Begitu juga, jika saya kemudian mendorong pengguna, memberi saya asrama pelajar,
anda boleh menyimpan sama yang rentetan dalam pembolehubah asrama dalam
daripada struktur pelajar.
>> Dan sekarang hal-hal yang mewah sedikit.
Dan ini akan kelihatan di mungkin banyak tidak lama lagi.
Tetapi anda akan melihat ini jauh lebih dalam Serangga 4, jadi mari kita hanya renungan sekarang.
Ia ternyata bahawa selaras 23 melalui 38, apa yang anda fikir saya mungkin buat?
Saya telah dikeluarkan komen untuk hari ini, tetapi versi
kod dalam talian rujukan mempunyai semua komen.
Apa yang saya seolah-olah melakukan?
>> PENONTON: Menyimpan fail dengan semua maklumat yang pengguna yang dimasukkan.
>> DAVID J. MALAN: Ya, betul-betul, ini adalah cara yang baru
yang kita lihat dua, satu lagi ciri C,
di mana saya boleh membuat fail sendiri.
Setakat ini, hampir setiap program anda tulis adalah tidak bernegara.
Sebaik sahaja ia dilakukan berjalan, itu sahaja.
Tidak ada memori atau ingatan itu.
Tiada fail yang disimpan.
Tetapi jika anda mahu menyelamatkan input yang mempunyai
berlaku, seperti dalam permainan atau program seperti ini, ternyata kita boleh berbuat demikian.
Dan anda akan melihat ini lebih dalam pset 4 dan Bahagian.
Tetapi garis 23 dasarnya mencipta fail yang dipanggil students.csv.
Dan anda mungkin telah melihat ini sebelum ini.
Walaupun anda tidak pernah belajar CS sebelum ini, CSV adalah pembolehubah yang dipisahkan dengan koma.
Ia seperti seorang lelaki yang sangat miskin versi fail Excel,
yang bermaksud bahawa ia boleh dibuka dalam Excel dan dalam Bilangan Apple,
dan ia mempunyai baris dan lajur.
Tetapi ia bukan proprietari format seperti Microsoft atau Apple.
Ia hanya koma memisahkan nilai-nilai yang kita akan melihat dalam seketika.
>> Dan hanya mengambil tekaan.
Selaras 23, sekurang- akhir, hujah saya yang kedua
dengan fungsi baru ini dipanggil f terbuka untuk fail terbuka w.
Apa yang mungkin w menandakan?
Ya?
>> PENONTON: Ia membolehkan anda menulis kepada fail?
>> DAVID J. MALAN: Ia membolehkan anda menulis kepada fail.
Jadi ada beberapa variasi yang kita boleh pasangkan di sini.
Tetapi jika anda hanya mahu membaca fail, yang melihat ia
dan membacanya ke dalam ingatan, anda hanya menggunakan quote unquote "r".
Jika anda ingin menulis surat kepada fail, anda menggunakan quote unquote "w".
Ada juga menambah dan beberapa perkara lain
jika anda ingin mengubah suai fail yang sedia ada.
Sekarang kita akan terus melihat ini perkara, maka kita akan kembali ke talian 24.
NULL, ia ternyata, nilai khas yang
boleh dipulangkan oleh fungsi-fungsi tertentu jika sesuatu yang telah pergi wrong--
jika fail yang tidak wujud, jika anda telah kehabisan memori,
atau sekumpulan kesilapan lain.
Tetapi untuk sekarang, mari kita hanya menganggap bahawa ini adalah pemeriksaan ralat hanya konvensional.
Di sini di baris 26, saya iterating 0-3 ke atas semua pelajar saya.
Dan ini adalah jenis jenis sesuatu fungsi baru, fprintf,
tetapi hanya mengambil tekaan.
Jika printf hanya cetak rentetan diformat,
apakah fprintf mungkin bermakna?
PENONTON: Cetak ke fail.
DAVID J. MALAN: Cetak yang rentetan diformat ke fail.
Itulah apa tambahan f cara adalah fail.
Dan hujah pertama yang baru telah menjadi pembolehubah yang mewakili fail anda.
Maka kita hanya mempunyai format rentetan seperti printf.
Dan walaupun ini sintaks yang baru, ini hanya
ertinya pasangkan nama pelajar, plug-di asrama pelajar, dan kemudian
dengan fclose, tutup fail.
Dan kemudian lastly-- ini adalah baru dan kami akan kembali kepada ini
sebelum long-- saya membebaskan pelajar atas sebab-sebab
yang berlaku sehingga di atas sana.
Tetapi kita akan kembali itu sebelum long--
itu kerana bagaimana GetString adalah sebenarnya bekerja di bawah hood.
>> Jadi mari kita lihat cepat di sini.
Saya menaip ls di dalam direktori saya, melihat bahawa saya tidak
mempunyai fail yang dipanggil students.csv, hanya tidak ada, tidak wujud.
Jadi, jika saya kini menyusun program ini, membuat structs-1,. / structs-1,
dan saya akan pergi ke hadapan dan taip Andi, yang tinggal di Berkeley di Yale.
Kami akan mempunyai Rob yang tinggal di Thayer hari ini.
Dan mari kita datang dengan mana adalah, saya fikir, Maria di Mather,
jika saya ingat dengan betul.
>> Jadi tiada apa yang berlaku.
Tetapi jika saya menaip ls sekarang, terdapat students.csv.
Mari kita pergi ke hadapan dan students.csv terbuka.
Dan itulah yang sangat file format ringan.
Tetapi saya hanya pakai konvensyen bahawa saya mempunyai dua baris dan lajur di sini.
Lajur pertama ialah nama pertama rakyat.
Lajur kedua ialah pelajar yang asrama, atau kolej, atau rumah, atau barang kecil.
Dan sekarang saya telah menyimpan ini secara kekal dalam fail.
>> Jadi ia tidak semua yang menarik.
Tetapi ini hanya batu loncatan sekarang untuk dapat maklumat berterusan
selama-lamanya.
Jadi mari kita lihat sekarang apa lagi yang kita boleh lakukan dengan ini dan lain-lain ciri-ciri.
Tetapi pertama, apa-apa soalan?
Itu adalah banyak, dan yang cepat.
Tetapi anda akan melihat banyak lebih dalam pset 4, juga.
Ya?
>> PENONTON: Adakah terdapat cara untuk terus menambah nama-nama ke fail tersebut?
>> DAVID J. MALAN: Soalan yang baik.
Adakah terdapat cara untuk terus menambah nama kepada fail ini?
Ya.
Dan, sebenarnya, jika anda menamatkan up semula membuka fail,
anda akan menggunakan quote unquote "a" untuk tambah,
yang hanya akan menambah baris baru, baris baru lagi dan lagi, betul-betul.
Soalan yang baik.
Soalan-soalan lain?
Ya?
PENONTON: Jika anda berlari program lagi sekarang,
ia akan terus menambah nama-nama kepada fail atau ia akan membuka fail baru?
>> DAVID J. MALAN: Ah, soalan yang baik.
Jika anda berlari program sekali lagi betul sekarang, mungkin ditaip dalam nama-nama baru,
ia akan menambah ke fail atau menulis ganti fail?
Yang terakhir ini, kerana saya tidak menggunakan mod tambah.
Dan kerana saya hanya membuta tuli membuka fail untuk menulis,
ia hanya akan menulis ganti fail.
Jadi saya memang akan perlu lakukan adalah menambah, jika saya ingin benar-benar mempunyai jangka panjang
pangkalan data.
>> Sekarang CSV berguna, terus-terang, walaupun untuk seperti jika anda writing--
dan akhirnya kita akan melihat ini kemudian pada semester apabila
kita menggunakan CSVs untuk tujuan lain.
Jika anda ingin menyimpan semua rakyat yang telah mendaftar untuk acara tertentu,
atau mendaftar untuk pelajar anda kumpulan, atau sesuatu seperti itu,
menyimpan data dalam jenis ini format adalah super mudah.
Kerana secara literal, jika saya adalah untuk memuat turun fail ini.
Saya boleh double-- dan mari kita sebenarnya cuba ini
jika saya mempunyai Excel atau Nombor di sini.
>> Saya akan klik kanan atau kawalan-klik fail saya.
Alamak.
Klik kanan atau kawalan-klik fail saya.
Ayuh, tetikus saya tidak bekerjasama.
Download-- saya akan memuat turun semua fail di sini supaya
hanya jadi saya boleh turun satu ini.
Dan mari kita lihat jika ini kerja-kerja students.csv-- kali pertama
Saya telah diaktifkan.
Kini mereka mahu melihat kenalan saya.
Sekarang, saya perlu mendaftar.
Melihat betapa mudahnya adalah dengan menggunakan CSVs?
Ya, menyimpannya sehingga setakat ini.
OK, sekarang kita sudah bersedia untuk kelas.
OK, oh, apa yang baru?
OK, rapat.
Itu adalah ajaib.
OK, sekarang kita perlu dikemas kini.
Dan kini, ia terlupa apa memfailkan saya asalnya dibuka,
tetapi apa yang a-- ada kita pergi.
OK, jadi sekarang kita mempunyai fail Excel.
Terima kasih.
>> OK, jadi apa yang saya lakukan adalah bahagian yang mudah.
Sudah tentu saya boleh mempunyai pra-dipasang Excel atau Nombor, atau apa sahaja program.
Tetapi ini adalah baik, kerana sekarang saya boleh memanipulasi
data dalam format yang standard.
>> Jadi sekarang mari kita konteks beralih ke mana kita berhenti
Kali terakhir, yang adalah untuk mula untuk mengambil kira roda latihan.
Tetapi pertama, anda tidak melihat makan tengah hari sebelum ini
sekali lagi berlaku di sini di Bomba dan Ais di Cambridge, Sitar di New Haven.
Daftar di laman web CS50s ASAP untuk menyertai pelajar CS50 dan kakitangan.
>> Oleh itu, kita mengambil roda latihan off pada hari Isnin sebagai follows--
rentetan telah diisytiharkan di Perpustakaan CS50s untuk beberapa ketika.
Dan ia adalah baik, kerana ia membolehkan kita bercakap tentang pembolehubah sebagai
kata-kata yang lengkap dan ayat dan banyak lagi.
Tetapi ternyata rentetan tidak wujud.
Itu baru sinonim, atau alias, bahawa kami telah mencipta sesuatu yang
sebenarnya adalah lebih sedikit teknikal dipanggil char *.
>> Dan sesungguhnya, kita lihat contoh program pada hari Isnin
yang tidak berkelakuan agak seperti yang kita harapkan.
Ini adalah fail, membandingkan-0.
Dan ingat bahawa perbandingan-0, jika Saya susun semula program Isnin
dan menjalankan perbandingan-0 dan taip ibu dalam huruf kecil, dan ibu dalam huruf kecil lagi.
Program ini menegaskan Saya menaip perkara yang berbeza,
walaupun ibu, semua dalam huruf kecil, adalah sama secara visual.
Oleh itu, apa jawapan pendek mengapa komputer yang difikirkan
kedua-dua tali berbeza?
Ya?
>> PENONTON: [didengar]
DAVID J. MALAN: Betul.
Jadi, ibu, kali pertama Saya menaip dalam, sedang
disimpan di suatu tempat di komputer saya memori tetapi di lokasi yang berbeza
daripada kali kedua saya taip ibu.
Sekarang ia sudah tentu dapat dioptimumkan.
Komputer boleh menjadi pintar dan menyedari kedua-dua tali, hey,
mereka sama.
Janganlah aku redundantly menyimpannya.
Tetapi komputer tidak berbuat demikian pengoptimuman kecuali anda memberitahu mereka untuk.
Jadi, secara lalai, mereka hanya akan berakhir
di dua tempat yang berbeza dalam ingatan.
Dan supaya menjadi lebih jelas, apabila kita berbanding dua tali,
yang pertama telah dipanggil s, yang kedua dipanggil
t, apa yang khusus telah saya membandingkan sini pada baris 13?
Yeah.
>> PENONTON: Ia adalah tempat yang dalam ingatan yang berubah-ubah akan menunjukkan.
>> DAVID J. MALAN: Tepat sekali, saya membandingkan tempat dalam ingatan
bahawa orang-orang pembolehubah menunjukkan kepada.
Jadi secara khusus, jika ibu berada di bilangan bait 1 dan 2, dan 3,
dan 4-- kerana ingat backslash 0 perlu sepanjang jalan pada akhir.
Dan contoh lain ibu, m-o-m, adalah di alamat 10, 11, 12, dan 13.
Saya membandingkan 1, alamat itu, lokasi itu dalam ingatan,
terhadap 10, yang merupakan jelas tidak sama.
1 tidak 10.
>> Jadi ini adalah baik kerana ia cukup mudah.
Tetapi ia bermasalah setakat yang kita tidak boleh seolah-olah untuk membandingkan tali.
Jadi fundamentally-- dan pada tahap yang rendah ini,
jika anda mahu untuk melaksanakan program untuk membandingkan
dua perkataan berasingan bahawa pengguna telah ditaip dalam untuk kualiti,
adakah mereka beratur untuk char char, hanya secara umum,
apa yang perlu kita lakukan, nampaknya?
Ia tidak mencukupi hanya untuk melihat kedua-dua alamat.
Apa yang perlu kita lakukan?
Ya?
>> PENONTON: Melelar melalui tali [didengar].
>> DAVID J. MALAN: Ya, mari kita melelar melalui tali.
Mari kita gunakan untuk gelung, gelung sementara, atau apa sahaja yang anda paling selesa dengan.
Dan jika kami mempunyai dua tali di suatu tempat dalam ingatan, mari kita lihat pada setiap yang
Watak pertama, maka setiap yang kedua watak, kemudian ketiga, dan keempat,
dan kelima, sehingga kita mencapai apa nilai sentinel istimewa?
PENONTON: [didengar]
DAVID J. MALAN: Ya, backslash sifar, di mana titik sama ada rentetan
kita boleh membuat keputusan itu sahaja.
Adakah kita telah dipadankan setiap watak tunggal?
Jika tidak, kembali palsu.
Jika ya, kembali benar.
Dan supaya betul-betul apa versi ini program membandingkan-1.c tidak.
Ia adalah sama dengan apa yang kita melihat Isnin kecuali bahawa saya telah
mendapat menghapuskan daripada rentetan perkataan walaupun yang tidak mempunyai impact-- berfungsi semua
Saya lakukan sekarang adalah membuang beberapa roda latihan visual,
tetapi untuk melihat dengan jelas bahawa s dan t adalah alamat.
Dan itulah apa yang bintang, asterisk, mewakili
adalah alamat, atau dikenali lebih teknikal sebagai penunjuk.
>> Oleh itu, apabila saya mengaku s pada line 9 dan berkata char * s,
itu tidak bermakna memberi saya rentetan.
Ini bermakna memberi saya pembolehubah yang tujuan dalam hidup adalah untuk menyimpan alamat.
Kerana saya kira-kira untuk meletakkan alamat rentetan ke dalamnya.
Dan sesungguhnya GetString, untuk menjadi jelas, tidak akan kembali rentetan.
Ia tidak kembali ibu garis miring sifar, per se.
Apakah GetString khusus dan tepat kembali?
PENONTON: [didengar]
DAVID J. MALAN: Satu alamat, alamat aksara pertama
dalam beberapa rentetan ia telah mendapat.
Dan sekarang kita lihat kata kunci yang khas lagi.
Dan, saya dirujuk kepada ini lebih awal.
Ini akan menjadi adat baik bahawa kita akan melihat sekali lagi dan sekali lagi sekarang.
Saya memeriksa memastikan bahawa s tidak batal dan t tidak null.
Kerana berdasarkan saya benar-benar sebutan cepat sebelum ini,
apa yang mungkin bermakna jika GetString tidak mengembalikan alamat tetapi N-U-L-L, yang sekali lagi,
beberapa nilai istimewa?
>> PENONTON: Error.
>> DAVID J. MALAN: Ia ralat.
Ada sesuatu yang tidak salah.
Dan apa yang biasanya mungkin berlaku, terutamanya
dengan yang strings-- mungkin panjang tidak diketahui di advance--
mungkin komputer ' daripada ingatan, mungkin
anda taip dalam apa-apa perkataan lama atau ayat
atau ditampal seperti esei yang besar ada hanya tidak cukup memori.
Dan sebagainya GetString tidak boleh kembali alamat segala-galanya,
jadi ia hanya mengembalikan apa-apa.
Dan ia berkata kesilapan yang telah berlaku dengan mengembalikan nilai NULL khas.
Ia alamat sifar, jadi untuk bercakap.
>> Kini ternyata C datang dengan fungsi yang melakukan lelaran itu.
Kami tidak mempunyai untuk melaksanakan ini dengan untuk gelung atau gelung sementara diri kita sendiri.
Kita boleh menggunakan fungsi, dipanggil ringkas,
menggerakkan kompas, atau tali membandingkan, yang tujuan dalam hidup adalah untuk melakukan perkara tersebut.
Anda memberikan dua petunjuk, dua alamat, dan ia akan pergi ke alamat
dan kemudian bandingkan surat untuk surat surat untuk kualiti,
berhenti hanya apabila apa yang benar?
Apabila intuitif perlu kacau comp berhenti iterating, hanya untuk menjadi nyata?
Apabila ia mencecah garis sendeng terbalik 0 dalam sama ada tali, di mana titik ia boleh membuat keputusan
segala-galanya telah dipadankan, atau telah terdapat percanggahan?
>> Jadi, jika kita menjalankan ini sekarang dan cuba permainan permodalan kecil kita,
sehingga membuat perbandingan-1, ./compare-1, dan menaip ibu dalam huruf kecil kedua-dua kali.
Kini ia adalah perkara yang sama.
Dan jika saya melakukannya sekali lagi dengan huruf kecil dan kemudian mungkin huruf besar.
Kini ia memang membezakan antara huruf besar dan huruf kecil.
Jadi tidak semua yang keras atau ajaib, tetapi ia kini menerangkan
apa yang sedang berlaku di bawah hood.
>> Jadi apa lagi yang boleh kita mengeluarkan dari jenis ini pelajaran?
Jadi mari kita lihat ini.
Saya akan pergi ke hadapan dan menulis program cepat di sini dipanggil salinan-0.
Dan sekarang mari kita pergi ke depan dan benar-benar mari kita buat this-- dengan salinan-0,
kita lihat apa yang saya dapat di sini.
Saya mula-mula memberitahu pengguna, mengatakan sesuatu.
Kemudian saya mendapatkan tali yang dan saya menyimpannya di dalam s.
Kemudian saya memeriksa jika s sama sama NULL, hanya kembali 1.
Jadi ini adalah hanya semakan ralat piawai.
Tiada apa-apa yang menarik berlaku.
Dan sebenarnya, jika kita menghilangkan kesilapan memeriksa, ini kelihatan seperti minggu 1 kod
pada masa ini.
Tetapi saya telah mula mendapat sedikit lebih baik tentang itu.
>> Sekarang dalam talian 16, seminggu lalu, mungkin walaupun pasangan hari atau minit yang lalu,
anda mungkin berkata garis 16 adalah mewujudkan pembolehubah dipanggil t
dan penyalinan s ke dalamnya.
Dan itulah yang sempurna Fleet munasabah.
Tetapi lebih tepat sekarang.
Apa yang berlaku di garis 16?
Apa yang mendapat disalin dari kanan ke kiri?
Ya?
PENONTON: Apakah t mendapat alamat sesuatu s?
>> DAVID J. MALAN: Tepat, t semakin alamat s.
Jadi untuk menjadi jelas sekarang, jika saya pergi kembali kepada contoh yang awal
dan saya menarik keluar perkara yang saya telah ditaip.
Dan apa yang saya telah ditaip dalam- inilah s, dan di sini
adalah apa yang saya telah ditaip di suatu tempat di ingatan, ibu dan kemudian garis sendeng terbalik yang
0 yang yang ditambah untuk saya.
Apa yang saya disimpan di sini, masih ingat, ini adalah pada lokasi 1, 2, 3, 4,
ini adalah apa yang kini dalam s.
Jadi, jika pada baris 16 Aku berkata memberi saya pembolehubah dipanggil lain t dan menyimpan
dalam pada nilai s, apa akan disimpan di sini tidak akan ibu
tetapi hanya nombor 1.
>> Jadi, jika kita melihat ke hadapan dalam program ini sekarang, apa yang akan berlaku?
Jadi notis bahawa ada fungsi ini anda mungkin
telah menggunakan ini sedikit masa lalu untuk Caesar, atau Vigenere, atau mungkin tidak sama sekali.
Saya menuntut dengan printf saya, saya akan mengambil kesempatan salinan t.
Pertama dalam talian 19, kewarasan cepat cek, cek strlen panjang t.
Kerana saya tidak mahu cuba untuk mengambil kesempatan ke sesuatu
jika tidak ada tali di sana.
Jika pengguna hanya tekan Enter, tiada apa-apa untuk mengambil kesempatan.
Jadi, saya tidak mahu melakukan line 21.
Jadi garis 21 mengambil kesempatan mana surat, nampaknya, dalam t?
>> PENONTON: m?
DAVID J. MALAN: Ia kelihatan seperti ia penyalinan yang mana satu?
PENONTON: m.
DAVID J. MALAN: Eh, m.
OK, jadi m yang pertama, kerana notis bahawa saya
berpindah kepada toupper, yang jika anda tidak pernah melihat ia itu
hanya fungsi untuk mengambil kesempatan sebagai input.
t kurungan sifar bermakna memberi saya watak sifar t.
Dan sebagainya bagaimana ini perubahan picture, perlu jelas?
Apa yang perlu untuk ditulis semula atau diubah berkenaan dengan s dan t dan ibu
sifar garis sendeng terbalik.
>> PENONTON: [didengar]
>> DAVID J. MALAN: Ya, jadi yang satu ini di sini semata-mata
keperluan untuk berubah supaya- menetapkan this-- perlu mendapatkan ditukar kepada m modal.
Tetapi sekarang, lihatlah kemudian dalam program, jika saya mencetak
s dan t seperti yang saya membersihkan sini, menonton apa yang akan berlaku mencetak s dan t.
Oleh itu, salinan-0, ./copy-0.
Biar saya pergi ke hadapan dan taip di ibu dalam semua huruf kecil.
Perhatikan kedua-dua asal dan salinan yang telah dipermodalkan.
Mengapa?
Nah, s dan t kedua-duanya menunjuk ke, jika anda akan, sebahagian yang sama ingatan.
Dan terus terang, ini semakin benar-benar uninteresting-- fakta
bahawa kita menggunakan alamat sifar di sini.
Maksud saya, saya tidak peduli di mana barangan adalah dalam ingatan.
Maaf saya memadamkan sedikit terlalu banyak.
Tetapi saya tidak peduli di mana perkara-perkara yang dalam ingatan.
Dan sebagainya, sesungguhnya apa pengaturcara cenderung untuk berfikir tentang
ialah apabila anda bercakap tentang alamat, atau penunjuk,
yang mengambil berat di mana ia adalah dalam ingatan.
Saya tidak peduli, kalau di bait satu atau satu bilion.
Saya hanya peduli bahawa ini pembolehubah adalah berkesan
menghala ke arah yang sebahagian memori.
Dan sebagainya, selepas ini, bukannya berdalih lebih alamat ingatan sewenang-wenangnya, mari kita
hanya mula untuk menarik petunjuk sebagai petunjuk, sebagai anak panah.
Jadi apa s dan t yang sebenarnya, mengikut program ini,
kerana bagaimana saya mencipta t, ia hanya dua pembolehubah berasingan
menghala ke arah yang sama sebahagian memori.
Dan kita tidak peduli di mana mereka berada.
Oleh itu, kita boleh abstrak jauh detail itu.
>> Jadi bagaimana saya boleh menetapkan ini?
Jika saya mahu menulis versi salinan program yang benar-benar salinan tali
dan memanfaatkan sahaja menyalin, hanya intuitif,
apa yang mendapat menjadi satu ramuan untuk penyelesaian kami?
PENONTON: [didengar]
DAVID J. MALAN: Kami memerlukan apa?
PENONTON: Chunk memori.
DAVID J. MALAN: Kita perlu lain sebahagian memori, bukan?
Kita tidak tahu bagaimana untuk melakukannya lagi, semestinya.
Tetapi saya jenis perlu ini berlaku supaya bahawa ibu asal dalam kes yang lebih rendah
berakhir dalam itu sebahagian tambahan memori.
Dan kemudian apabila saya menukar salinan, saya tidak mahu mengubah salinan ini di sini.
Saya bukannya mahu menukar sahaja ini salinan supaya asal tidak diubah.
>> Jadi, mari kita lihat bagaimana kita boleh melakukan ini.
Dalam salinan-1, yang telah telah dilucutkan komen,
tetapi komen dalam talian.
Kami bukannya melakukan following-- ini baris adalah sama, mendapatkan saya rentetan
dan memanggil ia s.
Tetapi sekarang mari kita lihat salah satu yang paling kami kompleks tetapi terakhir kerumitan
untuk sementara, line 16 tidak betul-betul ini.
Jadi, jika anda selesa dengan gambar kita hanya drew--
memberikan saya sebahagian baru ingatan, menyalin segala-galanya ke dalamnya,
mari kita lihat bagaimana kita menterjemahkan kod.
>> Jadi garis 16, di sebelah kiri, char * t memberikan saya ruang ini di sini.
Itu sahaja yang ia.
Di sebelah kanan, m alloc, atau malloc,
adalah peruntukan memori, super mewah, cara yang samar hanya mengatakan
memberikan saya sebahagian memori.
Berapa banyak memori yang kita perlukan?
Nah, adalah jenis ungkapan besar.
Tetapi mari kita lihat apa yang dikatakan di sini.
Jadi ini, sudah tentu, adalah memberikan saya panjang tali s.
Jadi, ibu ia perlu apa?
Jadi hanya tiga, bukan? ibu adalah tiga watak.
Anda tidak mengira garis miring sifar apabila anda
bercakap tentang panjang rentetan itu sebenarnya surat-surat boleh dilihat manusia.
Jadi ibu, jadi ini memberikan saya 3.
Tetapi tunggu satu minit, saya kini menambah 1.
Mengapa saya benar-benar ingin memperuntukkan 4 bait dan bukan hanya 3?
Ya?
>> PENONTON: Untuk nilai sentinel?
>> DAVID J. MALAN: Tepat sekali, untuk nilai sentinel.
Untuk backslash sifar, Saya memerlukan 4 bait jumlah.
Jadi saya perlu panjang tali plus 1.
Dan kemudian hanya untuk measure-- baik walaupun pada sistem ini,
ia sentiasa akan menjadi 1-- saya katakan membiak ini dengan saiz char.
Rupa-rupanya sizeof adalah pengendali dalam C yang
hanya memberitahu anda Jumlah bait itu
diperlukan untuk jenis data tertentu.
Ia tidak berfungsi untuk tatasusunan, biasanya, kadang-kadang tidak.
Tetapi dalam kes umum, tidak.
Tetapi ia memberitahu saya berapa banyak bait yang char adalah, yang ternyata sentiasa 1.
Jadi ini adalah seperti didarab dengan 1.
>> Garis kelihatan begitu super samar kod.
Tetapi semua hal ini adalah memberikan saya sebahagian memori.
Tetapi adakah ia seolah-olah menyalin apa-apa ke dalam ingatan itu?
Belum lagi.
Dan supaya apa yang saya di talian 22, dan 23, 24, 25, baik, saya hanya melakukan ini.
Dan ini adalah jenis barangan sekolah lama sekarang.
Ini seperti pset 2, di mana anda hanya bergerak perkara
sekitar dalam ingatan, atau lebih tepat di tali.
>> Jadi, saya iterating dari 0 hingga panjang tali s.
Dan saya menyalin i-ke-watak dalam s ke i-ke-watak dalam t.
Dan kerana saya, pengaturcara, yang dibuat Pastikan anda memperuntukkan betul-betul seperti banyak bait
seperti yang saya perlukan, ia sesuai satu-sama-satu hubungan.
Dan saya menyalin ibu dalam huruf kecil kepada yang baru.
Dan kemudian akhir sekali, saya lakukan baris ini.
Dan supaya kesannya adalah hanya untuk mengambil kesempatan t ini di sini.
Jadi banyak untuk menyerap, tetapi jika kamu mempertimbangkan
apa yang sebenarnya berlaku di bawah hood
hanya bergerak ini bait sekitar, semua yang
diperlukan untuk menyelesaikan masalah ini adalah hanya untuk memberikan kita ini sebahagian memori.
Sekarang pada risiko menggalakkan, mari saya tunjukkan
satu contoh lain yang hampir sama, kecuali untuk yang satu ini
baris kod.
Jadi ini adalah versi penggodam program ini, jika anda akan.
Tetapi mari kita menyuling ia ke dalam apa yang sedang berlaku.
Line 24 pernah menjadi t ini kurungan i mendapat s kurungan i.
Sekarang, saya menukar ini kepada t bintang lebih samar
ditambah 1 sama dengan bintang s campur 1.
>> Jadi apa yang berlaku dan mengapa kita mempunyai watak bintang?
Kami telah melihat bintang sebelum ini, dan ia digunakan secara berbeza di sini.
Kami sebelum ini menyaksikan * char, sekarang saya melihat seorang bintang pada awal, dan tidak apa-apa.
Kerana ternyata kita boleh jenis membuat kesimpulan hanya
daripada yang pertama prinsip-prinsip apa yang sedang berlaku.
Jadi hanya perlu jelas, apa yang s?
Minggu lalu, ia adalah rentetan.
Itu tidak memadai lagi.
Apa yang s, khususnya?
>> PENONTON: [didengar]
>> DAVID J. MALAN: Ia adalah penunjuk.
Ia adalah alamat yang Watak pertama kita ditaip.
OK, apa yang t?
>> PENONTON: [didengar]
>> DAVID J. MALAN: The alamat bait pertama
dalam t, yang sebahagian memori diagihkan semula.
Jadi, ternyata bahawa apabila kita melelar dari 0 pada sehingga tali
length-- pertama sekali, i bermula pada 0, kerana
sekolah ini lama untuk perkara gelung.
Jadi hanya untuk kesederhanaan, mari kita menganggap bahawa baris pertama kod
adalah benar-benar hanya ini, betul.
Jika saya adalah sifar, menambah sifar kepada sesuatu yang mungkin
tidak akan mempunyai kesan.
>> Jadi apakah perkataan itu?
Ia ternyata bahawa bintang pengendali dalam konteks ini
adalah dereference yang pengendali, yang hanya
cara yang mewah untuk mengatakan pergi ke alamat berikut.
Jadi, jika s adalah alamat pertama watak dalam ini sebahagian memori,
* s cara pergi ke sana.
Dan kerana kita telah disediakan gambar dengan cara ini,
anda boleh menerima pakai mengikut model mental.
Jika ini adalah s, dan kamu berkata * s, * s jenis seperti pelongsor dan tangga,
jika anda masih ingat permainan dari zaman kanak-kanak, adalah seperti ikut arah anak panah itu dan pergi
ke alamat.
>> * t adalah perkara yang sama.
Jadi bermula di sini, pergi ke sebahagian itu.
Saya tidak boleh hanya menarik pada skrin ini dengan cara itu.
* t bermakna untuk pergi di sini.
Dan kemudian, untuk gelung hanya berkata menggerakkan watak ini di sini,
menggerakkan watak ini di sini, menggerakkan watak ini di sini.
Tetapi bagaimana saya lakukan incrementation itu?
Saya perlu untuk membatalkan apa yang saya hanya dipadamkan.
Ini adalah apa yang biasanya dipanggil aritmetik penunjuk, yang
bermakna matematik dengan alamat.
>> Jika, dalam hal ini untuk gelung, Saya sentiasa menokok i,
dan s adalah alamat dan t adalah alamat, jika saya terus menambah 1,
yang hanya bermakna terus bergerak ke hadapan, dan ke hadapan, dan ke hadapan dalam memori.
Ia seperti Oxford Street, jalan bahawa bangunan CS dihidupkan.
Bangunan-bangunan CS adalah pada 33 Oxford Street.
Jadi, jika anda melakukannya 33 Oxford Street campur 1,
yang membawa anda ke 34 Oxford Jalan, kemudian 35 Oxford Street,
kemudian 36 Oxford Street, apa sahaja yang mereka bangunan sebenarnya adalah - jika wujud.
Dan sebagainya, itu sahaja yang kita lakukan di sini dengan penunjuk aritmetik.
>> Jadi ia adalah cara yang super batin untuk menyatakan diri kita sendiri.
Tetapi semua itu yang berlaku di bawah hood
hanya mengikut alamat-alamat ini, seperti berikut peta, jika anda akan,
atau anak panah seperti berikut kami telah dilukis pada skrin.
OK, banyak untuk dihadam.
Sebarang persoalan sintaksis, konsep, petunjuk, malloc, atau sebagainya.
Ya, di sini pertama.
>> PENONTON: Jadi di mana yang kata * t sama toupper * t,
adalah bahawa akan mengambil kesempatan semua huruf atau just--
>> DAVID J. MALAN: Ah, soalan yang benar-benar baik.
Jadi dalam talian ini di sini, 31, ini berlaku untuk mengambil kesempatan
huruf pertama atau huruf.
Jadi mari kita menjawab bahawa dengan pergi kembali kepada prinsip-prinsip pertama.
Dan prinsip-prinsip pertama di sini saya maksudkan hanya pergi ke definisi asas
daripada apa yang terlibat.
Jadi toupper yang fungsi yang memanfaatkan char.
Itu sahaja.
* t bermakna pergi ke first-- pergi ke alamat dalam t.
Jadi, dalam gambar, jika ini adalah sebahagian yang memori kita diperuntukkan malloc,
dan ini adalah t, * t bermakna pergi sini.
>> Sementara itu, anda lulus bahawa nilai, huruf kecil m
untuk toupper, anda mendapat kembali modal M, di mana anda meletakkan ia?
Anda meletakkan ia di lokasi yang sama.
Dan dengan yang logik dari orang-orang definisi asas ia hanya
mengambil kesempatan huruf pertama melainkan anda melelar dengan i atau
untuk gelung atau gelung sementara, ia tidak akan berbuat apa-apa lebih daripada yang anda tanyakan itu.
Soalan yang baik.
Ya?
>> PENONTON: Mengapa anda menggunakan dereference kaedah bukan
array?
>> DAVID J. MALAN: Ah, soalan yang baik.
Mengapa anda akan menggunakan dereference yang kaedah dan bukannya kaedah array?
Ada sebab tertentu, untuk bersikap jujur.
Dan, sebenarnya, untuk ini jenis contoh, ke kanan,
Saya hanya dengan alasan membuat program yang lebih rumit,
lebih mata yang kaca ke atas, orang check-out,
kerana ini kelihatan super yang sukar difahami, tetapi walaupun ia melakukan perkara yang sama.
Dan sebagainya, terus-terang, ini adalah satu penyelesaian tidak perlu visual kompleks
kepada masalah ini.
>> Ia masih reka bentuk yang baik, lima daripada lima untuk reka bentuk,
sama ada dalam kurungan notasi notasi atau penunjuk.
But-- terutama apabila kita kemudian dalam perjalanan dalam pset 5
apabila kita melaksanakan kamus yang yang Saya sebutkan beberapa times--
kita benar-benar akan mengambil berat tentang alamat ingatan peringkat rendah
yang kita benar-benar memahami apa yang berlaku.
>> Tetapi, buat masa ini, ternyata bahawa ini baris kod kurungan sini persegi
tidak benar-benar wujud.
Mereka adalah apa yang dipanggil gula sintaksis, yang
adalah hanya cara yang weirdly sejuk mengatakan pengkompil menukarkan tanda kurung siku menjadi
bahawa ungkapan matematik.
Jadi ia adalah satu konvensyen manusia dapat hanya menulis
kurungan sangat user-friendly.
Tetapi apa pengkompil, dilafaz, adalah benar-benar melakukan bila-bila masa
anda menulis apa yang ditonjolkan dalam talian 24, di bawah hood ia benar-benar
ditukarkan kepada ini.
Ia hanya lebih menyeronokkan sebagai manusia membaca dan menulis kod seperti garis 24.
Tetapi akhirnya mereka roda latihan terlalu terkeluar
apabila keselesaan sendiri mendapat lebih kukuh.
>> Baiklah, jadi ingat kemudian bahawa ini adalah jenis masalah yang paling besar
kami berlari ke dalam.
Dan itulah yang mencetuskan keseluruhan ini perbualan sialan tentang petunjuk,
dan alamat, dan perkara-perkara menyalin.
Ia adalah kerana kita tersandung bodoh, isu bodoh ini, di mana
Saya telah melaksanakan logically-- dengan Lauren di sini pada demo dan jus oren
dalam milk-- yang sempurna fungsi algorithmically betul
untuk bertukar-tukar dua pembolehubah ' nilai, tetapi perkara terkutuk
tidak mempunyai sebarang berterusan, atau kekal, kesan ke atas kod saya.
>> Dan mengapa itu?
Secara ringkas, mengapa ini pelaksanaan pertukaran
secara logik betul, tetapi tidak memberi kesan pada pembolehubah yang akan dihantar kepadanya,
seperti x dan y untuk utama?
Apakah intipati isu ini?
Ya?
PENONTON: Oleh kerana pembolehubah dibuat salinan berubah-ubah dalam pas
melalui fungsi.
>> DAVID J. MALAN: Tepat sekali, apabila anda meninggal pembolehubah ke dalam fungsi, atau hujah-hujah
ke dalam satu majlis, mereka diluluskan oleh salinan, yang
bermakna anda mendapat sama mencari corak bit untuk kedua-dua x dan y,
dipanggil di sini a dan b.
Dan anda boleh berbuat apa-apa anda mahu dengan salinan itu,
tetapi mereka akan tidak mempunyai kesan ke atas fungsi panggilan.
Dan, sebenarnya, kita menarik yang gambar pada skrin, ingat
Kali terakhir, di mana jika anda benar-benar berfikir tentang apa yang
berlaku di bawah yang hood-- jika ini adalah memori komputer anda,
dan turun di sini adalah sebahagian daripada memori yang digunakan untuk utama,
ini adalah sebahagian daripada memori yang digunakan untuk swap,
dan mempunyai jadi walaupun utama dua pembolehubah, x dan y,
swap mungkin mempunyai sama mencari nilai, kedua-dua yang 1 dan 2,
tetapi ia benar-benar ketulan berbeza ingatan.
>> Oleh itu, kita memerlukan penyelesaian kepada ini.
Dan terus-terang, ia akan kelihatan seolah-olah kita kini mempunyai penyelesaian kepada masalah ini, betul.
Jika kita kini mempunyai keupayaan untuk memanipulasi perkara melalui alamat
dan, jenis pelongsor dan tangga gaya, mengikuti anak panah ini
dan ke mana-mana kita mahu dalam ingatan, tidak boleh kita
menyelesaikan masalah ini dengan lulus dari utama untuk menukar
bukan nilai yang kita mahu swap, tetapi hanya mengikut gerak hati
apa yang kita boleh lulus untuk menukar bukan?
>> [Interposing SUARA]
>> DAVID J. MALAN: Mengapa tidak kita hanya lulus alamat, bukan?
Kenapa kita tidak memberi swap peta harta, jika anda akan,
yang membawa kepada nilai sebenar x dan y.
Mari kita swap, benar-benar mengubah bit-bit asal, dan bukannya
hanya lulus salinan bit.
Dan sebagainya, sebenarnya, itu apa yang akan menjadi penyelesaian.
Versi ini di sini adalah jelas buruk dan cacat.
Oleh sebab itu, pada pandangan pertama, ia hanya kelihatan seperti kita menambah sekumpulan bintang secara rawak
dan melintasi jari kita bahawa ia akan menyusun.
Tetapi, ia kini akan menyusun.
>> Tetapi mari kita lihat apa artinya.
Dan, malangnya, pengarang C akan memilih apa simbol lain
untuk membuat ini sedikit lebih jelas, tetapi pengendali bintang
mempunyai erti yang berbeza dalam dua konteks yang berbeza.
Dan kita telah melihat kedua-duanya, tetapi mari kita membezakan.
>> Jadi sehingga di atas sana, apabila saya telah berubah a dan b
daripada menjadi int dalam yang buruk versi untuk int bintang, a dan b,
sebelum ini, adalah integer.
Apakah a dan b kini dalam baik, versi hijau?
Mereka alamat.
Alamat apa, perlu jelas?
Alamat integer.
Jadi hakikat bahawa saya berkata cara int bintang
ini adalah alamat integer, secara khusus.
>> Jadi sekarang perhatikan dalam baris kod, sesuatu yang lain telah berubah juga.
tmp tetap sama, kerana ia hanya integer sementara,
ada sihir memori di sana.
Tetapi kini memerlukan bintang.
Dan, sebenarnya, setiap sebutan lain a dan b,
melihat bahawa semua yang berubah dari merah ke hijau
adalah bahawa saya awalan pembolehubah-pembolehubah dengan bintang.
Kerana saya tidak mahu menyalin a dan b.
Kerana jika saya hanya menyalin a dan b dan swap a dan b, apa yang saya benar-benar bertukar-tukar?
Hanya alamat, saya mahu untuk menukar apa yang di alamat tersebut.
Saya hendak pergi ke sana.
Dan supaya pengendali bintang dalam fungsi saya,
tidak di dalam senarai parameter, bermakna anda pergi ke alamat tersebut
dan benar-benar mengubah nilai-nilai.
>> Jadi apakah gambar kini kelihatan seperti sebaliknya.
Nah, jika bukan saya lulus dalam untuk dan b tidak 1 dan 2--
Saya benar-benar perlu menambah satu definisi lain di sini.
Jadi katakan bahawa ini sebahagian ingatan adalah di lokasi 10.
>> Ini adalah di lokasi 11, tetapi ini adalah sedikit kaedah mudah,
Saya kini mempunyai dua pilihan saya lulus x dan y atau saya lulus alamat mereka?
Jika saya lulus alamat mereka seperti ini, saya hanya
kini perlu melaksanakan swap bagi setiap kod hijau
supaya apabila ia melihat dan apabila ia Jangka b, ia tidak hanya menyalin dan b
dan menggerakkan susu dan jus oren.
Susu dan jus oren metafora sekarang rosak,
kerana mereka adalah cawan peta cecair dan tidak.
Kami bukannya perlu pergi untuk menangani 10 dan kami
perlu ke alamat 11, dan kemudian melaksanakan bahawa logik bertukar-tukar.
>> Jadi logik adalah yang sama, tetapi kita perlu cara yang sedikit berbeza
daripada mengakses pembolehubah-pembolehubah.
Dan sebagainya pada akhirnya, apa yang program perlu kelihatan seperti adalah ini.
Dalam swap.c literal disalin dan ditampal versi hijau.
Tetapi saya perlu membuat satu perubahan.
Ia tidak mencukupi hanya untuk menukar swap.
Apa jalan lain untuk kod saya perlu berubah?
Ya?
>> PENONTON: Di mana ia mengambil hujah-hujah.
>> DAVID J. MALAN: Di mana ia mengambil hujahnya.
Jadi, jika saya tatal ke atas untuk utama, saya tidak boleh hanya lulus dalam x dan y,
dan, saya berjanji, yang terakhir sekeping sintaks baru hari ini.
Saya perlu lulus dalam tidak x dan y tetapi alamat x dan y.
Dan ternyata, simbol bahawa pengarang C memilih
adalah jika anda menggunakan Ampersand di sini, tidak dikelirukan dengan Ampersand bitwise,
jika anda menggunakan Ampersand yang di sini dan Ampersand sini,
ini angka untuk anda, apa yang alamat x,
mungkin ia adalah 10, apa alamat y, mungkin ia
11, dan pas mereka yang sebaliknya.
>> Jadi banyak untuk menyerap semua sekali gus.
Tetapi mari kita lihat sekarang dengan cepat dalam baki empat minit kami
di mana perkara yang boleh pergi jauh menyimpang.
Dan sebagai diketepikan, sebenarnya Saya mengambil gambar ini,
TF mengambil gambar ini satu atau dua tahun lalu.
Jadi ini adalah sudut belakang Dewan Makan Eliot.
Penunjuk adalah mungkin yang paling sukar topik yang kita buat di dalam CS50.
Jadi, jika anda bimbang jenis yang cerun adalah seperti mungkin ia
lebih daripada satu kayu hoki seperti ini, menyedari
kita jenis menghampiri puncak pada segi kerumitan konsep.
>> Dan saya membawa ini photo, kerana saya bersumpah
kepada tuhan, pada musim gugur tahun 1996, apabila saya mengambil CS50 dengan rakan-rakan firman-Ku,
Nishat Mehta, dia duduk saya ke bawah dalam sudut Eliot D. Dewan semasa makan tengah hari,
atau makan malam, atau sesuatu untuk mencuba untuk membantu saya memahami petunjuk.
Dan ini adalah di mana saya minggu selepas ia diperkenalkan pada kuliah apabila
Saya akhirnya memahami petunjuk.
Dan saya berharap bahawa ini akan klik jauh lebih cepat untuk anda.
Tetapi sedar ini benar-benar di kalangan topik yang lebih canggih
kita telah melihat.
Tetapi ia adalah antara yang paling kuat.
Dan apabila anda mendapatkannya, ia benar-benar semua hanya akan akhirnya datang bersama-sama.
Jadi yakinlah ia tidak perlu semua tenggelam di hari ini.
>> Jadi di sini adalah program terakhir kita akan melihat.
Dan kita akan berakhir dengan cepat tiga minit claymation
yang dibuat oleh rakan kami, Nick Parlante.
Berikut adalah program, yang pada kedua-dua bahagian garis mengisytiharkan pembolehubah x dan y.
Kedua-duanya alamat integer, petunjuk AKA.
Kami kemudian memperuntukkan cukup memori untuk menyimpan int
dan menyimpan alamat daripada memori dalam x.
Jadi, ia adalah lebih mudah daripada contoh sebelumnya.
Berikan saya empat bait ingatan, itulah saiz int,
dan meletakkan alamat yang dalam x.
Keturunan ini di sini bermaksud pergi ke alamat dalam x
dan meletakkan makna kehidupan, nombor 42 di sana.
Tetapi baris ini membimbangkan saya.
Bintang y bermakna pergi ke alamat dalam y, dan meletakkan nombor malang 13 di sana.
Mengapa ia merbahaya, pada ketika ini dalam story-- walaupun cepat kepada
dalam beberapa minit menyusut kami sini-- mengapa ia tidak baik
bagi saya untuk mengatakan, pergi ke alamat dalam y?
>> PENONTON: Anda tidak mempunyai [didengar].
DAVID J. MALAN: Saya tidak mempunyai meletakkan apa-apa dalam y.
Jadi apakah nilai y, pada ketika ini dalam cerita?
Kami tidak tahu.
Ia adalah beberapa nilai sampah dan juga tidak Binky tahu.
Jika kita boleh berakhir pada nota ini.
>> [VIDEO MAIN SEMULA]
>> Hey, Binky, bangun.
Ia adalah masa untuk penunjuk menyeronokkan.
>> -Apa itu?
Ketahui mengenai petunjuk?
Oh, goody.
>> -Baik, Untuk bermula, saya rasa kita akan memerlukan beberapa petunjuk.
>> -OKAY.
Kod ini memperuntukkan dua petunjuk yang boleh menunjukkan kepada integer.
>> -OK, Baik saya melihat dua petunjuk, tetapi mereka
seolah-olah tidak menjadi menunjuk kepada apa-apa.
>> -Itu Betul.
Pada mulanya petunjuk tidak menunjukkan apa-apa.
Apa yang mereka menunjukkan adalah dipanggil pointees dan menetapkan mereka
adalah langkah yang berasingan.
>> -Oh, Betul, betul.
Saya sudah tahu.
The pointees adalah berasingan.
Jadi bagaimana anda memperuntukkan pointee satu?
>> -OK, Dan ini kod Peruntuk yang pointee integer baru,
dan ini set bahagian x untuk menunjukkan kepadanya.
>> Hey, yang kelihatan lebih baik.
Oleh itu, ia melakukan sesuatu.
>> -OK, Saya akan dereference x penunjuk kepada menyimpan nombor 42 ke dalam pointee itu.
Untuk silap mata ini, saya perlu saya tongkat sihir dereferencing.
>> Tongkat sakti Your daripada dereferencing?
Eh, itu, itu hebat.
>> -Ini Adalah apa kod kelihatan seperti.
Saya hanya akan menetapkan jumlah dan-
>> [POP BUNYI]
>> Hey, lihat di sana ia pergi.
Jadi, melakukan dereference pada x berikut anak panah untuk mengakses pointee itu.
Dalam kes ini, untuk menyimpan 42 di sana.
Hey, cuba menggunakannya untuk menyimpan nombor 13 melalui penunjuk lain, y.
>> -OKAY.
Saya hanya akan pergi ke sini untuk y, dan mendapatkan nombor 13 set up.
Dan kemudian mengambil tongkat dereferencing dan just--
>> [Buzzer BUNYI]
>> -Oh, Hey yang tidak berjaya.
Katakanlah, uh, Binky, saya tidak berfikir dereferencing
y adalah idea yang baik, kerana menetapkan sehingga pointee adalah langkah yang berasingan.
Dan saya tidak fikir kita pernah melakukannya.
>> -Hmm, Titik yang baik.
>> -Yeah, Kita memperuntukkan penunjuk, y, tetapi kami tidak menetapkan ia untuk menunjukkan pointee a.
>> -Hmm, Sangat taat.
Hey, yang anda cari baik di sana, Binky.
Bolehkah anda menetapkan ia supaya y mata untuk pointee yang sama seperti x.
>> -Sure, Saya menggunakan tongkat sihir saya tugasan penunjuk.
>> -Adakah Yang akan menjadi masalah, seperti sebelum ini?
>> -Tiada, Ini tidak menyentuh pointees.
Ia hanya mengubah satu penunjuk untuk menunjukkan yang sama thing--
>> [Pop BUNYI]
--as lain.
>> -Oh begitu.
Sekarang y mata kepada tempat yang sama seperti x.
Jadi, tunggu, kini y adalah tetap.
Ia mempunyai pointee a.
Jadi, anda boleh cuba tongkat dereferencing lagi untuk menghantar 13 ke atas.
>> -Oh, OK, di sini pergi.
>> Hey, tengok tu.
Sekarang dereferencing kerja-kerja y.
Dan kerana petunjuk berkongsi bahawa salah pointee, mereka berdua melihat 13.
>> -Yeah, Perkongsian, uh, apa sahaja.
Jadi, kita akan bertukar tempat sekarang?
>> -Oh, Melihat, kita berada di luar masa.
>> -But--
>> -Hanya Ingat tiga peraturan penunjuk.
Number 1, struktur asas adalah bahawa anda mempunyai penunjuk,
dan ia menjurus kepada pointee a.
Tetapi penunjuk dan pointee adalah berasingan.
Dan kesilapan yang sama adalah untuk menubuhkan penunjuk
tetapi lupa untuk memberikan pointee a.
>> Nombor 2, penunjuk penyahrujukan bermula pada penunjuk
dan mengikuti anak panah ke atas untuk mengakses pointee itu.
Seperti yang kita semua tahu, ini hanya berfungsi jika ada adalah pointee, yang jenis mendapat kembali
untuk memerintah nombor 1.
>> Nombor 3, penunjuk tugasan mengambil masa satu penunjuk
dan perubahan itu untuk menunjuk kepada pointee sama dengan penunjuk lain.
Jadi selepas tugasan, kedua-dua petunjuk
akan menunjukkan kepada pointee yang sama, kadang-kadang yang dipanggil perkongsian.
Dan itu semua yang ada padanya, benar-benar.
Selamat tinggal sekarang.
>> [AKHIR MAIN SEMULA]
>> DAVID J. MALAN: Itu sahaja untuk CS50.
Terima kasih kepada Profesor Nick Parlante.
Kita akan melihat lagi minggu depan.
>> [Bermain muzik ELECTRONIC]