>> [THEME MUSIC]
>> SPEAKER 1: Hi, semua orang.
Selamat datang kembali ke bagian.
Indah hari out-- itulah sebabnya, aku yakin, hanya ada empat dari Anda di sini
dan tidak pak kami biasa.
Saya telah sakit akhir pekan ini.
Jadi saya tidak memiliki Starburst untuk kalian.
Dan aku mungkin mulai batuk sangat sepanjang ini.
Jadi hanya beruang dengan saya.
Aku akan benar-benar mencoba dan bisa melewati ini pertama,
meskipun, sebelum saya memiliki serangan batuk.
Tapi mudah pada saya sedikit bit-- itu yang saya minta.
>> Jadi agenda kami untuk today-- hanya reminder-- kuis Anda adalah minggu depan.
Saya bilang minggu lalu ini sehingga tidak akan menangkap Anda lengah.
Jadi aku mengingatkan Anda lagi.
Kuis minggu depan.
Untuk itu, pekan depan Bagian akan jauh lebih
of-- Saya akan mencoba dan bekerja di beberapa ulasan.
Jadi jika kalian bisa membantu saya dengan mengirim saya
hal-hal yang Anda merasa nyaman dengan, bahwa Anda khawatir tentang,
topik yang Anda ingin untuk saya untuk menutupi, itu akan menjadi besar.
Sehingga saya bisa mencoba dan bekerja mereka ke bagian kami minggu depan
atau mengirim bahan tambahan atau persiapan bahwa Anda mungkin tidak mendapatkan tempat lain.
>> Ya!
Lebih banyak orang datang!
Saya pikir, yang saya lakukan itu buruk terakhir Minggu, bahwa tidak ada yang mau datang kembali?
Aku takut.
Jadi lain tiga hal bahwa kita akan pergi ke
adalah pengalihan, file I / O, dan maka pointer dan memori dinamis.
Saya yakin Anda semua super gembira tentang pointers-- topik favorit semua orang,
sehingga mudah dimengerti.
Saya yakin kalian semua punya itu, kan?
>> Jadi, hal pertama yang pertama, redirection-- ini pada dasarnya hanya cara
untuk mengontrol bagaimana Anda masukan hal ke dalam program Anda,
bagaimana Anda hal keluaran dari program Anda.
Cara utama yang kalian telah berinteraksi dengan itu
hanya melalui keluar standar dengan layar cetak Anda di sini.
Tapi ada cara untuk pipe-- seperti yang kita lihat di sini
adalah salah satu jenis words-- kami pipa bahwa informasi
atau data ke sebuah file dari sebuah file.
Ini hanya berbeda cara mendapatkan hal-hal ke dalam program Anda
dan keluar dari program Anda, bukan hanya mencetak mereka ke layar ini
atau memasukkan hal-hal dari baris perintah.
>> Jadi yang pertama sedikit lebih besar dari tanda sisipan.
Jadi output-- itu hanya mencetak output ke file bukan dari layar Anda.
Jadi jika Anda memiliki sesuatu yang dicetak "Hello, world!" ke layar,
jika Anda memasukkannya sebagai gantinya untuk output.text, bahwa
menciptakan file ini disebut output.text.
Dan ketika Anda membukanya, itu akan mengatakan "Hello, world!" di sana.
Hal ini dapat menjadi super berguna jika Anda memiliki satu ton kesalahan
sebenarnya, seperti yang kita lihat dalam satu ini.
Jika Anda melakukan dua sisipan, itu akan mencetak pesan kesalahan.
>> Jadi jika Anda mengalami masalah dengan kompilasi, ia memiliki banyak kesalahan
dan kau akan macet dalam mencoba untuk menggulir di baris perintah Anda
melalui semua mereka, Anda dapat hanya mencetaknya ke file,
membuka file sehingga Anda dapat menggulir melalui mereka lebih mudah.
Aku benar-benar digunakan bahwa banyak ketika saya debug
saya 181 psets untuk pembelajaran mesin.
Sehingga dapat menjadi super berguna di kemudian hari.
Ini juga berguna jika Anda memiliki program bahwa mungkin adalah menghasilkan perpustakaan
atau menghasilkan beberapa set string, dan Anda
harus mampu melihat bahwa itu menghasilkan mereka dengan benar.
Ini adalah cara untuk melakukan itu.
>> Jadi jika Anda mencetaknya ke file, Anda dapat lebih mudah memeriksa mereka, kan?
Versus mencoba untuk menggulir melalui baris perintah Anda.
Dan kemudian satu hal yang perlu diperhatikan adalah bahwa dengan hanya lebih besar
dari sisipan, jika Anda menulis ke file yang sudah exists--
jadi seperti jika kita berlari ini pertama waktu, kita meletakkannya untuk output.text,
dan kemudian kami memiliki program kedua yang dicetak ini sebagai program dua
dan melakukan lebih besar daripada output.text, itu akan menimpa itu-- jadi
menimpa apa yang pernah di file itu untuk memulai dengan.
>> Jadi jika Anda ingin menambahkan ke file, seperti yang kita lihat di sini,
Anda hanya melakukan dua lebih besar dari tanda-tanda.
Dan akan ditambahkan untuk itu.
Ini tidak akan menimpa itu.
Jadi jika Anda perlu untuk menjalankan beberapa program dan jenis tetap
melacak apa semua dari mereka adalah kembali ke Anda dalam sebuah file,
itu adalah cara untuk melakukannya.
Jika Anda tidak peduli apa yang ada di file Anda dan itu diperbolehkan untuk ditimpa,
Anda hanya dapat menggunakan lebih besar daripada satu.
Apakah itu masuk akal untuk semua orang?
>> AUDIENCE: Seperti dot slash halo yang lebih besar dari keluaran dot teks, seperti dua kali,
itu akan hanya hanya menunjukkan pada output dot teks time-- kedua
>> SPEAKER 1: Benar.
Jadi itu akan pada dasarnya hanya benar-benar menimpa apa ada di sana untuk mulai dengan.
Jika berkas ini di sini, yang output.text sudah
ada, pada dasarnya apa pun yang Anda menelepon itu lagi dengan lebih tunggal
daripada Anda hanya bisa memikirkan itu seperti seperti itu diganti file.
Seperti ketika Anda menyimpan Word dokumen dan Anda simpan sebagai,
dan Anda tetap nama yang sama, dan itu benar-benar menimpa itu--
ini adalah hal yang sama.
Ada yang punya pertanyaan pada hanya keluaran ke file?
Mengagumkan.
>> Jadi jelas, jika Anda membalik panah arah, ia bisa melakukan input.
Jadi ketika kalian memiliki seperti Caesar atau Visioneer
dan Anda harus memasukkan sesuatu, Anda memiliki argumen baris perintah
yang benar-benar masukan itu.
Ini adalah cara lain untuk melakukan itu.
Jadi alih-alih menunggu untuk command prompt,
seperti ketika Anda meminta Anda pesan di Caesar atau Visioneer,
jika Anda memiliki file teks yang memiliki pesan Anda,
Anda hanya bisa ketik ke itu.
>> Jadi jika ini adalah seperti dot slash Caesar 3 kurang dari input teks panah, yang
adalah pesan Anda, bahwa akan berjalan baik-baik saja.
Ketika program Caesar Anda benar-benar meminta masukan dari pengguna,
itu sudah akan memilikinya karena Anda mengetik dalam file ini.
Itu hanya cara lain.
Hanya kebalikan dari output-- hanya masukan untuk data Anda.
>> Dan kemudian yang terakhir adalah pipa.
So cool cantik yang satu ini.
Karena memungkinkan Anda untuk mengambil output dari satu
Program dan meletakkannya sebagai masukan ke program lain.
Saya tidak tahu apakah ada di antara kalian bermain dengan menguraikan tersebut
CS50 yang mungkin memiliki diberikan Anda, tapi itu akan
memungkinkan Anda untuk mengambil beberapa sampel file, ketik ke enkripsi Anda,
dan kemudian dari sana ketik bahwa dalam dekripsi Anda
untuk memastikan itu ternyata sama.
Jadi itu jenis seperti tiga arah lingkaran.
Pergi untuk itu.
>> AUDIENCE: Jika program memiliki beberapa input,
apakah ada cara untuk menceritakannya mana masukan menggunakan file teks atau output untuk?
>> SPEAKER 1: Memiliki beberapa input.
Apapun mengajukan input-- Anda ketika itu meminta masukan yang pertama kalinya, itu
akan menganggap, saya pikir, itu akan pipa di seluruh file.
Jadi jika Anda memiliki beberapa masukan, kau akan piping dalam beberapa file.
Jadi jika Anda meminta pesan tiga kali dalam kode Anda,
Anda akan menempatkan dalam tiga file yang berbeda.
Dan itu akan gila.
Dan Anda tidak harus khawatir tentang itu sekarang.
Tapi itu ide.
>> Jadi ya, pipa hanyalah output dari satu Program menggunakan masukan ke yang lain.
Semua orang baik di sana?
Keren.
OK.
Anda mungkin tidak akan memiliki untuk melakukan terlalu banyak dengan itu.
Tapi Anda harus memahami cara Anda dapat menggunakan ini.
Dan ada beberapa kasus yang Anda mungkin ingin menggunakannya.
>> Jadi file I / O-- aku tahu apa yang Anda saying-- kita terbiasa membaca dari
dan menulis ke layar kami di sana, yang merupakan standar dan standar out.
Dan itulah apa yang kalian telah melakukan sejak awal kelas di sini.
Tapi Anda juga dapat membaca dan menulis file, yang semua file I / O-- jadi file input,
output semua itu singkatan.
Jadi ini pada dasarnya berarti bahwa Anda dapat menyimpan data Anda.
>> Bila Anda hanya mencetak ke layar, itu pada dasarnya pergi, kan?
Segera setelah Anda membuat "Hello dunia "dan menjalankan" Halo dunia "
mencetak "Hello world" ke layar.
Tapi Anda tidak bisa benar-benar melakukan apa-apa dengan itu dari sana.
Jika Anda menyimpan dalam teks File, lalu tiba-tiba
Anda memiliki data ini bahwa Anda diizinkan untuk memanipulasi atau memasukkannya ke dalam sebuah file,
atau memasukkannya ke dalam sebuah program kemudian.
Salah satu alasan mengapa kita melakukan ini hanya
sebagai cara untuk menyimpan data untuk digunakan kemudian.
>> Saya punya beberapa langkah di sini hanya berjalan melalui standar
I / O. Pada langkah satu, Anda perlu membuat referensi
ke file dengan semua topi FILE File bintang.
Sehingga menciptakan pointer ke file.
Jadi Anda ingin membukanya.
Dan Anda katakan, secara harfiah, hanya file yang sama dengan fopen.
Dan ini akan mengembalikan pointer ke file yang baru saja dibuka.
Aku melihat beberapa Anda Orang-orang di jam kantor.
>> Tapi salah satu hal adalah pointer remember--
dapat beberapa alamat atau null, kan?
Jika kita pernah memiliki kasus di mana sesuatu dapat kembali null,
apa yang harus kita lakukan sebelum kita pernah menggunakannya?
Kita perlu memeriksa apakah itu batal atau tidak, kan?
Karena beberapa dari Anda mungkin telah memiliki masalah di mana objek apapun
sedang dikembalikan dalam pelarian itu batal.
Anda mencoba untuk melakukan beberapa fungsi di atasnya.
Dan situs komputer Anda menyalahkan.
Benar?
Aku yakin beberapa Anda mungkin memiliki masalah itu.
>> Jadi dengan fopen, fopen akan baik kembali pointer ke file tersebut,
atau jika sesuatu yang tidak beres, itu akan kembali null.
Jadi, Anda selalu perlu memeriksa bahwa hal itu tidak kembali nol
sebelum Anda mencoba untuk melakukan hal lain.
Ini seperti paradigma standar bahwa Anda akan butuhkan di sini.
Jika ada pernah kesempatan yang sesuatu bisa kembali null,
periksa untuk memastikan itu tidak sebelum Anda melanjutkan.
Jika tidak, Anda akan untuk mendapatkan kesalahan situs yang indah.
Dan tidak ada yang suka untuk berurusan dengan mereka.
>> Jadi seperti yang kita lihat di sini, argumen pertama hanya path ke file.
Jika berkas yang tidak ada, itu akan membuat file itu.
Dan itu hanya akan menjadi kosong.
Dan kemudian argumen kedua adalah mode yang Anda inginkan.
Apakah kita ingin membaca dari file ini?
Apakah Anda ingin menulis dari itu?
Apakah Anda ingin menambahkan?
Jadi sebenarnya apa yang baru saja saya said-- jika file tidak ada
dan Anda mencoba untuk membaca dari itu, itu akan melempar kesalahan.
Jika file name-- seperti jika file.text belum ada
dan Anda ingin menulis untuk itu, itu akan menciptakan
file kosong bernama file.text untuk Anda.
Dan jika Anda ingin menambahkan, Anda harus melakukan hal yang sama.
Apakah itu masuk akal?
Jika Anda mencoba untuk membaca dari file yang belum ada,
itu akan menimbulkan kesalahan.
Jika tidak, ia akan membuat file untuk Anda melakukan apa yang Anda inginkan untuk itu.
Keren.
Sekarang kita dapat membaca dari file.
Dan ini hanya jenis akan melalui fungsi yang berbeda
yang kita miliki untuk file I / O. Ini akan diperlukan dalam minggu ini pset,
jika saya ingat dengan benar.
Ya, itu benar-benar akan diperlukan dalam minggu ini pset.
Jadi fgetc mengembalikan karakter berikutnya.
fgets hanya mengembalikan baris teks.
Ini akan mengembalikan apapun hingga baris baru, dan akan merusak.
Jadi fread membaca tertentu jumlah byte dan tempat-tempat mereka
ke dalam sebuah array, yang adalah sesuatu yang Anda mungkin
ingin lakukan dengan re-size-- mungkin berguna.
>> Berapa banyak orang yang telah membaca spec pset, by the way?
OK.
[Tidak terdengar]
>> SPEAKER 1: OK.
Baik.
Pasti baca itu-- itu menyenangkan pset.
Anda bisa memulihkan memori dihapus card-- benar-benar menarik ketika bekerja.
Tapi yang pasti, mulai membaca itu.
Datang berbicara dengan saya jika Anda memiliki pertanyaan tentang hal itu.
>> OK, jadi seperti yang saya katakan, fread membaca sejumlah byte.
Itulah beberapa nomor sewenang-wenang bahwa Anda akan mengatur.
Dan kemudian fseek hanya bergerak ke posisi tertentu.
Jadi mungkin Anda tidak peduli tentang 10 bytes berikutnya.
Anda hanya ingin langsung beralih.
Anda tidak peduli tentang orang-orang.
Anda ingin membaca mulai dari byte 11.
fseek memungkinkan Anda untuk melakukan itu.
Sehingga memungkinkan Anda untuk selektif tentang apa yang Anda baca.
Karena fgetc, fgets, dan fread membaca dari tempat tertentu dalam file.
>> Sebuah cara untuk berpikir tentang hal ini adalah jika ini adalah file kita, ketika Anda pertama kali membukanya,
Anda memiliki posisi ini dalam file yang dimulai di awal.
Kapan saja Anda memanggil fgetc, fgetf, atau fread,
itu akan mulai dari penanda posisi ini.
Katakanlah Anda hanya ingin membaca potongan ini memori di sini.
Anda tidak bisa hanya menelepon.
Anda harus mencari di sini dan kemudian membaca dari sana
atau membaca, mendapat, atau getc, tergantung pada apa yang Anda inginkan.
Jadi mencari hanya memungkinkan Anda untuk melewatkan bagian-bagian dari memori.
Dan itulah satu-satunya cara Anda dapat melewatkan hal-hal
tanpa membacanya ke dalam buffer Anda.
Apakah itu masuk akal untuk semua orang?
>> Jelas, ada banyak di sini-paralel
redirection output, atau masukan kami, Anda telah membaca dan menulis.
Jadi fputc hanya menulis karakter ke dalam file.
fputs menulis garis.
Fprintf mencetak output diformat.
Jadi jika Anda memiliki tab, atau ruang, atau entah apa lagi.
Dan kemudian fwrite menulis beberapa array byte ke sebuah file.
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 terus handy-- ini Anda akan memiliki waktu yang berbeda
mana mungkin Anda hanya ingin satu karakter pada satu waktu.
Mungkin Anda ingin seluruh baris.
Dengan pset-- kamus Anda yang dalam dua psets,
Saya percaya, kami memberikan keseluruhan kamus dalam format teks
yang memiliki setiap kata dipisahkan oleh garis.
Jadi jika Anda ingin membaca dalam satu kata pada suatu waktu,
apa yang mungkin Anda gunakan jika Anda membaca dan mereka semua dipisahkan pada baris baru,
dan Anda hanya ingin satu kata pada suatu waktu?
>> AUDIENCE: fgets
>> SPEAKER 1: Benar.
Fgets-- karena yang mengembalikan apa pun yang pada satu baris.
Dan jika setiap kata adalah yang baris sendiri, kita dapat menggunakan fgets.
Keren.
Apakah itu masuk akal, semua orang?
Keren?
Ya, kita akan sampai ke bagian yang menyenangkan dengan pointer
segera, di mana Anda bisa melakukan beberapa matematika.
Dan itu akan menjadi besar.
>> Terakhir step-- menutup file Anda.
Dengan begitu banyak hal di sini, salah satu paradigma kami
adalah jika itu dapat kembali null, memeriksa null.
Jika Anda membuka sesuatu, Anda akan lebih baik menutupnya.
OK, jadi Anda tidak dilakukan sampai Anda dilakukan kecuali Anda telah menutupnya.
Jenis seperti itu belum berakhir sampai wanita gemuk bernyanyi.
Itu seperti menutup file Anda.
Seperti dikatakan di sini, hanya untuk mengulangi, selalu
membuka file Anda sebelum Anda membaca atau menulis untuk itu.
Dan selalu menutupnya jika Anda sudah membukanya.
Semua benar?
Keren.
>> Jadi, inilah contoh.
Jadi tiny-- Saya tidak tahu apakah Anda orang dapat melihat bahwa sangat baik.
Kalau saja kita bisa meningkatkan kecerahan entah bagaimana.
Biarkan aku benar-benar melakukan ini jika aku bisa.
OK, kalian tidak bisa benar-benar melihat bahwa sama sekali, bisa Anda?
OK, kita akan melakukan ini, maka.
[Tidak terdengar]
>> Saya menganggap ini adalah jauh lebih baik untuk melihat.
Siapa pun dapat melihat keberadaan saya tikus pergi adalah pertanyaan?
Ah, itu dia is-- apa perjuangan!
>> OK.
Pada dasarnya, kalian harus memiliki jenis dari gagasan tentang apa ini lakukan.
Ini tidak sempurna.
Tapi aku lebih suka menjelaskannya daripada menghabiskan lebih banyak waktu mencoba untuk memformat dengan benar.
Pada dasarnya, seperti yang Anda lihat di sini, kita mulai dengan file yang terbuka.
Dan kami memiliki beberapa file database yang kita
membuka yang mengatakan itu siswa kami.
Dan kita akan menulis untuk itu.
Jadi tentu saja, kembali null.
Jadi kita harus memeriksa null.
Dan kemudian jika tidak null, kita pergi melalui.
Dan seperti yang Anda lihat, kami perulangan melalui sini.
Ada siswa.
Siswa adalah hash didefinisikan sebagai tiga.
Dan apa yang kita lakukan adalah kita mencetak ke file, kan?
Jadi apa yang kita mencetak ke file kita?
>> AUDIENCE: Skor yang dalam array?
>> SPEAKER 1: Ya.
Skor yang berada di yang array-- persis.
Jadi kami membuka ini file database, yang
Saya berasumsi adalah semacam database nilai.
Dan kami hanya mencetak keluar skor setiap siswa untuk file itu.
Keren?
Baik.
Mengagumkan.
OK.
Mari kita kembali to--
>> AUDIENCE: Saya punya pertanyaan singkat.
Adalah printf tidak dalam untuk loop?
Itu hanya dalam jika lingkaran?
SPEAKER 1: Tidak, itu di loop.
Aku tidak bisa melihat mouse saya sangat baik di sini.
Jadi aku berjuang untuk format yang benar.
Braket ini harus pergi.
Ini harus turun di sini.
Ini adalah apa yang ada di Anda untuk loop.
Ada.
Sekarang itu cukup.
Jadi itulah bagaimana seharusnya be-- kecuali untuk itu braket terakhir yang saya diberhentikan.
OK.
Apakah itu masuk akal untuk semua orang?
OK.
Kita akan melanjutkan ke hal berikutnya then--
yang, sebenarnya, Anda akan untuk perlu melihat kode.
Jadi aku hanya akan copy bahwa lebih dari sekarang.
OK.
Jadi aku akan menunjukkan kepada kalian kode ini.
Dan saya ingin Anda untuk mencoba dan angka apa yang seharusnya dilakukan.
>> Jadi diberikan itu-- mengambil satu menit atau lebih.
Mencoba dan mencari tahu apa yang terjadi di sini.
>> Ada gagasan?
>> Kita tahu bahwa kita memiliki setidaknya dua argumen pada command line, kan?
Saya berasumsi salah satunya akan menjadi bahwa [tak terdengar] dari program kami adalah
dan kemudian sesuatu yang lain.
Karena jika [tidak terdengar] kurang dari dua, kita berteriak pada mereka.
Benar?
Dan dari penggunaan, sepertinya itu akan menjadi semacam file.
Kita semua setuju untuk itu?
Jadi sekarang, apa loop lakukan?
Apa yang akan melalui?
>> AUDIENCE: Semua file.
SPEAKER 1: Tepat.
Ini akan melalui semua file yang kita sudah masukan sana.
Jadi untuk setiap file, itu membuka beberapa string di sana.
Ini membuka file tersebut.
Benar?
Dan itu membaca dari itu.
Tentu saja, memeriksa apakah itu null.
Dan kemudian itu mencetak.
Jika itu nol, itu hanya memberitahu kita bahwa itu bukan file yang ada.
Karena ingat, dengan membaca file kita harus ada.
Benar?
Dengan menulis dan append, Anda bisa lolos dengan itu.
Tapi dengan membaca, file kita harus ada.
>> Dan kemudian jika itu tidak ada, apa yang kita lakukan di sini?
Mari kita mulai di sini.
Apa ini do-- karakter pertama ini.
Apa yang ia kerjakan?
Dia mendapat satu karakter, kan?
Jadi apa ini lakukan?
Sudah mulai karakter pertama.
Ada yang tahu EOF?
>> AUDIENCE: Akhir file?
>> SPEAKER 1: Akhir file-- persis.
Jadi itu akan pergi melalui seluruh file, kan?
Dan kemudian itu akan memperbarui dengan mendapatkan setiap karakter berikutnya.
Benar?
Dan apa yang ia lakukan?
AUDIENCE: Puting yang in--
>> SPEAKER 1: putchar cetakan untuk screensaver Anda.
[Tak terdengar] karakter.
Dan kemudian ketika [tidak terdengar] ini akan menutup file.
>> AUDIENCE: Apakah Anda tidak perlu [? lain? ?]
>> SPEAKER 1: Belum tentu.
Maksudku, itu semacam tersirat dalam hal ini.
Karena ini kembali, meskipun, selama karena hal ini tidak menangkap ini, kau baik-baik saja.
Maksudku itu mungkin baik berlatih untuk melakukan yang lain.
Tapi yang lain tidak selalu diperlukan terutama
jika Anda memiliki sesuatu seperti kembali, yang
berarti bahwa dalam kasus ini jika menangkap itu, program anda akan berakhir
dan itu tidak akan pernah mendapatkan ini.
Ini lebih untuk kasus di mana Anda belum tentu kembali sesuatu.
Karena jika ini tidak kembali apa-apa,
itu berarti bahwa jika ini benar, sisa ini masih akan berjalan.
Dan dalam hal ini, Anda ingin palsu.
Jika itu kembali, dan akhir program anda,
else tidak perlu semua waktu, tergantung pada konteks.
Jacob, apakah Anda memiliki pertanyaan?
AUDIENCE: Ya.
Begitu juga fgetc mendapatkan karakter berikutnya?
Bagaimana karakter meningkat?
SPEAKER 1: Ya.
Jadi fgetc mendapatkan karakter berikutnya.
Anda dapat menganggap itu seperti C ++ dalam arti.
>> AUDIENCE: Jadi apa EOF?
>> SPEAKER 1: EOF adalah akhir file.
Ini hanya penanda yang memungkinkan Anda tahu bahwa Anda berada di akhir file Anda.
Jadi ini akan mencetak untuk standar Anda keluar.
Dan kemudian itu akan menutup file bila dilakukan.
Dan kemudian mari kita pergi ke file berikutnya, kan?
Jadi secara keseluruhan, apa program ini lakukan?
>> [Tidak terdengar]
>> SPEAKER 1: Ya.
Itu hanya mencetak segala sesuatu di sana.
Jadi, jika kalian pernah menggunakan CAT dan kemudian nama beberapa file--
Saya tidak tahu apakah ada di antara kalian memiliki pernah melakukan itu pada terminal anda.
Tetapi jika Anda pernah menggunakan perintah CAT-- C-A-T--
dan maka file apapun Anda memiliki besar-- itu
mencetaknya ke terminal Anda, yang bisa menjadi super berguna untuk beberapa hal.
Saya menggunakannya banyak.
Apakah itu masuk akal untuk semua orang?
Keren?
>> OK jadi tugas Anda sekarang-- baik dengan sendiri atau dengan orang-orang di sekitar you--
adalah dengan hanya menulis sebuah program sederhana yang hanya akan menulis "Hello, world!"
keluar ke sebuah file.
>> [Tidak terdengar]
>> SPEAKER 1: Aku seperti, melakukan Saya melakukan itu minggu lalu buruk?
Saya tidak berpikir itu yang buruk.
Aku senang kalian semua di sini.
Itu benar-benar membuat saya senang.
Saya seorang gadis dari kesenangan sederhana.
Saya sama seperti ketika bagian saya menghadiri.
Jadi aku hanya mendapatkan ini dimulai untuk kalian sehingga kita dapat kode bersama-sama.
Aku tidak suka menempatkan siapa pun di tempat kecuali jika Anda ingin menjadi.
>> AUDIENCE: Untuk kuis, lakukan kita harus menulis sebuah program?
>> SPEAKER 1: Anda mungkin diminta untuk menulis program sederhana dengan tangan.
Yup.
>> AUDIENCE: kuis ini minggu depan, kan?
>> SPEAKER 1: kuis ini Rabu depan.
Itu berarti ada [yang indah? CSE?] kadar partai setelah itu, yang
berarti Anda akan mendapatkan skor Anda kembali yang malam-jam berapa?
Siapa yang tahu?
Tapi itu akan menjadi malam itu.
>> Baik.
Bagaimana kita ingin memulai ini?
Saya akan memberi Anda mulai hint-- dengan ini.
>> AUDIENCE: Anda harus membuka file.
>> SPEAKER 1: Ya.
Jadi apa yang Anda ingin menyebutnya ini?
Apakah Anda hanya ingin menyebutnya "file"?
Mari kita membuatnya mudah.
Jadi fopen-- apa kami Uji keluaran akan menjadi?
Sebut saja "Halo."
Dan apa modus kita?
Apa yang kita lakukan untuk file ini?
>> AUDIENCE: Baca.
Menulis.
SPEAKER 1: Kami menulis untuk itu.
Indah.
OK, jadi kita memiliki file ini sekarang.
Apa yang perlu kita lakukan?
AUDIENCE: Periksa apakah itu null.
SPEAKER 1: Periksa apakah itu null-- persis.
Itulah yang saya ingin mendengar.
Yang harus otomatis, khususnya cukup banyak dari titik ini.
Jika Anda mulai segfault, Anda mungkin tidak memeriksa null suatu tempat.
Sembilan kali dari sepuluh, itu akan menjadi kesalahan Anda.
Jadi jika Anda hanya bisa mendapatkan di kebiasaan, selalu memeriksa apakah itu null,
hidup Anda akan menjadi bagus dan easy-- atau lebih mudah.
>> Jadi memeriksa untuk melihat apakah itu null.
Jadi jika tidak nol, yang adalah apa yang sama dengan bang
means-- tidak null-- itu valid.
Apa yang ingin kita lakukan?
Kami hanya ingin mencetak ke file itu, kan?
Jadi apa yang akan kita gunakan?
>> AUDIENCE: fprintf
>> SPEAKER 1: Fprintf-- indah.
Dan fprintf mengambil dua arguments-- mana itu akan dan apa yang kita inginkan dicetak.
Jadi apa yang pertama?
Mana itu akan pergi?
>> AUDIENCE: Berkas.
>> SPEAKER 1: Ini akan mengajukan.
Dan apa yang kita inginkan dicetak?
"Hello, world!"
Baik.
Kami memiliki satu thing-- terakhir paradigma lain besar di sini.
AUDIENCE: Tutup.
SPEAKER 1: Tutup.
Di sana Anda pergi.
>> AUDIENCE: Apakah ini terjadi jika file tersebut nol?
SPEAKER 1: Tidak, ini jika tidak null.
AUDIENCE: Oh, kalau itu not-- OK.
Untuk fopen dan kemudian dua argumen yang masuk ke dalam,
apa artinya argumen pertama lagi?
>> SPEAKER 1: Argumennya adalah seperti nama file
bahwa Anda ingin pergi ke.
Jadi setelah ini berjalan, Anda akan memiliki beberapa file bernama "halo"
yang memiliki "Halo, dunia" di dalamnya.
Itu saja.
Hanya nama.
>> AUDIENCE: Dan karena itu menulis, yang file tidak harus sudah ada.
Apakah itu yang Anda katakan?
>> SPEAKER 1: Benar.
Tepat.
Jika "Hello" sebagai file belum ada, itu
akan membuat file bernama Halo "dan menulis untuk itu untuk Anda.
>> AUDIENCE: Ketika Anda mengatakan program untuk menulis ke file tersebut,
mengapa Anda menulis "file" bukan nama file dan fprintf--
>> SPEAKER 1: Karena dalam kasus ini, kita memiliki yang FILE-- besar semua dalam bintang caps--,
mengajukan.
Jadi itu adalah pointer ke file bahwa Anda sedang berbicara tentang.
Ini adalah cara yang kami hanya menyebutnya.
Jadi dalam hal ini, Anda bisa memikirkan aha file--,
kita dapat menggunakan file this-- sini mengacu pada pembukaan "Hello"
dan membiarkannya menulis.
>> AUDIENCE: Bisakah kita menempatkan "Hello" bukan [? hanya?] f berkas?
SPEAKER 1: Tidak, karena "Hello" harus terbuka dan ditulisi.
Berkas sini adalah seperti designator yang mengatakan OK, kita
memiliki hello-- file-- ini bahwa kita sedang melihat.
Telah dibuka.
Dan kita akan menulis untuk itu.
Jika Anda hanya menggunakan "Hello", yang dikemas di dalamnya.
Jadi itu akan panik.
Maksudku, kau bisa menamakannya.
Anda bisa melakukan berkas, bintang, "Hello", sama dengan itu.
Tapi seluruh titik adalah bahwa Anda membutuhkan bintang pointer file agar
untuk dapat menggunakan fungsi-fungsi ini.
AUDIENCE: Bisakah Anda lakukan File, bintang, berkas, "Hello"
atau apakah Anda harus meletakkan mengajukan bintang, berkas dengan itu?
SPEAKER 1: Anda bisa melakukan berkas, bintang, "Halo."
Anda dapat mengubahnya ke Nama apapun yang Anda inginkan.
Ini benar-benar sewenang-wenang apa nama yang.
Anda dapat nama itu apa pun.
Nama itu terbang spaghetti, jika Anda ingin.
>> AUDIENCE: Apakah "w" dalam tanda kutip untuk?
>> SPEAKER 1: The "w" hanya mode.
Jadi kita sedang menulis ke file ini.
Semua orang baik?
Jelas?
Ya.
>> AUDIENCE: Jadi ketika menulis ini file, di mana kita kemudian mencari file itu?
>> SPEAKER 1: Ini akan berada di sama direktori yang saat ini Anda masuk.
Jika Anda berada di pset tiga dan Anda menjalankan ini, dalam pset Anda
tiga folder akan menjadi file ini disebut "Hello."
Keren?
Semua orang baik?
Saya merasa seperti kalian semua mendapatkan itu, yang sangat bagus.
OK.
Jadi kembali ke show-- geser saya Aku cinta ketika sesuatu bekerja.
OK, pointers-- Apakah kalian bersemangat?
Pointer yang besar.
Mereka mengambil sedikit untuk membungkus kepala Anda sekitar.
Ini adalah tahun kedua saya mengajar pointer.
Dan saya pikir saya akhirnya mendapatkannya.
Jadi jika Anda berjuang, tidak apa-apa.
Seperti yang saya katakan sebelumnya, gambar gambar banyak membantu dengan hal-hal di CS,
sebanyak saya pikir orang cenderung berpikir oh, kami tidak di depan komputer.
Kita harus hanya kode.
Gambar gambar No-- akan sangat membantu Anda.
Dan aku benar-benar mendorong Anda untuk memasuki sisi TK Anda
dan membawa keluar krayon atau spidol dan menggambar.
Karena itu akan membantu Anda.
Dan jika Anda melihat saya di jam kantor, saya akan membawa sekitar tumpukan kertas-kertas
dengan pena menggambar hal-hal yang keluar.
>> Jadi terutama dengan pointers-- menggambar.
Dan saya yakin kita benar-benar akan menjadi menggambar beberapa gambar di sini juga.
>> Jadi kalian semua harus melihat Binky, ini hal claymation keren.
Dan kami pikir itu benar-benar lucu ketika ia meledak menjadi sekelompok potongan.
Ini beberapa bantuan komik untuk kelas.
C [tak terdengar] kemampuan besar ini untuk dapat mengendalikan memori.
Dan itu salah satu hal yang benar-benar membuatnya seperti bahasa yang kuat.
Tapi dengan kekuatan besar datang tanggung jawab yang besar.
Dan hal-hal gila bisa terjadi jika Anda tidak hati-hati.
Jadi, ketika Anda menggunakan pointer, Anda ingin membuat
Pastikan Anda benar-benar mengerti persis apa yang Anda lakukan.
Mudah-mudahan sedikit berikutnya waktu akan membantu Anda benar-benar memahami
pointer, bagaimana menggunakannya, dan bagaimana untuk memanipulasi mereka.
>> Jadi memory-- Saya yakin kita sudah melihat diagram ini sebelumnya.
Jadi ini hanyalah sebuah diagram sederhana bagaimana hal-hal mungkin disimpan memori.
Jadi pada dasarnya anda memiliki ini array besar blok satu byte
adalah apa yang kita miliki di sini-sedikit bertahap per satu setiap kali.
Hal ini hex [tidak terdengar] jadi delapan-bit blok.
Dan setiap blok dikaitkan dengan beberapa alamat heksadesimal.
Jadi, jika Anda pernah melihat 0x, itu hanya notating
bahwa itu adalah alamat heksadesimal.
Anda dapat menganggap ini berarti beberapa alamat dalam memori.
Kita bicara tentang alamat memori setiap kali Anda melihat heksadesimal.
>> Kami memiliki int adalah variabel, mengapung adalah variabel yang menyimpan.
Jadi int toko int.
Mengapung toko mengapung.
Jadi kami juga memiliki pointer bahwa alamat memori toko.
Itu semacam pemetaan.
Pointer secara eksklusif untuk alamat memori.
Jadi itu seperti jenis Anda di sana.
Alat Anda adalah 32-bit, yang berarti alamat memori Anda empat byte.
Jadi pointer yang Anda miliki juga akan menjadi empat byte.
Atau jika empat byte, memori empat byte.
Pointer memori toko.
Oleh karena itu, mereka empat byte.
Cool-- hanya ingin memperkuat itu.
>> Anda harus mendapatkan komik ini sekarang.
Saya tidak tahu berapa banyak dari Anda adalah penggemar xkcd, tapi aku cinta xkcd.
Ini bagus.
>> Baik.
Jadi menciptakan pointers-- seperti yang saya katakan, itu cukup banyak hanya seperti apa pun.
Anda memiliki tipe.
Anda punya nama.
Benar?
Itulah apa yang kita miliki di sana. [? Hex?] Bintang berarti itu pointer,
dan kemudian apa pun yang Anda ingin menyebutnya.
Jadi Jenis mewakili apa yang dapat Anda simpan.
Semua benar?
Dengan cara yang sama bahwa jika kita melakukan int, kita tahu kita menyimpan int sana.
Dengan pointer, itu menyimpan alamat memori.
Tapi apa artinya adalah itu-- di sinilah gambar akan berguna.
Jadi dalam hal ini, kita harus beberapa value-- katakanlah empat.
Empat di satu alamat.
OK?
>> Pertama ini di sini berarti bahwa itu adalah 2x pointer.
Benar?
Ini beberapa pointer x.
x mungkin sesuatu, apa pun.
Apapun x is-- mengatakan x adalah empat.
Ini akan menyimpan alamat memori di sini.
Jadi int, bintang, x-- ini beberapa slot lain di memory--
siapa yang tahu apa ini.
Tapi itu akan menyimpan alamat di sini.
Jadi ini akan menjadi like-- dalam hal ini, Apapun,
disimpan di 0x1-- apa pun yang disimpan di alamat yang pointer kami memegang,
harus sesuai dengan apa yang telah kita ditunjuk.
Jadi pada 0x1, dalam hal ini, ini adalah x.
Ini hanya bisa pernah menjadi int sementara kita menggunakan ini.
>> Demikian pula, jika kita memiliki 1thn lain, apa pun
alamat disimpan dengan y memiliki menjadi hal yang sama char-- dengan z.
Dengan cara yang sama, setiap kali Anda mencoba dan melakukan INTx sama 0.4,
itu akan berteriak pada Anda dan menjadi seperti tidak, kau bilang kau ingin int.
Hal ini seharusnya menjadi int.
Berhentilah mencoba untuk membuatnya pelampung.
>> Jadi membiarkan hal-hal menjadi apa yang mereka inginkan.
Membiarkan hal-hal menjadi diri mereka sendiri.
Jadi hal besar hanya apa pun jenis pointer
itu, itulah satu-satunya hal yang dapat Anda simpan di sini.
OK?
Dengan latihan, seperti dengan minggu lalu, semuanya
tampaknya benar-benar jenis abstrak.
Kami akan melakukan beberapa latihan.
Ini harus lebih masuk akal.
>> Jadi referensi dan dereferencing-- itu benar-benar penting untuk mendapatkan ini lurus.
Saya masih harus me-refresh setiap sekarang dan kemudian.
Dan aku seperti menunggu, mana yang saya inginkan?
Jadi ampersand benar-benar akan memberikan Anda referensi atau alamat.
Jadi mengembalikan alamat di memori yang variabel disimpan.
Jadi itu akan benar-benar kembali kepada Anda heksadesimal, sedangkan dereferencing itu
sebenarnya akan memberi Anda data yang disimpan di sana.
OK?
Jadi kita akan lihat sebuah contoh sangat cepat, atau benar-benar di samping.
>> OK.
Jadi kita harus berpikir benar-benar hati-hati tentang hal ini.
Jadi di sini kita memiliki beberapa bilangan bulat x.
Aku akan mencoba dan menarik ini keluar untuk yang terbaik dari kemampuan saya.
Jadi kita akan memiliki celah ini x.
Dan itu menyimpan lima.
Alamat adalah 0x4.
Keren?
Semua baik.
>> Jadi sekarang kita memiliki pointer ini.
Itu di sini.
Dan ampersand memberi kita alamat sesuatu.
Jadi, dalam hal ini, itu adalah alamat x.
Apa alamat x?
04-- dan pointer ini pada 0x08.
Keren?
Sehingga Anda dapat berpikir tentang hal ini pointer, 04, hanya poin di sini.
Dan mereka disebut pointer karena seperti yang kita dapatkan lebih ke ini,
Anda akan melihat menunjuk ke hal.
Dan satu blok menunjuk ke yang lain blok akan membuat banyak lebih masuk akal.
Jadi di sini adalah dua.
Dan kemudian kita memiliki beberapa copy, yang merupakan 0x0c-UMPC.
Dan itu akan dereference pointer kita.
>> Jadi apa itu katakan adalah OK, inilah pointer kita.
Nilai itu toko adalah 0x04, Dan apa itu mengatakan adalah pergi ke alamat ini
dan ceritakan apa yang ada di dalamnya.
Jadi itu efektif apa panah ini lakukan.
Anda dapat menganggap 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 potongan memori ini.
Dan memberi kita apa yang ada di dalamnya, yaitu 5.
Itu sebabnya kami salinan adalah sama dengan 5.
Apakah itu masuk akal?
Apakah ada yang perlu saya untuk pergi melalui itu lagi, atau lebih lambat?
Kau ingin aku pergi melalui itu sekali lagi?
OK.
Kita akan redraw lagi.
Ketika kita mulai, kita semua setuju kita harus beberapa sepotong memori yang variabel
x yang kita tetapkan sebesar 5.
Kami tidak mengontrol mana itu dalam memori.
Jadi tempat ini hanya sewenang-wenang ditetapkan.
Baik di sana?
OK.
Kemudian kita menginisialisasi pointer ke int.
Itulah mengapa hal itu diperbolehkan untuk menunjuk ke x karena kita memiliki int di sini.
Kami memiliki potongan lain memori karena pointer ini
adalah variabel sama seperti hal lain.
Ini sewenang-wenang ditetapkan beberapa ruang di memori.
Dan apa yang menyimpan adalah alamat x.
Ampersand berarti alamat x.
Jadi apa adalah alamat dari x?
>> AUDIENCE: Ini zero--
SPEAKER 1: 0x04.
Jadi then-- terakhir.
Kami memiliki beberapa copy-- lagi hanya variabel lain.
Jadi mari kita menetapkan beberapa tempat sewenang-wenang.
Dan kami dereference pointer kita.
Bintang ini berarti pergi ke alamat disimpan dalam pointer saya.
Katakan padaku apa yang ada.
Jadi alamat disimpan di pointer kita adalah 0x04.
Jadi kami pergi ke alamat tersebut.
Ini menunjuk ke alamat tersebut.
Apa yang ada didalam blok memori ini?
Itu adalah lima.
Jadi itulah yang kita berikan salinan kami.
Semua orang baik?
Keren.
Gambar Again--.
>> Jadi melacak nilai-nilai di sini-aku akan membiarkan kalian berpikir tentang hal ini.
Kita dapat menarik gambar lain.
Tapi aku ingin kau untuk mencoba dan alasan melalui ini sendiri selama satu menit.
>> Karena mereka tidak memberikan kami alamat contoh,
Aku hanya akan melakukan x-- ampersand yang seharusnya membantu mendorong rumah.
Ampersand berarti alamat.
>> Jadi dalam yang pertama, semua orang pergi dengan baris pertama.
Beberapa x set ini five-- beberapa Slot acak dalam memori.
Pointer bintang Int sama ke alamat x, kan?
Int bintang pointer menciptakan blok ini, menyebutnya pointer,
dan memberikan ke alamat x.
Aku mengerikan di ampersands.
>> Sekarang apa yang kita lakukan adalah kita katakan OK, dereference pointer kita.
Jadi kita 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 dasarnya, ketika Anda dereferencing, Anda pergi OK.
Anda akan menggambar gambar seperti ini.
Anda akan menggambar panah Anda lebih di mana itu.
Jadi pergi ke celah ini dalam memori dan baik beri aku nilai kembali, atau mengubahnya.
Dalam hal ini, karena kita ini nilai, kita menetapkan untuk menjadi 35.
Sedangkan di yang terakhir satu, jika Anda perhatikan, kita
yang menetapkan apa yang di sini untuk sesuatu yang lain.
>> Sehingga mereka memiliki tabel ini mengagumkan.
Ini bukan yang buruk.
Kalian bekerja di dalamnya.
Aku akan menariknya keluar di papan tulis.
Kita akan mengisinya bersama-sama, OK?
Jadi ambil beberapa kertas, ambil pasangan, mulai bekerja.
Aku akan mendapatkan potongan yang lebih besar dari kapur.
Karena itu akan menjadi banyak.
OK.
PROFESOR: OK.
Mari kita mulai dengan baris pertama.
Kami akan mulai dari sana, maka kalian mungkin dapat bekerja melalui beberapa lagi.
OK.
a sama dengan b kali c jadi apa adalah?
Ini bukan pertanyaan jebakan, aku janji.
>> SISWA: 4 kali 5.
>> PROFESOR: 4 kali 5.
20.
Jadi apa b?
SISWA: 4.
>> PROFESOR: Dan c?
SISWA: 5.
PROFESOR: 5.
Dan maka ini hanya akan akan ampersand sebuah ampersand, b,
ampersand c, kan?
Tidak buruk.
Itu cukup sederhana.
OK.
Jadi yang berikutnya.
A sama dengan kali c, dalam hal orang tidak terbiasa dengan itu.
Apakah semua orang akrab dengan waktu sama?
OK, semua ini means-- ini singkatan untuk sama kali c.
Anda juga dapat melakukannya dengan pembagian, dengan penambahan, pengurangan dengan.
Anda dapat melakukan equals, atau plus sama c berarti sama dengan plus c, minus sama
c akan menjadi sama dengan minus c.
Ini hanya sintaksis gula.
>> Jadi, dalam hal ini, adalah sama dengan kali c akan memberi kita apa?
Sekali lagi, bukan pertanyaan jebakan.
>> SISWA: 100.
>> PROFESOR: 100.
Apakah hal lain berubah?
Nomor
Mungkin aku akhirnya akan mendapatkan lebih baik di ampersands saya.
>> SISWA: OK, maaf, bagaimana kau bisa 100?
PROFESOR: OK.
Jadi adalah sama dengan kali c, jadi kali c.
SISWA: Oh, Anda menggunakan untuk previous-- yang
PROFESOR: Ya.
Jadi ini adalah nilai-nilai kita terbaru.
Ini adalah apa yang seharusnya Anda menggunakan seperti yang kita bergerak ke bawah, OK.
Jadi, b adalah satu-satunya hal yang berubah, kan?
Jadi mari kita mengisi segala sesuatu yang lain.
B. Apa yang b akan menjadi?
Untuk menjadi atau tidak menjadi.
Jadi apa ini lakukan?
Apa adalah bintang pa lakukan?
>> SISWA: Kode ke lokasi pa.
>> SISWA: Tidak, tidak cukup.
Jadi ini adalah referensi d.
>> SISWA: Jadi b adalah nilai tangan dari pa.
>> PROFESOR: Ya, jadi pa adalah alamat, kan?
Jadi itu mengatakan pergi ke tempat adalah disimpan dan memberikan nilai tersebut.
Jadi apa b?
SISWA: 100.
PROFESOR: 100.
Sempurna.
OK, jadi pc apa yang berubah.
Segala sesuatu yang lain tetap sama.
Apa yang pc akan menjadi?
Tugas sederhana.
Pc sama dengan pa, dan apa yang pa?
>> STUDENT: ampersand a.
PROFESOR: Perfect.
Sekarang kita semakin menarik.
OK, mari kita istirahat satu ini turun.
Pertama, apa b kali c, karena itulah bagian yang mudah dari satu ini, kan?
B kali c is--
>> SISWA: 500.
>> PROFESOR: Ya, jadi apa yang satu ini lakukan,
jika itu bintang pb, apa yang berubah?
>> SISWA: Apa yang ada di the--
PROFESOR: Apa yang ada di b?
SISWA: Apa yang ada di ruang pb yang menunjuk ke.
PROFESOR: Dan pb menunjuk to--
SISWA: B.
PROFESOR: B. Jadi satu-satunya hal perubahan adalah b, benar.
Jadi b kali c, 500.
Jadi itulah yang berubah sekarang.
Keren.
Indah.
Kalian lakukan besar.
Baiklah, melanggar satu ke bawah ini.
C berubah, kan?
Jadi kita bisa mengisi segala sesuatu yang lain.
Mari kita lihat.
OK.
Kita tahu bahwa c akan menjadi produk dari dua angka, kan?
Apa dua angka, meskipun?
>> STUDENT: A dan c?
>> PROFESOR: Jadi adalah tepat untuk yang pertama.
Jadi kita d referensi p dari, kan?
P dari poin ke, jadi kita tahu bahwa ini akan menjadi 100 kali apa?
Kali apa titik pc ke?
Menunjuk ke sebuah.
Jadi 100 kali 100 adalah 10.000.
Apakah itu masuk akal?
Keren.
Rumah peregangan, guys, baris terakhir.
OK.
Apa yang berubah di sini?
>> STUDENT: A.
PROFESOR: A. sempurna, sehingga segala sesuatu yang lain bisa tetap sama.
OK.
Dan apa itu?
Jadi itu adalah kali apa?
Ini adalah bintang pb.
Jadi Bintang pb berarti inilah pb, pb poin untuk b.
>> SISWA: 500.
>> PROFESOR: 500.
Jadi kita memiliki 500 kali 100.
Itu 50.000.
Wah!
Lihat itu.
>> SISWA: Mengapa kita harus yang & c untuk last--
PROFESOR: Maaf.
SISWA: Oh, OK.
PROFESOR: Saya buruk.
Banyak tulisan.
Semua orang baik?
Tidak terlalu buruk, kan?
Hanya membutuhkan sedikit sementara untuk bekerja melalui.
Jika Anda jatuhkan itu, memahami apa setiap bagian
adalah mengacu to-- sebagai dengan segala sesuatu itu,
yes-- memecahnya ke sedikit masalah dan kemudian bergabung kembali,
dan Anda dapat melakukan beberapa hal yang mengagumkan.
Ada jawaban, tapi kami melakukan itu.
Aritmetik pointer.
Ah.
Tanganku semua berkapur.
Jadi menambah atau mengurangi int menyesuaikan pointer
dengan ukuran jenis pointer.
Ingat bagaimana setiap jenis memiliki ukuran yang berbeda?
Jadi seperti ganda atau lama yaitu delapan dan int adalah empat tetapi arang adalah salah satu.
>> Jadi apa yang Anda ingin lakukan is-- satu hal yang perlu diingat
Hanya saja berapa banyak Anda nilai pointer benar-benar mengubah
akan tergantung pada jenis pointer itu.
Semua orang baik dengan ini?
Dapatkah saya menghapusnya?
Kita baik?
Mengagumkan.
>> Jadi jika kita memiliki beberapa pointer itu-- ini akan be-- aku
akan menjadikannya sebuah pointer int.
Ini menyimpan ini.
Jika Anda mengatakan pointer plus satu, apa itu akan dilakukan
adalah itu akan memperbarui dengan ukuran sebuah int
karena itulah jenis pointer itu.
>> Dengan C, semuanya sangat ketat dan diatur.
Int pointer akan memperbarui dengan jumlah ruang int akan mengambil.
Int adalah empat byte.
>> Jadi apa yang akan ini berubah menjadi?
Anda hanya menambahkan empat ke ini.
Sekarang pointer Anda akan be-- OK.
>> Jadi, jika itu adalah char dan kami melakukan pointer plus satu, apakah itu sekarang?
Jika started-- berpura-pura kita started-- sekarang ini 0x08.
Mari kita sekarang mengatakan bahwa ini adalah char di pointer, dan kami menambahkan satu.
Apa yang akan berubah menjadi?
Berapa banyak byte char?
>> AUDIENCE: Satu.
>> SPEAKER 1: Satu.
AUDIENCE: Jadi 0x09.
SPEAKER 1: Jadi akan sembilan.
Jadi hanya sesuatu untuk mengingat.
Hanya ketika Anda menambahkan satu, itu tidak menambahkan satu kecuali jika char.
Ini menambahkan berapa banyak byte tipe yang itu,
itulah sebabnya mengapa kita memiliki persamaan ini di sini.
Jadi itu kali int ukuran dari jenis pointer.
>> Jadi kita memiliki contoh di sini.
y ditugaskan untuk itu nilai, 0x4, ketika kita melakukan y ditambah sama dengan satu.
Apa untungnya, apa di x, tidak berubah.
Apa perubahan adalah apa yang ada di y.
Alamat disimpan dalam y diperbarui oleh empat karena ada empat byte dalam sebuah int
dan ini merupakan pointer int.
>> Baik.
Jadi sekarang kita punya latihan lain.
Jadi pertanyaannya adalah apa yang akan dicetak.
Ada gagasan?
>> AUDIENCE: Jumlah karakter dalam bahagia kucing?
SPEAKER 1: Tepat.
Jadi suka dengan string Anda.
Apakah setiap orang mendapatkan itu?
Apakah kita ingin berjalan melalui itu?
>> Ya, OK.
Jadi apa yang kita miliki di sini-saya seperti ini jauh lebih banyak.
Saya tidak perlu [Tak terdengar] ridiculously.
>> Jadi kita memiliki string kita di sini, senang kucing.
Indah.
Kami memiliki beberapa counter yang kita melacak.
Jadi kita memiliki beberapa char * pointer yang hanya diatur sama dengan str.
Apa ini lakukan adalah itu menugaskan beberapa pointer
ke awal string Anda.
Karena aku yakin, karena disebutkan dalam kuliah,
kami telah memberikan kalian ini tipe data disebut string.
>> Tapi benar-benar string hanya array of-- seperti char *.
Itu adalah pointer ke sekelompok karakter yang berdekatan dalam memori.
Jadi ini hanya menetapkan itu sama dengan string apapun
diidentifikasi oleh mana karakter pertama adalah.
Jadi ini hanya menetapkan beberapa titik sama dengan awal string.
Semua orang baik di sana?
Keren.
>> Jadi ini adalah dereferencing pointer kita.
Jadi itu benar-benar akan memberi kita beberapa nilai dalam sini,
dalam string kita bahwa kita sedang berbicara tentang.
Dan kami katakan selama itu bukan null terminator.
Jadi terus berjalan sampai Anda mendapatkan sampai akhir string.
Memperbarui pointer Anda dengan satu.
Jadi r, itu benar-benar akan memperbarui per satu setiap kali karena ini adalah char,
char *.
>> Jadi itu akan pergi melalui.
Ini akan memperbarui.
Jadi pertama kali ini berjalan, itu akan berada di sini di h.
Ini akan memperbarui.
>> Ini akan menjadi a.
Ini akan menjadi p, y, dan seterusnya dan sebagainya.
Kami akan memperbarui counter.
Saat mencapai akhirnya, hanya mencetak seberapa jauh itu mendapat.
Ya.
>> AUDIENCE: Jadi itu penting ruang sebagai salah satu, kan?
OK.
>> SPEAKER 1: Pikirkan begitu.
Apakah itu question-- sebuah
>> AUDIENCE: [tak terdengar].
>> SPEAKER 1: Jangan khawatir.
Ini saya melakukan itu.
Baiklah, jadi salah satu hal yang saya pahami adalah bahwa dengan array,
Anda juga dapat memperlakukannya sebagai pointer karena array hanya
bintik-bintik terus menerus memori.
>> Sehingga Anda dapat mengobatinya dengan cara yang sama.
Anda dapat memanipulasi mereka dengan pointer, juga.
Jadi, bukannya melakukan, dalam hal ini kasus, hal analog
akan Array 0 sama dengan 1.
>> Tapi dengan cara yang sama yang string ditentukan
oleh awal di mana karakter pertama adalah,
array ditentukan oleh dimana elemen pertama adalah.
Karena kita tahu, kami tidak dijamin, bahwa
akan terus menerus blok memori.
Itulah yang memungkinkan kita untuk melakukan hal ini.
Kami tahu mereka terus menerus blok memori.
>> Jadi dalam hal ini, berdasarkan dereferencing hanya array, yang memberitahu kita,
OK, pergi ke awal array, yang ada di sini.
Jadi Anda dapat mengaturnya sama dengan satu.
Dan dalam hal ini, apa pun array Jenis adalah, ketika Anda memperbarui dengan satu,
itu hanya seperti memperbarui ke indeks berikutnya.
Anda dapat melakukan itu karena Anda tahu apa yang ada di array Anda.
Sehingga tahu berapa banyak untuk memperbarui pointer Anda dengan,
apa alamat untuk memperbaruinya untuk jadi bahwa Anda berada di slot berikutnya.
>> Jadi ini adalah cara yang berbeda penulisan Array 0 sama dengan 1,
Array 1 sama dengan 2, susunan braket 2 sama 3.
Hanya saja cara lain untuk berpikir tentang hal itu.
Karena mereka terus menerus blok dalam memori,
Anda dapat merujuk kepada mereka baik oleh array notation--
yang saya pribadi menemukan easier-- tapi mungkin
Anda perlu memanipulasi ketat oleh alamat memori.
Dan ini adalah cara Anda melakukan itu.
Jenis lebih dari seperti hal yang keren yang dapat Anda lakukan
dibandingkan mungkin tidak sesuatu yang Anda benar-benar akan diterapkan.
>> Saya menggunakannya di 61.
Kalian mungkin tidak perlu khawatir tentang hal itu terlalu banyak.
Tetapi jika Anda tertarik, mengambil 61 tahun depan.
Kami berada di rumah peregangan guys.
Aku tahu, itu panjang.
Dynamic Memory Allocation-- jadi kita tahu yang satu
hal ketika kita berbicara selama Bagian pertama kami bersama-sama,
kami melihat swap fungsi di mana itu
di luar lingkup fungsi utama kami.
Dan kami lewat di nilai-nilai ini yang efektif salinan.
>> Dan sekali Swap selesai mengeksekusi, itu hanya meninggalkan tumpukan.
Ingat, kita memiliki tumpukan frame untuk swap.
Ia meninggalkan dan mereka nilai meninggalkan dengan itu.
Dan mereka sudah pergi.
Kita tidak bisa melakukan apa-apa dengan mereka dan kami sedih
karena kita tidak dapat swap nilai-nilai kita.
>> Tapi dengan C, seperti yang saya sebutkan, Anda memiliki banyak kekuasaan atas memori.
Jadi apa yang dapat Anda lakukan adalah Anda dapat mengalokasikan hal-hal di heap sini
yang akan tinggal di sana sampai Anda memberitahu mereka sebaliknya.
>> Mereka seperti anak-anak yang baik.
Mereka tinggal di sana.
Mereka tidak meninggalkan.
Mereka akan tinggal di sana sampai Anda seperti, OK, Anda bisa pergi.
>> Sedangkan hal-hal di stack, who-- mereka seperti anak-anak nakal.
Mereka hanya akan lari bila Anda ingin berada di sana dan kemudian mereka pergi.
Anda tidak bisa mendapatkan mereka kembali.
>> Jadi tumpukan is-- kita akan berbicara tentang malloc dan bebas, yang
Saya yakin kalian dengar dalam ceramah.
Dan itu pada dasarnya cara memiliki data yang sangat gigih.
Sehingga Anda dapat menyimpan data sekitar selama Anda inginkan.
Mhm.
>> AUDIENCE: Dapatkah Anda mendefinisikan tumpukan dan tumpukan?
Apakah mereka suka tempat-tempat untuk meletakkan segala sesuatu?
>> SPEAKER 1: Jadi mereka pada dasarnya hanya-- mereka
cara kita merujuk hanya untuk memori.
Jadi tumpukan hanya tempat di mana memori dialokasikan secara dinamis,
sedangkan tumpukan mengacu lebih menumpuk frame
yang lebih sentral ke fungsi yang benar-benar berjalan.
Anda tidak benar-benar memiliki kontrol.
>> Perbedaan besar, Anda memiliki kontrol lebih dari tumpukan jika Anda ingin.
Anda memiliki sedikit kontrol atas stack.
Tumpukan tergantung pada fungsi yang sedang berjalan,
dan urutan di mana mereka menjalankan, dan bagaimana hal tersebut dikembalikan.
Bahwa dengan tumpukan, seperti kita akan melihat, Anda dapat mengatakan,
OK, saya ingin nilai ini menjadi sekitar sampai aku memberitahu Anda sebaliknya.
Anda tidak diperbolehkan untuk menyingkirkan itu.
Anda tidak diperbolehkan untuk menimpanya.
Anda akan tetap sekitar selama saya katakan.
Anda bisa menjadi bos di heap, sedangkan stack-- mungkin jika Anda
seperti finagle jalan Anda dapat menjadi bos.
Tapi tidak cukup.
Dan itu benar-benar hanya memori.
Ini cara hanya berbeda mengacu pada memori.
>> Keren.
Maka dengan itu, bagaimana mengontrol memori Anda.
Ini dengan malloc, yang Anda akan bisa menggunakannya.
Jadi itu hanya singkat untuk alokasi memori.
Itu semua itu.
Ada sekelompok keren lainnya fungsi yang memiliki alokasi di akhir,
dan mereka berdiri untuk hal yang berbeda.
>> Jadi, ketika Anda membutuhkan storage yang perlu untuk hidup lebih lama dr fungsi Anda saat ini sehingga
bahwa ketika Anda saat ini Fungsi melarikan diri,
Anda masih memiliki data yang Anda dapatkan dari itu, Anda ingin menggunakan malloc.
Itu akan menginisialisasi di heap.
Dan seperti saya katakan dan menjaga mengatakan, Anda akan tetap di sana
sampai Anda mengatakan sebaliknya, yang merupakan hal penting di sini.
>> Jadi satu hal untuk melihat, dan itu biasanya benar-benar penting,
adalah bahwa ini sizeof super berguna untuk menggunakan
karena tergantung pada jenis mesin yang Anda jalankan,
hal itu mungkin karena jumlah yang bervariasi memori yang dibutuhkan.
Jadi, Anda selalu ingin menggunakan ukuran jadi bahwa Anda tidak tergantung mesin,
sehingga kode Anda akan berjalan pada mesin.
>> Dan itu hanya bagian menulis kode yang baik.
Jika bekerja pada satu mesin, tapi tidak ada yang lain,
bagaimana berguna adalah program anda?
Jadi Anda selalu ingin pastikan dan menggunakan sizeof.
>> AUDIENCE: Jadi adalah bahwa seperti ukuran 10 inci [tidak terdengar]?
>> SPEAKER 1: ini adalah ukuran 10 int.
ya.
Jadi ukuran int akan kembali berapa satu int ambil.
Atau ukuran char, bagaimana banyak melakukan satu char take.
Dan kemudian berapa banyak blok dari yang Anda inginkan?
>> Jadi dalam hal ini, kita menginginkan sesuatu bahwa kita dapat menyimpan 10 int untuk.
Dan itu akan bekerja terlepas mesin, yang dingin.
Jadi berapa banyak byte akan yang benar-benar memberikan?
Cepat matematika.
>> AUDIENCE: 40.
SPEAKER 1: 40.
Tepat.
Jadi hal besar lain.
Pointer atau malloc dapat kembali null.
>> Jadi sekali lagi, selalu periksa untuk melihat apakah itu kembali batal
sebelum Anda mencoba dan melakukan apa-apa dengan itu.
Jika Anda mencoba dan dereference pointer ini sekarang,
itu hanya akan segfault karena Anda pergi dan mencoba
menyentuh null ketika Anda tidak harus memiliki.
Jadi selalu memeriksa null.
Sekali lagi, semua dapat Anda lakukan.
>> Mungkin kembali null.
Ini akan mengembalikan null jika Anda baik keluar dari ruang, atau karena alasan apapun
itu berlari ke dalam beberapa bug memori.
Kadang-kadang hanya mengembalikan null.
Jadi Anda hanya harus memeriksa untuk itu.
Itu semua geser ini mengatakan.
Dan kemudian apa yang kita miliki di sini adalah panggilan untuk membebaskan.
Jadi dengan cara yang sama bahwa jika Anda membuka file Anda harus menutup file,
jika Anda memori malloc, Anda Anda harus membebaskan memori itu.
Dan kalian akan mendapatkan melakukan hal-hal benar-benar keren.
>> Dan ada program yang dapat dijalankan untuk melihat apakah Anda pernah bocor memori.
Tapi Anda tidak ingin kebocoran memori.
Ini benar-benar buruk.
Hanya mengacaukan hal-hal.
>> Ini buruk untuk melakukan hal seperti pemrograman bijaksana untuk efisiensi desain.
Tapi itu juga hanya jenis dari buruk bagi komputer Anda.
Hal-hal begitu hanya gratis ketika Anda malloc mereka.
>> Kalian lihat simetri sini.
Super sederhana.
Hanya gratis dan kemudian apapun pointer Anda,
apapun nama pointer Anda, dan itu
akan mengurus membebaskan untuk Anda.
Keren.
>> Lalu kami memiliki ini.
Jadi kita hanya akan berjalan melalui program ini.
Dan kemudian kalian selesai.
>> Jadi [tak terdengar] hanya utama.
Jadi kita memiliki beberapa int * pointer.
Jadi kita memiliki pointer itu akan terus int.
Dan berapa banyak int apakah itu akan terus?
Hanya satu.
Ukuran sebuah int.
>> Kami memeriksa untuk melihat apakah pointer adalah null karena
adalah, kita ingin mengatakan tidak melakukan apa-apa.
Itu buruk.
Jadi kita mencetak beberapa error dari memori, yang paling sering kembali 1,
seperti kalian digunakan untuk.
>> Dan kemudian kita miliki di sini, kita dereference pointer kita.
Jadi itu berarti 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
berpikir tentang sekelompok rumah di lingkungan
bahwa Anda ingin menempatkan furniture di Anda, malloc
seperti OK, Anda mendapatkan untuk pergi ke rumah tiga.
Dan itu memberi Anda alamat rumah tiga.
>> Jadi sekarang ini, ini toko pointer alamat,
menyimpan alamat rumah Anda.
* Ptr berarti, OK, aku di rumah saya.
Keren.
Saya perlu mendapatkan beberapa bilangan bulat.
>> Jadi Anda meminta seseorang untuk memberikan furnitur sekarang.
Jadi Anda mendapatkan beberapa int.
Dan menempatkan dalam pointer Anda di mana itu menunjuk ke.
>> Dan kemudian itu hanya cetakan out, Anda masukkan di mana pun.
Dan lagi, referensi.
Jadi ini seperti Anda pergi ke ini alamat dan Anda melihat apa yang ada di sana.
Keren?
>> Dan tentu saja kita membebaskan pointer kita.
Jangan lupa untuk membebaskan pointer Anda.
Jangan lupa untuk memeriksa null.
Jangan lupa untuk membebaskan pointer Anda.
Anda memiliki dua hal yang Anda ingat dari ini, atau bahwa Anda harus ingat.
Ya.
AUDIENCE: [tak terdengar] hal-hal seperti itu, char * s.
Kenapa kita tidak pernah membebaskan mereka?
>> SPEAKER 1: Hm?
>> AUDIENCE: Apakah orang-orang seperti string?
Kau bilang string adalah seperti char * s, kan?
Jadi kenapa tidak kita membebaskan string?
>> SPEAKER 1: Anda hanya untuk gratis jika Anda mallocing.
AUDIENCE: Oh, jika Anda mallocing.
SPEAKER 1: Jadi malloc dan bebas adalah dua hal
bahwa Anda harus selalu memiliki bersama-sama.
f terbuka, f dekat, dua hal Anda harus memiliki bersama-sama.
Dalam kedua kasus tersebut, memeriksa null.
Ya.
>> AUDIENCE: Jadi gratis hanya memungkinkan sesuatu yang lain
untuk disimpan di sana setelah Program ini telah menggunakannya?
>> SPEAKER 1: Ini hanya mengatakan, OK, aku sudah selesai dengan ini.
Anda tidak perlu untuk tetap di sekitar.
Bila tidak, komputer akan hanya suka mencoba dan tetap di sana.
Dan kemudian Anda can't-- itu berjalan menjadi masalah memori kemudian.
Anda selalu ingin membebaskan karena ia memberitahu komputer Anda, OK, aku
dilakukan dengan tempat ini dari memori.
Anda dapat memilikinya kembali bagi saya untuk digunakan kemudian.
Keren?
Ya.
>> AUDIENCE: Jadi kita menggunakan% d hanya karena ganda yang datang kembali,
atau mengapa is-- [tak terdengar].
>> AUDIENCE: Dapatkah Anda menggunakan% i?
>> SPEAKER 1: Anda dapat menggunakan% i.
Ada pertanyaan menit terakhir?
Silakan.
AUDIENCE: Aku hanya punya pertanyaan singkat.
Jadi variabel ptr, that's-- seperti, dengan int * ptr = malloc,
itu hanya mengatakan itu menunjuk ke suatu tempat di memory--
SPEAKER 1: Apakah Anda ingin [tak terdengar]?
AUDIENCE: -yang 's yang ukuran of-- tidak, itu OK.
Tapi itu hanya menunjuk ke suatu tempat di memori itu hanya seperti empat byte.
SPEAKER 1: Benar.
Jadi malloc ukuran int mengatakan, OK, aku akan pergi lari,
menemukan empat byte memori untuk Anda.
Ketika ia menemukan bahwa empat byte memori, itu
memberi Anda kembali alamat dari mana dimulai,
dan itulah yang disimpan di pointer, atau ptr.
Baik.
Kalian terlihat kurang bingung daripada kebanyakan orang-orang ketika saya berbicara tentang pointer,
jadi aku merasa cukup baik sekarang.
>> Baik.
Seperti biasa, kalian harus memiliki semua mendapatkan nilai pset2 Anda sekarang.
Aku tahu ada beberapa miring hal mana ia mengatakan, susu formula tidak valid
atau sesuatu.
Jika Anda mendapatkan itu, semua nilai Anda berlaku di sisi saya.
Jadi saya bisa mengirim Anda screenshot dari nilai Anda.
Biarkan aku tahu juga jika Anda hilang setiap nilai atau sesuatu
tampaknya tidak masuk akal.
Datanglah ke saya.
>> Saya sudah super bangga padamu Orang-orang sudah, jadi keep it up.
Dan memiliki baik sisa minggu Anda.
Saya yakin saya akan melihat beberapa Anda di jam kantor.