[TEMA MUZIK] 

SPEAKER 1: Hi, semua orang. Selamat kembali ke bahagian. Lovely hari out-- itulah sebabnya, saya pasti, terdapat hanya empat daripada anda di sini dan tidak pek biasa kami. Saya sakit hujung minggu ini. Jadi, saya tidak mempunyai Starburst untuk kalian. Dan saya boleh mula batuk betul-betul di seluruh ini. Jadi, beruang dengan saya. Saya akan benar-benar cuba dan melalui ini pertama, walaupun, sebelum saya mempunyai serangan batuk. Tetapi mudah pada saya sedikit bit-- itulah yang saya minta. 

Jadi agenda kami untuk today-- hanya reminder-- kuiz anda adalah minggu depan. Saya katakan minggu lepas ini sehingga tidak akan menangkap anda tidak bersedia. Jadi, saya mengingatkan anda lagi. Minggu depan kuiz anda. Untuk itu, minggu depan seksyen akan lebih daripada- saya akan cuba dan bekerja di beberapa kajian. Jadi, jika anda semua boleh membantu saya dengan menghantar saya perkara-perkara yang anda selesa dengan, bahawa anda bimbang tentang, topik-topik yang anda ingin untuk saya untuk menutup, yang akan menjadi besar. Jadi saya boleh berusaha dan bekerja mereka ke dalam seksyen kami minggu depan atau menghantar bahan tambahan atau persediaan bahawa anda tidak mungkin akan mendapat tempat lain. 

Yeah! Lebih ramai orang datang! Saya fikir, saya melakukan itu buruk lalu minggu, bahawa tidak ada yang mahu kembali? Aku takut. Sehingga tiga perkara bahawa kita akan pergi ke adalah pengalihan, fail I / O, dan maka petunjuk dan ingatan dinamik. Saya pasti anda semua super teruja pointers-- topik kegemaran semua orang, begitu mudah untuk difahami. Saya pasti kalian semua mendapat itu, kan? 

Jadi perkara pertama yang pertama, redirection-- ini adalah pada dasarnya hanya cara yang untuk mengawal bagaimana anda input perkara-perkara ke dalam program anda, bagaimana kamu perkara-perkara output daripada program anda. Cara utama yang kalian telah berinteraksi dengannya hanya di seluruh standard dengan skrin cetak anda di sini. Tetapi ada cara untuk pipe-- seperti yang kita lihat di sini adalah salah satu jenis words-- kami paip bahawa maklumat atau data ke dalam fail dari fail. Ini hanya berbeda cara mendapatkan sesuatu ke dalam program anda dan keluar dari program anda, bukan hanya mencetak mereka ke layar ini atau memasukkan perkara daripada baris arahan. 

Jadi yang pertama adalah sedikit lebih besar daripada tanda sisipan. Jadi output-- ia hanya mencetak output ke file bukan skrin anda. Jadi jika anda mempunyai sesuatu yang dicetak "Hello, world!" dengan skrin, jika anda meletakkan ia bukan untuk output.text, yang mencipta fail ini dipanggil output.text. Dan apabila anda membukanya, itu akan berkata "Hello, world!" di sana. Ini akan menjadi sangat berguna jika anda mempunyai satu tan kesalahan sebenarnya, seperti yang kita lihat dalam satu ini. Jika anda melakukan dua tanda sisipan, itu akan mencetak mesej ralat. 

Jadi, jika anda mempunyai masalah dengan kompilasi, ia mempunyai banyak kesalahan dan anda macet di cuba untuk menatal di baris perintah melalui semua mereka, anda boleh hanya mencetak mereka untuk fail, membuka fail itu sehingga Anda boleh menatal melalui mereka lebih mudah. Saya benar-benar digunakan bahawa banyak apabila saya debug 181 pşet saya untuk pembelajaran mesin. Jadi ia akan menjadi sangat berguna di kemudian hari. Ia juga berguna jika anda mempunyai program bahawa mungkin menghasilkan perpustakaan atau menghasilkan beberapa set string, dan anda harus dapat melihat bahawa ia menghasilkan mereka dengan betul. Ini adalah cara untuk melakukan itu. 

Jadi jika anda mencetak mereka untuk fail, anda lebih mudah dapat memeriksa mereka, kan? Versus cuba untuk menatal melalui baris arahan anda. Dan kemudian satu hal yang perlu diperhatikan adalah bahawa hanya dengan lebih besar daripada tanda sisipan, jika anda menulis untuk fail yang sudah exists-- jadi seperti jika kita berlari ini pertama masa, kami meletakkannya untuk output.text, dan kemudian kita mempunyai program kedua yang dicetak ini sebagai program dua dan melakukan yang lebih besar daripada kepada output.text, ia akan menimpa bahawa- jadi menulis ganti apa yang pernah di fail yang bermula dengan. 

Jadi, jika anda mahu menambah ke fail, seperti yang kita lihat di sini, Anda hanya melakukan dua lebih besar daripada tanda-tanda. Dan ia akan menambahkan kepadanya. Ia tidak akan menimpanya. Jadi, jika anda perlu untuk menjalankan beberapa program dan jenis tetap menjejaki apa yang semua dari mereka adalah kembali kepada anda dalam fail, itu adalah satu cara untuk melakukannya. Jika anda tidak peduli apa yang ada di fail anda dan ia dibenarkan untuk ditulis ganti, Anda hanya boleh menggunakan lebih daripada satu. Adakah ini masuk akal untuk semua orang? 

PENONTON: Seperti dot mengurangkan hello lebih besar daripada teks output titik, seperti dua kali, ia hanya akan hanya menunjukkan pada output teks titik time-- kedua 

SPEAKER 1: Benar. Jadi ia akan pada dasarnya hanya benar-benar menulis ganti apa yang ada di sana untuk memulakan. Jika fail ini di sini, output.text sudah ada, pada dasarnya apa sahaja yang anda panggil itu lagi dengan yang lebih besar tunggal daripada apa yang anda hanya dapat menganggap itu sebagai seperti gantikan fail. Seperti apabila anda menyimpan Word dokumen dan anda save as, dan anda menyimpan nama yang sama, dan ia benar-benar akan menimpa itu-- ini adalah beberapa perkara yang sama itu. Sesiapa yang mempunyai sebarang soalan mengenai hanya keluarkan kepada gambar? Awesome. 

Jadi jelas, jika anda membalikkan arrow arahan, ia boleh melakukan input. Oleh itu, apabila kalian punya seperti Caesar atau Visioneer dan anda harus input sesuatu, Anda mempunyai barisan hujah perintah yang benar-benar input itu. Ini adalah satu lagi cara untuk melakukan itu. Jadi, daripada menunggu untuk command prompt, seperti apabila anda meminta anda mesej dalam Caesar atau Visioneer, jika anda mempunyai fail teks yang mempunyai mesej anda, Anda hanya boleh taip ke dalam. 

Jadi, jika ini adalah seperti dot mengurangkan Caesar 3 kurang daripada teks input panah, yang adalah mesej anda, yang akan berjalan dengan baik. Ketika program Caesar anda sebenarnya meminta input daripada pengguna, itu sudah akan memilikinya kerana Anda telah ditaip dalam fail ini. Itu hanya cara yang lain. Hanya belakang output-- hanya input untuk data anda. 

Dan kemudian yang terakhir adalah paip. Begitu sejuk cantik ini seseorang. Kerana ia membolehkan anda untuk mengambil output dari satu program dan meletakkannya sebagai input kepada program lain. Saya tidak tahu jika ada di antara kalian bermain dengan menguraikan yang CS50 yang mungkin mempunyai diberikan anda, tetapi ia akan membolehkan anda untuk mengambil sampel beberapa fail, ketik ke penyulitan anda, dan kemudian dari sana menaip itu ke dalam penyahsulitan anda memastikan ternyata yang sama. Jadi ia adalah jenis seperti tiga arah gelung. Pergi untuk itu. 

PENONTON: Jika program mempunyai beberapa input, adakah cara untuk menceritakannya yang input menggunakan fail teks atau keluaran bagi? 

SPEAKER 1: Ia mempunyai beberapa masukan. Apa pun memfailkan input-- anda ketika itu meminta input yang kali pertama, ia akan menganggap, saya rasa, itu akan paip di seluruh fail. Jadi jika anda mempunyai beberapa input, anda akan bungkusan dalam beberapa file. Jadi, jika anda meminta untuk mesej tiga kali dalam kod anda, Anda akan meletakkan dalam tiga fail yang berbeza. Dan ia menjadi gila. Dan anda tidak perlu bimbang tentang itu sekarang. Tapi itu idea. 

Jadi ya, paip adalah output hanya satu program menggunakan input ke yang lain. Semua orang yang baik di sana? Sejuk. OK. Anda mungkin tidak akan mempunyai melakukan terlalu banyak dengan itu. Tetapi anda perlu memahami cara-cara yang anda boleh menggunakan ini. Dan ada beberapa kes-kes yang Anda mungkin ingin menggunakannya. 

Jadi memfailkan I / O-- Saya tahu apa yang anda saying-- kita terbiasa membaca dari dan menulis ke skrin kami di sana, yang merupakan standard dalam dan standard keluar. Dan itulah apa yang kalian telah lakukan sejak awal kelas di sini. Tetapi anda juga boleh membaca dan menulis fail, yang semua fail I / O-- jadi file input, keluaran ialah semua itu singkatan. Jadi ini pada dasarnya bermakna bahawa Anda boleh menyimpan data anda sekarang. 

Apabila anda hanya mencetak ke skrin, itu pada dasarnya pergi, kan? Sebaik sahaja anda membuat "Hello dunia "dan lari" Hello world " ia mencetak "Hello world" ke layar. Tetapi anda tidak boleh benar-benar apa-apa dengan itu dari sana. Jika anda menyimpan dalam teks fail, kemudian tiba-tiba anda mempunyai data ini yang anda dibenarkan untuk memanipulasi atau memasukkannya ke dalam fail, atau memasukkannya ke dalam program yang akan datang. Salah satu sebab mengapa kita lakukan ini adalah hanya sebagai satu cara untuk menyimpan data untuk kegunaan kemudian. 

Saya mempunyai beberapa langkah di sini hanya berjalan melalui standard I / O. Pada langkah pertama, anda perlu membuat rujukan untuk fail dengan semua topi FILE fail bintang. Jadi yang menciptakan pointer ke fail. Jadi maka anda mahu untuk membukanya. Dan anda berkata, secara harfiah, hanya berkas sama fopen. Dan ini akan mengembalikan pointer ke fail yang anda baru sahaja dibuka. Saya melihat beberapa anda orang-orang di waktu pejabat. 

Tetapi salah satu perkara yang adalah petunjuk remember-- dapat beberapa alamat atau batal, bukan? Jika kita pernah mempunyai kes di mana sesuatu yang dapat kembali batal, apa yang kita perlu lakukan sebelum kita menggunakannya? Kita perlu untuk memeriksa jika itu batal atau tidak, bukan? Oleh kerana ada di antara kamu mungkin mempunyai isu di mana apa sahaja objek telah dipulangkan dalam pelarian adalah tidak sah. Anda telah cuba untuk melakukan beberapa fungsi di atasnya. Dan tapak komputer anda menyalahkan. Betul? Saya yakin beberapa anda mungkin mempunyai masalah itu. 

Jadi dengan fopen, fopen akan baik kembali pointer ke fail, atau jika ada masalah, ia akan kembali null. Jadi, anda sentiasa perlu menyemak bahawa ia telah tidak dikembalikan batal sebelum anda cuba untuk berbuat apa-apa lagi. Ini seperti paradigma standard bahawa anda akan perlu di sini. Jika ada yang pernah peluang yang sesuatu yang dapat kembali batal, periksa untuk memastikan ia tidak sebelum anda meneruskan. Jika tidak, anda akan untuk mendapatkan kesalahan tapak indah. Dan tiada siapa yang suka untuk berurusan dengan orang-orang. 

Jadi seperti yang kita lihat di sini, argumen pertama hanya laluan untuk fail. Jika fail yang tidak wujud, ia akan membuat fail itu. Dan ia hanya akan menjadi kosong. Dan kemudian hujah kedua adalah mod yang anda mahu. Adakah kita mahu membaca dari fail ini? Adakah anda ingin menulis dari itu? Adakah anda ingin tambah? Jadi sebenarnya apa yang saya hanya said-- jika fail yang tidak wujud dan anda cuba untuk membaca dari itu, ia akan membuang ralat. Jika fail name-- suka jika file.text tidak wujud lagi dan anda mahu menulis kepadanya, ia akan mewujudkan fail kosong dipanggil file.text untuk anda. Dan jika anda mahu untuk menambah, yang perlu anda lakukan perkara yang sama. Adakah ini masuk akal? Jika anda cuba untuk membaca dari fail yang tidak wujud lagi, ia akan membuang ralat. Jika tidak, ia akan mewujudkan fail untuk anda melakukan apa yang anda mahu ia. Sejuk. Sekarang kita dapat membaca dari fail. Dan ini hanya seperti hendak pergi melalui fungsi yang berbeza bahawa kita mempunyai untuk fail I / O. Kemahuan ini diperlukan dalam Serangga minggu ini, kalau tak salah ingatan. Ya, ia benar-benar akan diperlukan dalam Serangga minggu ini. Jadi fgetc mengembalikan aksara seterusnya. fgets hanya mengembalikan baris teks. Ini akan mengembalikan apa-apa sehingga baris baru, dan ia akan pecah. Jadi fread membaca tertentu jumlah byte dan tempat-tempat mereka ke dalam array, yang adalah sesuatu yang mungkin mahu lakukan dengan semula Size-- mungkin berguna. 

Berapa ramai orang telah membaca spec Serangga yang, dengan cara itu? OK. [Terdengar] 

SPEAKER 1: OK. Baik. Jelas membaca bahawa- itu adalah Serangga menyeronokkan. Anda dapat memulihkan memori yang dihapuskan card-- benar-benar mengujakan apabila ia berfungsi. Tapi yang pasti, mula membaca itu. Datang bercakap dengan saya jika anda ada soalan tentang hal itu. 

OK, jadi seperti yang saya katakan, fread membaca sejumlah bait. Itulah beberapa jumlah yang sewenang-wenang bahawa anda akan ditetapkan. Dan kemudian fseek hanya bergerak kepada kedudukan yang tertentu. Jadi mungkin anda tidak peduli lebih kurang 10 bait berikutnya. Anda hanya mahu langkau ke depan. Anda tidak mengambil berat tentang mereka. Anda ingin membaca bermula di bait 11. fseek membolehkan anda untuk melakukan itu. Oleh itu, ia membolehkan anda untuk menjadi selektif tentang apa yang anda baca. Kerana fgetc, fgets dan fread membaca dari tempat yang tertentu dalam fail. 

Satu cara untuk berfikir tentang hal ini adalah jika ini adalah fail kami, apabila anda pertama membukanya, anda mempunyai kedudukan ini dalam fail yang bermula pada awal. Setiap kali anda membuat panggilan fgetc, fgetf, atau fread, ia akan bermula dari ini penanda kedudukan. Katakan anda hanya ingin membaca chunk ini ingatan di sini. Anda tidak boleh hanya memanggil. Anda perlu mencari di sini dan kemudian membaca dari sana atau membaca, mendapat, atau getc, bergantung kepada apa yang anda mahu. Jadi mencari hanya membolehkan anda melangkau bahagian-bahagian ingatan. Dan itulah satu-satunya cara yang anda boleh melangkau perkara tanpa membacanya ke dalam buffer anda. Adakah ini masuk akal untuk semua orang? 

Jelas sekali, terdapat satu banyak di sini-selari pengalihan output, atau masukan kami, anda telah membaca dan menulis. Jadi fputc hanya menulis watak dalam fail. fputs menulis garis. Fprintf mencetak output yang diformat. Jadi jika anda mempunyai tab, atau ruang, atau yang lainnya. Dan kemudian fwrite menulis beberapa array byte ke fail. Jadi, ini adalah cara yang sama fwrite dan fread analog fgets opposites--, fputs, dan kemudian fputc dan fgetc-- banyak gila, hal yang cepat. 

Hanya jenis menjaga handy-- ini Anda akan mempunyai masa yang berlainan mana mungkin anda hanya mahu satu aksara pada satu masa. Mungkin anda mahu seluruh baris. Dengan pset-- kamus anda yang ditulis dalam dua pşet, Saya percaya, kami memberikan keseluruhan kamus dalam format teks yang mempunyai setiap perkataan dipisahkan oleh garis. Jadi, jika anda ingin membaca dalam satu perkataan pada satu masa, apa yang anda mungkin gunakan jika anda sedang membaca dan mereka semua dipisahkan pada talian baru, dan anda hanya mahu satu perkataan pada satu masa? 

PENONTON: fgets 

SPEAKER 1: Benar. Fgets-- kerana yang mengembalikan apa yang ada pada satu baris. Dan jika setiap kata-nya baris sendiri, kita boleh menggunakan fgets. Sejuk. Adakah ini masuk akal, semua orang? Cool? Ya, kita akan dapat bahagian yang menyeronokkan dengan pointer tidak lama lagi, di mana anda mendapatkan untuk melakukan matematik. Dan ia akan menjadi besar. 

Lepas step-- menutup fail anda. Dengan begitu banyak perkara di sini, salah satu paradigma kami adalah jika ia dapat kembali batal, memeriksa null. Jika anda membuka sesuatu, Anda akan lebih baik menutupnya. OK, jadi anda tidak dilakukan sehingga anda dilakukan kecuali jika anda telah menutupnya. Jenis seperti ia tidak lebih sehingga wanita lemak menyanyi. Itu seperti menutup fail anda. Seperti yang dikatakan di sini, hanya untuk mengulangi, selalu membuka fail anda sebelum anda membaca atau menulis kepadanya. Dan selalu menutupnya jika anda sudah membukanya. -Baik saja? Sejuk. 

Jadi, inilah satu contoh. Jadi tiny-- Saya tidak tahu jika anda orang-orang dapat melihat bahawa dengan baik. Kalau saja kita boleh meningkatkan kecerahan entah bagaimana. Biar saya benar-benar melakukan ini jika saya boleh. OK, kalian tidak boleh benar-benar melihat bahawa sama sekali, boleh anda? OK, kita akan melakukan ini, maka. [Terdengar] 

Saya menganggap ini adalah jauh lebih baik untuk melihat. Sesiapa sahaja boleh melihat di mana saya tetikus pergi pertanyaannya? Ah, itu is-- apa perjuangan! 

OK. Pada dasarnya, anda semua perlu mempunyai jenis dari idea tentang apa ini lakukan. Ia tidak sempurna. Tapi aku lebih suka menjelaskannya daripada menghabiskan lebih banyak masa cuba untuk format itu benar. Pada dasarnya, seperti yang anda lihat di sini, kita mulai dengan membuka fail. Dan kami mempunyai beberapa fail pangkalan data yang kami membuka mengatakan itu pelajar-pelajar kita. Dan kami akan menulis kepadanya. Jadi, sudah tentu, kembali null. Oleh itu, kita perlu memeriksa null. Dan kemudian jika ia bukan batal, kita pergi melalui. Dan seperti yang anda lihat, kami tidak perulangan melalui sini. Ada pelajar. Pelajar adalah hash merujuk kepada tiga. Dan apa yang kami lakukan ialah kami mencetak ke fail, bukan? Jadi apa yang kita mencetak ke fail kita? 

PENONTON: Skor yang berada dalam array? 

SPEAKER 1: Ya. Skor yang berada dalam yang array-- tepat. Jadi kami membuka ini fail pangkalan data, yang Saya menganggap adalah semacam pangkalan data gred. Dan kami hanya mencetak yang markah setiap pelajar ke fail itu. Cool? Baik. Awesome. OK. Mari kita kembali kepada- 

PENONTON: Saya mempunyai soalan cepat. Apakah printf tidak untuk loop? Itu hanya dalam jika gelung? SPEAKER 1: Tidak, itu di dalam pengulangan. Saya tidak dapat melihat tikus saya dengan baik di sini. Jadi, saya berjuang untuk format yang betul. Pendakap ini harus pergi. Ia harus turun di sini. Ini adalah apa yang ada di anda untuk loop. Ada. Sekarang ia cukup. Jadi itulah bagaimana ia harus adalah-- kecuali untuk itu kurungan terakhir yang saya ditolak. OK. Adakah ini masuk akal untuk semua orang? OK. Kami akan bergerak untuk perkara yang akan datang then-- yang, sebenarnya, anda akan perlu melihat kod. Jadi, saya hanya akan salinan yang lebih sekarang. OK. Jadi, saya akan menunjukkan kepada anda semua kod ini. Dan saya mahu anda untuk mencuba dan angka tahu apa yang seharusnya dilakukan. 

Jadi diberikan bahawa- mengambil satu minit atau lebih. Cuba dan mencari tahu apa yang sedang berlaku di sini. 

Apa-apa idea? 

Kita tahu bahawa kita mempunyai sekurang-kurangnya dua hujah-hujah dalam baris arahan, kan? Saya menganggap salah satu yang akan menjadi bahawa [terdengar] dari program kami adalah dan kemudian sesuatu yang lain. Kerana jika [terdengar] kurang daripada dua orang, kita membentak mereka. Betul? Dan dari penggunaan, ia kelihatan seperti itu akan menjadi semacam fail. Kita semua setuju untuk itu? Jadi sekarang, apa yang gelung lakukan? Apa yang ia akan melalui? 

PENONTON: Semua fail. SPEAKER 1: Tepat sekali. Ia akan melalui semua fail yang kita sudah ada input. Jadi untuk setiap fail, itu membuka beberapa string di sana. Ia membuka fail itu. Betul? Dan ia membaca dari itu. Sudah tentu, menyemak apakah itu batal. Dan kemudian ia mencetak. Jika ia tidak sah, ia hanya mengatakan kepada kita bahawa itu bukan fail yang ada. Kerana ingat, dengan membaca fail kami harus ada. Betul? Dengan menulis dan menambahkan, Anda boleh pergi dengan itu. Tetapi dengan membaca, file kita harus ada. 

Kemudian kalau tidak ada, apa yang kita lakukan di sini? Mari kita mulai di sini. Apakah ini do-- karakter pertama ini. Apa yang ia buat? Dia mendapat satu watak, bukan? Jadi apa yang lakukan? Ini semakin karakter pertama. Ada yang tahu EOF? 

PENONTON: Akhir fail? 

SPEAKER 1: Akhir file-- tepat. Jadi ia akan melalui keseluruhan fail, kan? Dan kemudian ia akan mengemaskini dengan mendapatkan setiap karakter seterusnya. Betul? Dan apa yang ia lakukan? PENONTON: Itu hal yang dalam- 

SPEAKER 1: cetak putchar untuk screensaver anda. [Terdengar] karakter. Dan kemudian apabila ia [terdengar] ini akan menutup fail. 

PENONTON: Adakah anda tidak perlu [? yang lain? ?] 

SPEAKER 1: Belum tentu. Maksud saya, ia jenis tersirat dalam hal ini. Kerana ini kembali, walaupun, selama kerana ini tidak menangkap ini, anda baik-baik saja. Maksud saya, ia mungkin baik berlatih untuk melakukan yang lain an. Tetapi lain yang tidak selalu diperlukan terutama jika anda mempunyai sesuatu seperti kembali, yang bermakna bahawa dalam kes ini jika menangkap itu, program anda akan berakhir dan ia tidak akan mendapatkan ini. Ini lebih untuk kes di mana anda tidak semestinya kembali sesuatu. Kerana jika ini tidak kembali apa-apa, ia bermakna bahawa jika ini benar, sisa ini akan tetap berjalan. Dan dalam hal ini, anda mahu palsu. Jika ia kembali, dan akhir program anda, lain yang tidak perlu semua masa, bergantung pada konteks. Yakub, adakah anda mempunyai soalan? PENONTON: Ya. Begitu juga fgetc mendapatkan karakter seterusnya? Bagaimana watak meningkat? SPEAKER 1: Ya. Jadi fgetc mendapat aksara seterusnya. Anda boleh memikirkan ia seperti C ++ dalam arti. 

PENONTON: Jadi apa yang EOF? 

SPEAKER 1: EOF adalah akhir fail. Ia hanya satu penanda yang membolehkan anda tahu bahawa anda pada akhir fail anda. Jadi ini akan mencetak kepada standard anda keluar. Dan kemudian ia akan menutup fail apabila ia dilakukan. Kemudian mari kita pergi ke fail yang akan datang, bukan? Jadi secara keseluruhan, apakah program ini lakukan? 

[Terdengar] 

SPEAKER 1: Ya. Ia hanya akan mencetak segala sesuatu. Jadi jika anda semua pernah menggunakan CAT dan kemudian nama beberapa file-- Saya tidak tahu sesiapa di antara kamu mempunyai pernah melakukan itu pada terminal anda. Tetapi jika anda pernah menggunakan perintah CAT-- C-A-T-- dan kemudian apa sahaja fail anda mempunyai besar-- itu mencetak ia keluar ke terminal anda, yang akan menjadi sangat berguna untuk beberapa hal. Saya menggunakannya banyak. Adakah ini masuk akal untuk semua orang? Cool? 

OK jadi tugas anda sekarang-- sama ada dengan sendiri atau dengan orang di sekeliling you-- adalah dengan hanya menulis sebuah program sederhana yang hanya akan menulis "Hello, world!" kepada fail. 

[Terdengar] 

[Terdengar] 

SPEAKER 1: Saya adalah seperti, melakukan Saya berbuat demikian minggu lepas buruk? Saya tidak fikir itu yang buruk. Saya gembira anda semua berada di sini. Ia benar-benar membuat saya bahagia. Saya seorang gadis dari kesenangan sederhana. Saya sama seperti ketika saya menghadiri seksyen. Jadi, saya hanya mendapat ini bermula untuk anda semua supaya kita dapat kode bersama-sama. Saya tidak suka meletakkan sesiapa sahaja di tempat itu melainkan jika anda mahu. 

PENONTON: Untuk kuiz, lakukan kita harus menulis sebuah program? 

SPEAKER 1: Anda mungkin akan diminta untuk menulis program yang mudah dengan tangan. Yup. 

PENONTON: Kuiz ini adalah minggu depan, kan? 

SPEAKER 1: Kuiz ini adalah Rabu depan. Ini bermakna ada yang indah [? CSE?] dengan kadar pihak setelah itu, yang ertinya anda akan mendapatkan skor belakang yang malam-jam berapa? Siapa yang tahu? Tetapi ia akan menjadi malam itu. 

Baik. Bagaimana kita ingin memulakan ini? Saya akan memberi anda bermula hint-- dengan ini. 

PENONTON: Anda perlu membuka fail. 

SPEAKER 1: Ya. Jadi, apa yang anda mahu panggil ini? Adakah anda hanya mahu menyebutnya "fail"? Mari kita membuat ia mudah. Jadi fopen-- apa yang kami ujian output akan menjadi? Sebut saja "Hello." Dan apa yang mod kita? Apa yang kita lakukan ke fail ini? 

PENONTON: Baca. Menulis. SPEAKER 1: Kami menulis untuk itu. Lovely. OK, jadi kami mempunyai fail ini sekarang. Apa yang kita perlu buat? PENONTON: Periksa sama ada itu batal. SPEAKER 1: Periksa jika ia null-- tepat. Itu yang saya suka dengar. Yang harus automatik, terutama cukup banyak dari titik ini. Jika anda mula segfault, anda mungkin tidak memeriksa null suatu tempat. Sembilan dari sepuluh, itu akan menjadi kesalahan anda. Jadi jika anda hanya boleh mendapatkan di kebiasaan, sentiasa memeriksa apakah itu batal, kehidupan anda akan menjadi bagus dan easy-- atau lebih mudah. 

Jadi untuk melihat sama ada ianya batal. Jadi, jika ia tidak batal, yang adalah apa yang bang sama ertinya- tidak null-- itu sah. Apa yang kita mahu lakukan? Kami hanya ingin mencetak ke fail itu, kan? Jadi apa yang akan kita gunakan? 

PENONTON: fprintf 

SPEAKER 1: Fprintf-- indah. Dan fprintf mengambil masa dua arguments-- mana ia akan dan apa yang kita mahu dicetak. Jadi apa yang pertama? Di mana ia akan pergi? 

PENONTON: fail. 

SPEAKER 1: Ia akan fail. Dan apa yang kita mahu cetak? "Hello, world!" Baik. Kami mempunyai satu thing-- lalu satu lagi paradigma besar di sini. PENONTON: Tutup. SPEAKER 1: Tutup. Terdapat anda pergi. 

PENONTON: Apakah ini terjadi jika fail itu adalah batal? SPEAKER 1: Tidak, ini adalah jika ia tidak batal. PENONTON: Oh, jika ia elok OK. Untuk fopen dan kemudian dua hujah yang masuk ke dalam, apakah hujah yang pertama bermakna lagi? 

SPEAKER 1: Hujah ini seperti nama fail yang anda mahu pergi ke. Jadi selepas ini berjalan, anda akan mempunyai beberapa fail yang dipanggil "hello" yang telah "Hello, world" di dalamnya. Itu sahaja. Hanya nama. 

PENONTON: Dan kerana itu menulis, yang fail tidak perlu pun wujud. Apakah itu yang anda berkata? 

SPEAKER 1: Benar. Tepat. Jika "Hello" sebagai fail tidak wujud lagi, ia akan mencipta fail yang dipanggil Hello "dan menulis untuk itu untuk anda. 

PENONTON: Apabila kamu beritahu program untuk menulis kepada fail, mengapa anda menulis "file" dan bukannya nama fail dan fprintf-- 

SPEAKER 1: Oleh kerana dalam kes ini, kita perlu yang FILE-- besar semua dalam bintang caps--, fail. Jadi itu adalah penunjuk ke fail yang anda bercakap tentang. Ini adalah cara yang kita hanya merujuk kepadanya. Jadi dalam hal ini, anda boleh memikirkan aha file--, kita boleh menggunakan fail this-- sini merujuk kepada pembukaan "Hello" dan membiarkannya menulis. 

PENONTON: Bolehkah kita meletakkan "Hello" bukan [? hanya?] f fail? SPEAKER 1: Tidak, kerana "Hello" perlu terbuka dan ditulis. Fail di sini adalah seperti yang penanda yang mengatakan OK, kita mempunyai hello-- file-- ini bahawa kita sedang melihat. Ia telah dibuka. Dan kami akan menulis kepadanya. Jika anda hanya menggunakan "Hello", yang terkandung di dalamnya. Jadi ia akan dimarahi oleh. Maksud saya, anda boleh menamakannya. Anda hanya perlu membuat fail, bintang, "Hello", sama dengan itu. Tetapi seluruh titik adalah bahawa anda memerlukan pointer fail Bintang di perintah untuk dapat menggunakan fungsi ini. PENONTON: Bolehkah anda lakukan fail, bintang, fail, "Hello" atau adakah anda perlu meletakkan memfailkan bintang, fail olehnya? SPEAKER 1: Anda boleh buat fail, bintang, "Hello." Anda boleh menukar ini pada apa jua nama yang anda mahu. Ini benar-benar sewenang-wenangnya apa nama yang. Anda boleh nama itu apa-apa. Nama itu terbang spageti, jika anda mahu. 

PENONTON: Apakah "w" dalam tanda kutip untuk? 

SPEAKER 1: "w" hanyalah mod. Oleh itu, kita sedang menulis ke fail ini. Semua orang yang baik? Yang jelas nyata? Ya. 

PENONTON: Oleh itu, apabila ia menulis ini fail, di mana kita kemudian mencari fail itu? 

SPEAKER 1: Ia akan berada di sama direktori yang sedang anda gunakan dalam. Jika anda berada dalam tiga dan Serangga Anda menjalankan ini, dalam masa Serangga anda tiga folder akan menjadi fail ini disebut "Hello." Cool? Semua orang yang baik? Saya rasa seperti anda semua mendapatkan itu, yang besar. OK. Jadi kembali ke show-- slaid saya Saya suka apabila sesuatu bekerja. OK, pointers-- Apakah kalian gembira? Pointer adalah besar. Mereka mengambil sedikit untuk membalut kepala anda sekitar. Ini adalah tahun kedua saya pointer pengajaran. Dan saya rasa saya akhirnya mendapatkannya. Jadi, jika anda berjuang, tidak apa-apa. Seperti yang saya katakan sebelum ini, gambar gambar banyak membantu dengan hal-hal di CS, sebanyak yang saya berfikir orang cenderung untuk berfikir oh, kami tidak di depan komputer. Kami harus hanya kod. Gambar gambar No-- benar-benar akan membantu anda. Dan saya benar-benar menggalakkan anda untuk meneroka sisi TK anda dan membawa keluar krayon atau penanda dan imbang. Kerana ia akan membantu anda. Dan jika anda melihat saya pada waktu pejabat, saya akan membawa sekitar tumpukan kertas-kertas dengan pena melukis perkara-perkara. 

Jadi terutama dengan pointers-- melukis gambar. Dan aku yakin yang kita benar-benar akan menjadi menggambar beberapa gambar di sini juga. 

Jadi kalian semua harus melihat Binky, ini perkara claymation sejuk. Dan kami fikir ia adalah benar-benar lucu ketika ia meletup ke dalam sekumpulan keping. Ini beberapa hiburan untuk kelas. C [terdengar] kemampuan besar dapat mengawal memori. Dan itu salah satu dari hal-hal yang benar-benar membuatnya seperti bahasa yang kuat. Tetapi dengan kuasa yang besar datang tanggung jawab besar. Dan hal-hal gila boleh berlaku jika anda tidak berhati-hati. Oleh itu, apabila anda menggunakan petunjuk, anda ingin pasti anda benar-benar memahami betul-betul apa yang anda lakukan. Mudah-mudahan sedikit yang akan datang masa akan membantu anda benar-benar memahami petunjuk, bagaimana untuk menggunakan mereka, dan bagaimana untuk memanipulasi mereka. 

Jadi memory-- Saya yakin kita sudah melihat gambar rajah ini sebelumnya. Jadi, ini adalah hanya satu gambar rajah mudah bagaimana perkara mungkin disimpan memori. Jadi pada dasarnya anda mempunyai ini array besar blok satu byte adalah apa yang kita ada di sini-sedikit kenaikan gaji per satu setiap kali. Ini adalah hex [terdengar] sehingga lapan-bit blok. Dan setiap blok dikaitkan dengan alamat penerima perenambelasan. Jadi jika anda pernah melihat 0 x, itu hanya notating bahawa itu alamat perenambelasan. Anda boleh menganggap ini bermakna alamat penerima dalam ingatan. Kami bercakap tentang alamat memori setiap kali anda melihat perenambelasan. 

Kami mempunyai ints adalah variabel, mengapung adalah pembolehubah yang menyimpan. Jadi ints ints kedai. Kedai terapung terapung. Oleh itu, kita juga mempunyai pointer yang menyimpan alamat ingatan. Itu semacam pemetaan. Pointer adalah semata-mata untuk alamat memori. Jadi itu seperti jenis anda di sana. Alat anda adalah 32-bit, yang bermaksud bahawa alamat memori anda adalah empat bait. Jadi apa-apa penunjuk bahawa anda mempunyai juga akan menjadi empat bait. Atau yang lain jika itu empat bait, ingatan adalah empat bait. Pointer memori kedai. Oleh itu, mereka empat bait. Cool-- hanya ingin menguatkan. 

Anda perlu mendapatkan komik ini sekarang. Saya tidak tahu berapa banyak dari anda adalah penggemar xkcd, tetapi saya suka xkcd. Ia hebat. 

Baik. Jadi mewujudkan pointers-- seperti yang saya katakan, ia adalah cukup banyak sama seperti apa-apa lagi. Anda mempunyai jenis yang. Anda mempunyai nama. Betul? Itulah apa yang kita telah ada. [? Hex?] Bintang berarti itu pointer, dan kemudian apa sahaja yang anda ingin menyebutnya. Jadi jenis yang mewakili apa yang anda boleh menyimpan. -Baik saja? Dengan cara yang sama bahawa jika kita melakukan int, kita tahu kita menyimpan int di sana. Dengan pointer, ia menyimpan alamat memori. Tetapi apa yang dimaksudkan adalah bahawa- di sinilah gambar yang akan datang dengan mudah. Jadi dalam hal ini, kita perlu beberapa value-- katakanlah empat. Empat di satu alamat. OK? 

Yang ini terlebih dahulu di sini berarti bahawa itu 2x pointer. Betul? Ia adalah beberapa penunjuk x. x mungkin sesuatu, apa pun. Apa pun x is-- mengatakan x adalah empat. Ia akan menyimpan alamat ingatan di sini. Jadi int, bintang, x-- ini beberapa slot lain di memory-- yang mengetahui apa ini. Tetapi ia akan menyimpan alamat di sini. Jadi ini akan menjadi like-- dalam kes ini, Apa pun, disimpan di 0x1-- apa sahaja yang disimpan di alamat yang pointer kami memegang, harus sesuai dengan apa yang kita telah ditetapkan. Jadi pada 0x1, dalam hal ini, ini adalah x. Ini boleh hanya pernah menjadi int sementara kita menggunakan ini. 

Begitu juga, jika kita mempunyai 1thn lain, apa pun alamat disimpan dengan y mempunyai menjadi hal char-- sama dengan z. Dengan cara yang sama, apabila anda mencuba dan melakukan INTx bersamaan 0.4, ia akan berteriak pada Anda dan menjadi seperti tidak ada, anda berkata anda mahu int. Hal ini seharusnya menjadi int. Berhenti cuba untuk membuat ia pelampung. 

Jadi membiarkan hal-hal apa yang mereka mahu. Membiarkan perkara menjadi diri mereka sendiri. Jadi perkara besar adalah hanya apa pun jenis penunjuk ia adalah, itulah satu-satunya perkara yang boleh anda simpan di sana. OK? Dengan latihan, seperti minggu lalu, segala-galanya seolah-olah benar-benar jenis abstrak. Kami akan melakukan beberapa latihan. Perlu lebih masuk akal. 

Jadi rujukan dan dereferencing-- itu benar-benar penting untuk mendapatkan ini lurus. Saya masih perlu memuat semula setiap sekarang dan kemudian. Dan aku seperti menunggu, yang mana satu yang saya inginkan? Jadi ampersand malah akan memberikan Anda rujukan atau alamat. Jadi, ia akan alamat dalam ingatan yang berubah-ubah disimpan. Jadi itu akan benar-benar kembali kepada anda perenambelasan, sedangkan ia dereferencing sebenarnya akan memberikan data yang disimpan di sana. OK? Oleh itu, kita akan melihat contoh sangat cepat, atau benar-benar di sebelah. 

OK. Oleh itu, kita perlu memikirkan benar-benar hati-hati tentang perkara ini. Jadi di sini kita mempunyai beberapa integer x. Saya akan cuba menarik ini keluar untuk yang terbaik dari kemampuan saya. Jadi, kita akan mempunyai slot ini x. Dan ia menyimpan lima. Alamatnya adalah 0x4. Cool? Semua baik. 

Jadi sekarang kita mempunyai penunjuk ini. Ia adalah di sini. Dan ampersand memberikan kita alamat sesuatu. Jadi, dalam hal ini, itu adalah alamat x. Apa alamat x? 04-- dan penunjuk ini adalah di 0x08. Cool? Jadi, anda boleh berfikir tentang hal ini penunjuk, 04, hanya poin di sini. Dan mereka yang dipanggil pointer kerana seperti yang kita mendapatkan lebih banyak ke dalam ini, Anda akan melihat menunjuk kepada perkara-perkara. Dan satu blok menunjuk kepada yang lain blok akan masuk akal lebih banyak. Jadi di sini adalah dua. Dan kemudian kita mempunyai beberapa salinan, yang 0x0c-UMPC. Dan ia akan dereference pointer kami. 

Jadi apa yang ia katakan adalah OK, inilah pointer kami. Nilai menyimpan adalah 0x04, dan apa yang ia berkata adalah pergi ke alamat ini dan beritahu saya apa yang di dalamnya. Jadi itulah berkesan apa anak panah ini lakukan. Anda boleh memikirkan ini seperti bintang anda. Jadi OK, ketika kita melakukan bintang, itu berarti mengikuti. Pergi ke alamat ini. Dan itu pada dasarnya hanya mengikuti panah ini untuk sebahagian memori ini. Dan memberi kita apa yang ada di dalamnya, yang adalah 5. Ini sebabnya salinan kami adalah sama dengan 5. Adakah ini masuk akal? Apakah ada yang perlu saya untuk pergi melalui itu lagi, atau lebih lambat? Anda mahu saya untuk pergi melaluinya sekali lagi? OK. Kami akan lukis semula sekali lagi. Apabila kita bermula, kami semua bersetuju kita mempunyai beberapa sepotong memori itulah variabel x yang kita tetapkan sama dengan 5. Kami tidak mengawal di mana ia ada di dalam memori. Jadi tempat ini adalah hanya sewenang-wenangnya yang ditetapkan. Baik di sana? OK. Kemudian kami memulakan penunjuk kepada int. Itulah mengapa ia dibenarkan untuk menunjuk ke x kerana kita mempunyai int di sini. Kami mempunyai satu lagi sebahagian daripada memori kerana penunjuk ini ialah pemboleh ubah seperti apa-apa lagi. Ia sewenang-wenangnya diberikan beberapa ruang dalam ingatan. Dan apa yang ia menyimpan adalah alamat x. Ampersand bermaksud alamat x. Jadi apa alamat x? 

PENONTON: Ini zero-- SPEAKER 1: 0x04. Jadi then-- yang terakhir. Kami mempunyai beberapa copy-- lagi hanya satu lagi berubah-ubah. Jadi mari kita menetapkan beberapa tempat sewenang-wenang. Dan kami dereference pointer kami. Bintang itu bermakna pergi ke alamat yang disimpan dalam pointer saya. Beritahu saya apa yang ada. Jadi alamat yang disimpan dalam penunjuk kami adalah 0x04. Jadi kita pergi ke alamat tersebut. Ia menunjuk ke alamat tersebut. Apa yang di dalam blok memori ini? Itu adalah lima. Jadi itulah yang kita berikan salinan kami. Semua orang yang baik? Sejuk. Gambar Again--. 

Jadi menjejaki nilai-nilai di sini-saya akan membiarkan anda semua berfikir tentang hal ini. Kita boleh membuat gambar lain. Tetapi saya mahu anda untuk mencuba dan sebab melalui ini sendiri selama satu minit. 

Oleh kerana mereka tidak memberi kepada kami alamat contoh, Saya hanya akan melakukan x-- ampersand yang akan membantu memandu pulang ke rumah. Ampersand berarti alamat. 

Jadi, dalam yang pertama, semua orang pergi dengan baris pertama. Beberapa set x five-- beberapa slot rawak dalam ingatan. Penunjuk bintang Int adalah sama ke alamat x, kan? Int pointer bintang menciptakan blok ini, menyebutnya pointer, dan memberikan ke alamat x. Aku sangat buruk di ampersands. 

Sekarang apa yang kita lakukan adalah kita katakan OK, dereference pointer kami. Jadi kami pergi OK, apa yang ada di pointer kita? Ini ampersand x. Pergi ke ampersand x dan menetapkan kembali. 

Jadi sekarang, ampersand x akan menjadi 35. Jadi, pada asasnya, apabila anda dereferencing, anda pergi OK. Anda akan menggambar gambar seperti ini. Anda akan menggambar anak panah anda lebih di mana tempatnya. Jadi pergi ke slot ini dalam ingatan dan sama ada memberikan saya bahawa kembali nilai, atau mengubahnya. Dalam kes ini, kerana kita berada di ini nilai, kami memberikan ia menjadi 35. Sedangkan pada yang terakhir satu, jika anda perasan, kami telah memberikan apa yang di sini untuk sesuatu yang lain. 

Jadi mereka mempunyai jadual yang mengagumkan ini. Ia bukan yang buruk. Kalian bekerja di atasnya. Aku akan menarik keluar di papan tulis. Kami akan mengisinya bersama-sama, OK? Jadi ambil beberapa kertas, ambil pasangan, mula bekerja. Saya akan mendapatkan potongan yang lebih besar dari kapur. Kerana ia akan menjadi banyak. OK. PROFESSOR: OK. Mari kita mulakan dengan baris pertama. Kita akan mulai di sana, maka kalian mungkin dapat bekerja melalui beberapa. OK. yang sama dengan b kali c jadi apa yang? Ia bukan satu soalan trick, aku janji. 

PELAJAR: 4 kali 5. 

PROFESSOR: 4 kali 5. 20. Jadi apa b? PELAJAR: 4. 

PROFESSOR: Dan c? PELAJAR: 5. PROFESSOR: 5. Dan maka ini hanya akan akan Ampersand a, ampersand b, ampersand c, kan? Tidak buruk. Ia cukup mudah. OK. Jadi yang seterusnya. A adalah 'kali c, dalam hal ada orang yang tidak dikenali dengan itu. Apakah semua orang biasa dengan masa sama? OK, semua ini ertinya- ini singkatan untuk yang sama dengan kali c. Anda juga boleh melakukannya dengan bahagian, dengan Selain itu, dengan pengurangan. Anda boleh melakukan sama dengan, atau ditambah sama dengan c ertinya sama plus c, minus sama c akan menjadi sama dengan tolak c. Ia hanya gula sintaksis. 

Jadi, dalam hal ini, adalah sama dengan kali c akan memberi kita apa? Sekali lagi, bukan pertanyaan helah. 

PELAJAR: 100. 

PROFESSOR: 100. Adakah apa-apa lagi berubah? Tidak. Mungkin aku akhirnya akan mendapat lebih baik di ampersands saya. 

PELAJAR: OK, maaf, bagaimana anda mendapatkan 100? PROFESSOR: OK. Jadi adalah sama dengan yang kali c, jadi kali c. PELAJAR: Oh, anda menggunakan untuk previous-- yang PROFESSOR: Ya. Jadi ini adalah nilai-nilai yang paling baru-baru ini. Ini adalah apa yang anda harus menggunakan seperti yang kita bergerak ke bawah, OK. Jadi, b adalah satu-satunya perkara yang berubah-ubah, bukan? Jadi mari kita mengisi segala sesuatu yang lain. B. Apa yang b akan menjadi? Untuk menjadi atau tidak menjadi. Jadi apa yang lakukan? Apa adalah bintang pa lakukan? 

PELAJAR: Kod ke lokasi pa. 

PELAJAR: Tidak ada, tidak cukup. Jadi ini adalah rujukan d. 

PELAJAR: Jadi b adalah nilai tangan dari setahun. 

PROFESSOR: Ya, jadi pa adalah alamat, kan? Jadi ia berkata pergi ke mana a adalah disimpan dan memberikan nilai tersebut. Jadi apa yang b? PELAJAR: 100. PROFESSOR: 100. Sempurna. OK, jadi pc adalah apa yang berubah-ubah. Segala sesuatu yang lain tetap sama. Apa yang pc akan menjadi? Tugas yang mudah. Pc adalah sama dengan setahun, dan apa yang pa? 

PELAJAR: ampersand seorang. PROFESSOR: Perfect. Sekarang kita sudah menarik. OK, mari kita memecahkan satu ini ke bawah. Pertama, apa yang b kali c, kerana itulah bahagian yang mudah satu ini, kan? B kali c is-- 

PELAJAR: 500. 

PROFESSOR: Ya, jadi apa yang satu ini lakukan, jika itu pb bintang, apa yang berubah? 

PELAJAR: Apa yang ada di the-- PROFESSOR: Apa yang ada di b? PELAJAR: Apa yang ada di ruang pb yang menunjuk ke. PROFESSOR: Dan pb menunjuk supaya- PELAJAR: B. PROFESSOR: B. Jadi satu-satunya hal perubahan adalah b, betul. Jadi kali b c, 500. Jadi itulah yang berubah sekarang. Sejuk. Lovely. Kalian melakukan yang besar. Baiklah, ini melanggar satu ke bawah. C berubah, kan? Oleh itu, kita dapat mengisi segala sesuatu yang lain. Mari kita lihat. OK. Kita tahu bahawa c akan menjadi darab dua nombor, kan? Apakah dua nombor, walaupun? 

PELAJAR: A dan c? 

PROFESSOR: Jadi adalah tepat untuk yang pertama. Jadi kita d rujukan p dari, kan? P dari mata kepada, jadi kita tahu bahawa ini akan menjadi 100 kali lipat? Times apa titik pc ke? Menunjuk ke sebuah. Jadi 100 kali 100 adalah 10,000. Adakah ini masuk akal? Sejuk. Peregangan, guys, baris terakhir. OK. Apa yang berubah di sini? 

PELAJAR: A. PROFESSOR: A. sempurna, sehingga segala sesuatu yang lain dapat tetap sama. OK. Dan apa itu? Jadi itu adalah kali apa? Ini pb bintang. Jadi pb bintang bermakna inilah pb, mata pb ke b. 

PELAJAR: 500. 

PROFESSOR: 500. Oleh itu, kita mempunyai 500 kali 100. Itu 50,000. Wah! Lihat itu. 

PELAJAR: Mengapa kita harus yang & c untuk last-- PROFESSOR: Maaf. PELAJAR: Oh, OK. PROFESSOR: buruk saya. Banyak menulis. Semua orang yang baik? Tidak terlalu buruk, kan? Hanya memerlukan waktu sedikit sementara untuk bekerja melalui. Jika anda memecahkan ia ke bawah, memahami apa yang setiap bahagian merujuk kepada- sebagai dengan segala sesuatu itu, yes-- memecahnya ke kecil masalah dan kemudian bergabung semula, dan anda boleh melakukan beberapa perkara yang menggerunkan. Ada jawaban, tetapi kita melakukan itu. Penunjuk aritmetik. Ah. Tanganku semua pasi. Jadi menambah atau mengurangi int menyesuaikan penunjuk oleh saiz jenis pointer. Ingat bagaimana setiap jenis mempunyai saiz yang berbeza? Sebab itu dua atau yang lama lama yaitu lapan dan int adalah empat tetapi arang adalah satu. 

Jadi apa yang anda mahu lakukan is-- satu hal yang perlu diingat Hanya saja, berapa banyak anda nilai penunjuk benar-benar mengubah bergantung kepada jenis pointer itu. Semua orang yang baik dengan ini? Bolehkah saya menghapusnya? Kami baik? Awesome. 

Jadi, jika kita mempunyai beberapa penunjuk bahawa- ini akan adalah-- Saya akan menjadikannya sebuah pointer int. Yang menyimpan ini. Jika anda mengatakan penunjuk ditambah satu, apa yang ia akan lakukan adalah ia akan mengemaskini dengan saiz int kerana itulah yang jenis pointer itu. 

Dengan C, segala-galanya adalah yang sangat ketat dan terkawal. Pointer int akan mengemaskini dengan jumlah ruang int akan mengambil. Int adalah empat bait. 

Jadi apa ini akan berubah menjadi? Anda hanya menambah empat ke ini. Sekarang penunjuk anda akan adalah-- OK. 

Jadi, jika itu adalah char dan kami melakukan pointer ditambah satu, apa yang ia akan menjadi ini? Jika ia started-- berpura-pura kita started-- sekarang ini 0x08. Mari kita sekarang mengatakan bahawa ini adalah satu char penunjuk, dan kami tambah satu. Apa yang akan berubah ke? Berapa banyak bait adalah char? 

PENONTON: Satu. 

SPEAKER 1: Satu. PENONTON: Jadi 0x09. SPEAKER 1: Jadi ia akan menjadi sembilan. Jadi, perlu diingat. Hanya apabila anda menambah satu, ia bukan menambahkan satu kecuali jika char. Ia menambahkan berapa banyak bait jenis yang ia adalah, itulah sebabnya kita mempunyai persamaan ini di sini. Jadi itu kali int saiz jenis mata. 

Oleh itu, kita mempunyai contoh di sini. y ditugaskan dengan nilai, 0x4, ketika kita melakukan y ditambah sama dengan satu. Apa yang di dalamnya, apa yang dalam x, tidak berubah. Apa perubahan adalah apa yang ada di y. Alamat disimpan dalam y dikemas kini oleh empat kerana ada empat bait dalam int dan ini merupakan penunjuk int. 

Baik. Jadi sekarang kita mempunyai latihan lain. Jadi pertanyaannya adalah apa yang akan dicetak. Apa-apa idea? 

PENONTON: Jumlah watak-watak dalam kucing bahagia? SPEAKER 1: Tepat sekali. Jadi suka dengan tali anda. Adakah semua orang mendapatkan itu? Adakah kita ingin berjalan melaluinya? 

Ya, OK. Jadi apa yang kita ada di sini-saya seperti ini jauh lebih banyak. Saya tidak perlu [Terdengar] sungguh. 

Jadi kita mempunyai tali kita di sini, kucing gembira. Lovely. Kami mempunyai beberapa kaunter yang kita mengesan. Oleh itu, kita mempunyai beberapa char * pointer yang hanya ditetapkan sama dengan str. Apa ini lakukan adalah itu menetapkan beberapa penunjuk ke awal tali anda. Kerana saya yakin, kerana ia disebutkan dalam kuliah, kami telah memberikan lelaki ini Jenis data yang disebut tali. 

Tetapi benar-benar tali hanya array daripada- seperti char *. Ia adalah penunjuk kepada sekumpulan aksara yang berdekatan dalam ingatan. Jadi ini hanya menetapkan ia sama dengan apa-apa tali adalah dikenal pasti oleh mana Aksara pertama adalah. Jadi, ini adalah hanya menetapkan satu ketika sama dengan awal string. Semua orang yang baik di sana? Sejuk. 

Jadi, ini adalah dereferencing pointer kami. Oleh itu, ia benar-benar akan memberikan kita beberapa nilai di sini, dalam rentetan kita yang kita bercakap tentang. Dan kita katakan selama ia bukan terminator null. Jadi terus berjalan sehingga anda mendapat hingga akhir string. Kemas kini pointer anda dengan satu. Jadi r, ia sebenarnya akan mengemas kini dengan satu setiap kali kerana ini adalah char, char *. 

Jadi ia akan melalui. Ini akan mengemas kini. Jadi kali pertama ini berjalan, ia akan berada di sini di h. Ini akan mengemas kini. 

Ini akan menjadi satu. Ini akan menjadi p, y, dan sebagainya dan sebagainya. Kami akan update kaunter. Apabila ia sampai akhirnya, hanya mencetak seberapa jauh ia mendapat. Ya. 

PENONTON: Jadi Ia dikira ruang sebagai salah, kan? OK. 

SPEAKER 1: Fikirkan demikian. Adakah itu yang question-- 

PENONTON: [didengar]. 

SPEAKER 1: Jangan bimbang. Hal ini saya lakukan itu. Baiklah, jadi satu perkara yang saya mengerti adalah bahawa dengan array, Anda juga boleh memperlakukannya sebagai kerana pointer array hanya tempat-tempat yang berterusan dari ingatan. 

Jadi, anda boleh memperlakukannya dengan cara yang sama. Anda boleh memanipulasi mereka dengan petunjuk, juga. Jadi, daripada melakukan pada yang demikian kes, perkara yang analog akan pelbagai 0 sama dengan 1. 

Tetapi dengan cara yang sama yang string ditentukan oleh awal di mana watak pertama adalah, array ditentukan oleh mana anggota pertamanya adalah. Kerana kami tahu, kami tidak dijamin, bahawa akan menjadi yang berterusan blok ingatan. Itulah yang membolehkan kita untuk melakukan hal ini. Kami tahu mereka berterusan blok ingatan. 

Jadi dalam hal ini, oleh dereferencing hanya array, yang memberitahu kita, OK, pergi ke permulaan array, yang ada di sini. Jadi, anda boleh menetapkan ia sama dengan satu. Dan dalam kes ini, apa pun array jenis adalah, apabila anda mengemas kini dengan satu, itu hanya seperti mengemas kini untuk indeks yang akan datang. Anda boleh melakukannya kerana anda tahu apa yang sedang anda. Sehingga tahu berapa banyak untuk mengemaskini penunjuk anda dengan, apa alamat untuk mengemas kini ia begitu bahawa anda berada di slot akan datang. 

Jadi, ini adalah hanya cara yang berbeza menulis pelbagai 0 sama dengan 1, array 1 sama dengan 2, pelbagai braket 2 sama dengan 3. Ia hanya cara lain untuk berfikir tentang hal itu. Kerana mereka adalah berterusan blok dalam ingatan, anda boleh merujuk kepada mereka sama ada oleh array notation-- yang saya pribadi mencari easier-- tapi mungkin Anda perlu untuk memanipulasinya ketat oleh alamat memori. Dan ini adalah cara bagaimana anda akan melakukannya. Jenis lebih dari seperti Perkara yang sejuk yang anda boleh lakukan berbanding mungkin bukan sesuatu yang anda benar-benar akan dilaksanakan. 

Saya menggunakannya di 61. Kalian mungkin tidak perlu perlu bimbang tentang hal itu terlalu banyak. Tetapi jika anda berminat, mengambil 61 tahun depan. Kami orang-orang di rumah peregangan. Saya tahu, itu panjang. Dynamic Memory Allocation-- sehingga kita tahu yang perkara apabila kita bercakap dalam Bahagian pertama kami bersama-sama, kami melihat swap fungsi di mana ia adalah di luar skop fungsi utama kami. Dan kami telah lulus dalam nilai-nilai yang berkesan salinan. 

Dan sekali swap selesai melaksanakan, ia hanya meninggalkan tumpukan. Ingat, kita mempunyai tumpukan rangka untuk swap. Ia meninggalkan dan orang-orang Nilai meninggalkan dengannya. Dan mereka pergi. Kami tidak dapat berbuat apa-apa dengan mereka dan kami sedih kerana kita tidak boleh menukar nilai-nilai kita. 

Tetapi dengan C, seperti yang saya sebutkan, anda mempunyai banyak kuasa ke atas ingatan. Jadi apa yang boleh anda lakukan adalah anda boleh memperuntukkan perkara-perkara di heap sini yang akan tinggal di sana sehingga Anda memberitahu mereka sebaliknya. 

Mereka seperti anak-anak yang baik. Mereka tinggal di sana. Mereka tidak meninggalkan. Mereka akan tinggal di sana sehingga anda seperti, OK, anda boleh pergi dari sini. 

Manakala perkara-perkara di stack, yang- mereka seperti kanak-kanak nakal. Mereka hanya akan melarikan diri apabila anda mahu berada di sana dan kemudian mereka pergi. Anda tidak boleh mendapatkan mereka kembali. 

Jadi tumpukan is-- kita akan bercakap tentang malloc dan bebas, yang Saya pasti anda semua dengar dalam kuliah. Dan yang pada dasarnya cara yang mempunyai data yang sangat gigih. Jadi, anda boleh menyimpan data sekitar selama yang anda mahu. Mhm. 

PENONTON: Bolehkah anda tentukan tumpukan dan tumpukan? Adakah mereka suka tempat-tempat untuk meletakkan segala sesuatu? 

SPEAKER 1: Jadi mereka pada dasarnya hanya-- mereka cara kita merujuk hanya untuk ingatan. Jadi tumpukan hanya tempat di mana memori diperuntukkan secara dinamik, sedangkan timbunan merujuk lebih tumpukan frame yang lebih penting kepada fungsi yang benar-benar berjalan. Anda tidak benar-benar mempunyai kawalan. 

Perbezaan besar, anda mempunyai kawalan atas timbunan itu jika anda mahu. Anda mempunyai kurang kawalan ke atas tindanan. Tumpukan bergantung kepada fungsi yang sedang berjalan, dan perintah itu di mana mereka dijalankan, dan bagaimana perkara dikembalikan. Manakala dengan timbunan itu, sebagai kita akan melihat, anda boleh berkata, OK, saya mahu nilai ini menjadi sekitar sehingga saya memberitahu anda sebaliknya. Anda tidak dibenarkan untuk membuangnya. Anda tidak dibenarkan untuk mengatasinya. Anda akan tetap sekitar selama yang saya katakan. Anda dapat menjadi bos di tumpukan, sedangkan stack-- yang mungkin jika anda seperti finagle jalan anda boleh menjadi bos. Tetapi tidak cukup. Dan ia benar-benar hanya ingatan. Ini hanya berbeda cara dari merujuk kepada ingatan. 

Sejuk. Maka dengan itu, bagaimana untuk mengawal ingatan anda. Hal ini dengan malloc, yang Anda akan dapat menggunakan. Jadi itu hanya singkat bagi peruntukan memori. Itu semua itu. Ada sekumpulan sejuk lain fungsi yang memiliki alloc di akhir, dan mereka berdiri untuk perkara-perkara yang berbeza. 

Oleh itu, apabila anda perlu simpanan yang perlu hidup lebih lama dr fungsi semasa anda supaya bahawa apabila anda saat ini fungsi melarikan diri, anda masih mempunyai data yang anda dapatkan dari itu, anda ingin menggunakan malloc. Yang akan memulakan di atas timbunan itu. Dan seperti saya katakan dan menjaga mengatakan, anda akan tetap di sana sehingga Anda mengatakan sebaliknya, yang merupakan perkara yang penting di sini. 

Jadi, satu perkara yang perlu melihat, dan itu biasanya benar-benar penting, adalah bahawa ini sizeof super berguna untuk menggunakan kerana bergantung pada jenis mesin yang anda jalankan, ia mungkin mempunyai jumlah yang berbeza memori yang diperlukan. Jadi, anda sentiasa mahu menggunakan saiz sehingga bahawa anda tidak mesin bergantung, supaya kod anda akan berjalan di mana-mana mesin. 

Dan itu hanya sebahagian menulis kode yang baik. Jika bekerja di satu mesin, tetapi tidak apa-apa yang lain, bagaimana berguna adalah program anda? Jadi, anda sentiasa mahu memastikan dan menggunakan sizeof. 

PENONTON: Begitu juga yang seperti ukuran 10 inci [terdengar]? 

SPEAKER 1: Ini adalah saiz 10 int. yeah. Jadi saiz int akan kembali berapa satu int ambil. Atau ukuran char, bagaimana banyak seseorang char ambil. Alangkah banyak blok itu yang anda mahu? 

Jadi dalam hal ini, kita mahu sesuatu bahawa kita boleh menyimpan 10 ints ke. Dan ia akan bekerja tanpa mengira mesin, yang dingin. Jadi berapa banyak bait akan yang benar-benar memberikan? Matematik cepat. 

PENONTON: 40. SPEAKER 1: 40. Tepat. Jadi satu lagi perkara yang besar. Penunjuk atau malloc boleh kembali null. 

Jadi sekali lagi, sentiasa memeriksa untuk lihat jika ia kembali batal sebelum anda mencuba dan berbuat apa-apa dengannya. Jika anda mencuba dan dereference penunjuk ini sekarang, ia hanya akan segfault kerana anda pergi dan cuba menyentuh batal apabila anda tidak seharusnya. Jadi selalu memeriksa null. Sekali lagi, semua yang anda boleh lakukan. 

Ia akan kembali null. Ia akan kembali batal jika anda sama ada ruang, atau untuk apa-apa sebab ia berlari ke dalam beberapa bug memori. Ia kadang-kadang hanya null. Jadi anda hanya perlu menyemak untuk itu. Itu semua slaid ini mengatakan. Dan kemudian apa yang kita ada di sini adalah panggilan untuk membebaskan. Jadi dengan cara yang sama bahawa jika anda membuka fail anda perlu menutup fail, jika anda memori malloc, anda Anda mesti bebaskan ingatan itu. Dan kalian akan mendapatkan untuk melakukan hal-hal yang benar-benar sejuk. 

Dan ada program yang boleh dijalankan untuk melihat apakah anda pernah bocor memori. Tetapi anda tidak mahu bocor memori. Ia benar-benar buruk. Hanya merosakkan sesuatu. 

Tidak baik untuk melakukan hal seperti pengaturcaraan bijak untuk kecekapan reka bentuk. Tetapi ia juga hanya jenis dari buruk bagi komputer anda. Hal jadi percuma apabila anda malloc mereka. 

Kalian lihat simetri di sini. Super mudah. Hanya percuma dan kemudian apa pun pointer anda, apa sahaja nama penunjuk anda, dan ia akan mengurus membebaskan untuk anda. Sejuk. 

Maka kita mempunyai ini. Oleh itu, kita hanya akan berjalan melalui program ini. Dan kemudian kalian selesai. 

Jadi [terdengar] hanya utama. Oleh itu, kita mempunyai beberapa int * pointer. Oleh itu, kita mempunyai penunjuk itu akan memegang int. Dan berapa banyak int ia akan berlaku? Hanya satu. Saiz int. 

Kami memeriksa untuk melihat jika pointer adalah batal kerana ia adalah, kita mahu mengatakan tidak melakukan apa-apa. Ini tidak baik. Oleh itu, kita mencetak beberapa kesalahan daripada memori, yang paling sering kembali 1, seperti kalian digunakan untuk. 

Dan kemudian kita ada di sini, kita dereference pointer kami. Ini bermakna kita akan menyimpan sesuatu di lokasi yang diberikan kepada kita. Int * pointer, atau malloc, mengembalikan alamat di mana ia menyisihkan ini memori untuk anda. Jadi pada dasarnya memberikan anda like-- jika anda berfikir tentang sekumpulan rumah-rumah di kawasan kejiranan yang yang anda mahu untuk meletakkan anda perabot di, malloc adalah seperti OK, anda akan mendapat untuk pergi ke rumah tiga. Dan ia memberi anda alamat rumah tiga. 

Jadi sekarang ini, ini kedai penunjuk alamat, menyimpan alamat rumah anda. * Cara ptr, OK, saya di rumah saya. Sejuk. Saya perlu mendapatkan beberapa integer. 

Jadi anda meminta seseorang untuk memberikan perabot sekarang. Oleh itu, anda mendapatkan beberapa int. Dan ia meletakkannya dalam penunjuk anda di mana ia menunjuk ke. 

Dan kemudian ia hanya cetakan keluar, di mana sahaja yang anda masukkan. Dan sekali lagi, rujukan. Jadi ini adalah seperti anda pergi ke ini menangani dan anda melihat apa yang ada di sana. Cool? 

Dan tentu saja kita membebaskan penunjuk kami. Jangan lupa untuk membebaskan penunjuk anda. Jangan lupa untuk memeriksa null. Jangan lupa untuk membebaskan penunjuk anda. Anda mempunyai dua perkara yang anda ingat dari ini, atau yang anda harus ingat. Ya. PENONTON: [didengar] barang-barang seperti itu, char * s. Kenapa kita tidak membebaskan mereka? 

SPEAKER 1: Hm? 

PENONTON: Adakah orang-orang seperti tali? Anda berkata string seperti char * s, kan? Jadi mengapa tidak kita membebaskan tali? 

SPEAKER 1: Anda hanya untuk percuma jika anda mallocing. PENONTON: Oh, jika anda mallocing. SPEAKER 1: Jadi malloc dan bebas adalah dua perkara bahawa anda harus selalu memiliki bersama-sama. f terbuka, f dekat, dua perkara anda perlu mempunyai bersama-sama. Dalam kedua-dua kes tersebut, memeriksa null. Ya. 

PENONTON: Jadi percuma saja membenarkan sesuatu yang lain untuk disimpan di sana selepas program ini telah menggunakannya? 

SPEAKER 1: Ia hanya mengatakan, OK, aku sudah selesai dengan ini. Anda tidak perlu untuk tetap sekitar. Jika tidak, komputer anda akan hanya suka mencuba dan tetap di sana. Dan kemudian anda can't-- berjalan menjadi masalah memori kemudian. Anda sentiasa ingin bebas kerana ia memberitahu komputer anda, OK, saya dilakukan dengan tempat ini dari ingatan. Anda boleh mempunyai ia kembali bagi saya untuk menggunakan kemudian. Cool? Ya. 

PENONTON: Jadi kami menggunakan% d yang baru kerana dua yang datang kembali, atau mengapa is-- [terdengar]. 

PENONTON: Bolehkah anda menggunakan% i? 

SPEAKER 1: Anda boleh menggunakan% i. Sebarang pertanyaan istimewa? Pergi ke depan. PENONTON: Saya hanya mempunyai soalan cepat. Boleh berubah ptr itu, that's-- seperti, dengan int * ptr = malloc, itu hanya mengatakan itu menunjuk ke suatu tempat di memory-- SPEAKER 1: Adakah anda ingin [terdengar]? PENONTON: -yang 's yang saiz daripada- tidak, itu OK. Tetapi ia hanya menunjuk ke suatu tempat di memori itu hanya seperti empat bait. SPEAKER 1: Benar. Jadi malloc saiz int berkata, OK, saya akan pergi lari, mendapati empat bait memori untuk anda. Ketika ia mendapati bahawa empat bait memori, yang memberi kembali alamat dari mana ia bermula, dan itulah yang disimpan dalam pointer, atau ptr. Baik. Kalian kelihatan kurang bingung daripada kebanyakan orang apabila saya bercakap tentang penunjuk, jadi saya rasa cukup baik sekarang. 

Baik. Seperti biasa, anda semua harus memiliki semua mendapat gred pset2 anda sekarang. Saya tahu ada beberapa wonky hal di mana ia berkata, formula tidak sah atau sesuatu. Jika anda mendapat itu, semua gred anda adalah sah di sisi saya. Jadi saya boleh menghantar anda screenshot dari pencapaian ujian anda. Biarkan aku tahu juga jika anda hilang apa-apa nilai atau sesuatu nampaknya tidak masuk akal. Marilah kepada-Ku. 

Saya telah super berbangga dengan anda orang sudah, jadi keep it up. Dan mempunyai rehat yang baik dari minggu anda. Saya pasti saya akan melihat beberapa dari Anda pada waktu pejabat.