>> DAVID MALAN: Hello, dan selamat datang kembali ke CS50.
Jadi ini adalah hujung minggu empat.
Hanya satu pengumuman pertama.
Jadi yang dipanggil kelima Isnin adalah datang pada hari Isnin akan datang.
Ini adalah peluang untuk berubah dari Sab / UNSAT kepada gred surat, atau dari
gred surat Sab / UNSAT.
Annoyingly, proses yang tidak memerlukan tandatangan, kerana anda perlu mengisi
keluar salah satu add / drop merah jambu bentuk.
>> Kerana teknikal, SAT / UNSAT versi dan versi gred surat
mempunyai nombor katalog yang berbeza.
Tetapi tidak ada masalah besar.
Hanya datang kepada saya atau kepada Rob atau Lauren pada bila-bila.
Atau email kami jika anda tidak mempunyai jenis kertas kerja yang anda perlukan hari ini, dan kami
pasti akan membantu anda mengambil menjaga bahawa sebelum Isnin.
>> Baiklah, jadi hari ini -
sebenarnya, ada sedikit gema.
Bolehkah kita nada saya ke bawah sedikit?
OK.
Jadi hari ini, kita memperkenalkan topik dikenali sebagai petunjuk.
Dan saya akan mengakui bahawa ini adalah salah satu daripada topik yang lebih kompleks yang kita cenderung untuk
meliputi di dalam kelas ini, atau benar-benar apa-apa kursus pengenalan yang menggunakan C.
>> Tetapi mengambil kata-kata saya untuk itu, terutamanya jika fikiran anda berasa sedikit lebih bengkok
hari ini dan pada minggu-minggu akan datang.
Ia bukan wakil anda mendapat apa-apa lebih teruk pada ini, ia hanya bermaksud bahawa
ia adalah satu topik yang amat canggih yang saya janji, beberapa minggu
oleh itu, akan kelihatan terlalu menakjubkan mudah jika ditinjau kembali.
>> Saya masih ingat hingga ke hari ini.
Saya sedang duduk di Elliott Dewan Makan, duduk di sebelah saya TF Nishat Mehta,
yang merupakan seorang penduduk Elliott rumah.
Dan untuk sebab-sebab tertentu, ini topik hanya klik.
Yang mengatakan bahawa saya juga berjuang dengannya untuk beberapa jumlah masa, tetapi saya
akan melakukan yang terbaik untuk membantu mengelakkan sebarang seperti perjuangan dengan topik yang akhirnya
agak kuat.
>> Malah, salah satu topik yang kita akan membincangkan pada minggu-minggu akan datang ialah
keselamatan, dan bagaimana anda boleh sebenarnya mengeksploitasi mesin dengan cara yang
yang tidak bertujuan.
Dan orang-orang exploitations biasanya hasil daripada pepijat, kesilapan yang kita
orang membuat dengan tidak memahami beberapa pelaksanaan asas
maklumat melalui program-program yang dibuat.
>> Sekarang untuk membuat ini kelihatan semua pengguna yang lebih mesra, saya fikir saya akan memainkan 10
preview kedua claymation yang sedikit angka dinamakan Binky yang telah dibawa ke
hidup oleh seorang kawan kita di Stanford, profesor Nick Parlante.
Jadi izinkan saya untuk memberikan anda ini teaser of Binky di sini.
>> [MAIN SEMULA VIDEO]
>> -Hey, Binky.
Bangun.
Ia adalah masa untuk bersenang-senang penunjuk.
>> -Apa itu?
Belajar mengenai petunjuk?
Oh, cenderahati.
>> [AKHIR VIDEO MAIN SEMULA]
>> DAVID MALAN: Itulah Stanford sains komputer.
Jadi lebih pada yang akan datang.
>> [Tepuk tangan]
>> DAVID MALAN: Maaf, Nick.
>> Jadi ingat bahawa kali terakhir kita berakhir pada cliffhanger ini benar-benar menarik
mana fungsi ini hanya tidak bekerja.
Sekurang-kurangnya intuitif, ia berasa seperti ia harus bekerja.
Hanya bertukar-tukar nilai dua integer.
Tetapi ingat bahawa apabila kita dicetak keluar nilai-nilai asal dalam utama, satu dan
dua, mereka masih satu dan dua dan bukan dua dan satu.
>> Jadi biarlah saya sebenarnya menukar kepada perkakas.
Dan saya menulis sehingga sedikit kod dalam rangka maju di sini, di mana saya mendakwa bahawa x
akan 1, y akan 2.
Saya kemudian mencetak kedua-dua mereka nilai dengan cap f.
>> Saya kemudian mendakwa turun di sini bahawa kita akan menukar mereka.
Saya meninggalkan tempat kosong di sini untuk kita mengisi hari ini dalam seketika.
Kemudian, saya akan mendakwa bahawa dua pembolehubah telah bertukar.
Kemudian saya akan mencetak mereka keluar lagi.
Dan supaya mudah-mudahan, saya dapat melihat 1, 2.
2, 1.
Itulah yang mudah super Matlamat sekarang.
>> Jadi bagaimana kita pergi tentang bertukar-tukar dua pembolehubah?
Baik jika saya mencadangkan di sini bahawa cawan mungkin mewakili memori dalam komputer.
Ini adalah gigitan beberapa, ini merupakan satu lagi beberapa gigitan.
Bolehkah kita telah sukarelawan datang dan campuran beberapa minuman kita, jika biasa?
Ayuh up.
Apa nama anda?
>> JESS: Jess.
>> DAVID MALAN: Jess?
Datang pada sehingga, Jess.
Jika anda tidak keberatan, kita perlu meletakkan Google Glass kepada anda supaya kita boleh
mengabadikan ini.
OK, kaca.
Merakam video.
Dan OK, kita adalah baik untuk pergi dengan Jess sini.
Baiklah.
Nice untuk bertemu dengan kamu.
>> Jadi apa yang saya ingin anda lakukan di sini - jika anda boleh, agak cepat -
hanya menuangkan kita setengah gelas oren jus dan setengah gelas susu,
mewakili berkesan nombor 1 dalam satu cawan dan 2 dalam cawan yang lain.
>> Ini akan menjadi rakaman yang baik.
>> JESS: Maaf.
>> DAVID MALAN: Tidak, tidak.
Ia adalah OK.
Nice.
Baiklah, jadi kita perlu empat bait bernilai jus oren.
Kami akan memanggilnya nilai 1.
Sekarang empat lagi bait bernilai susu.
Akan memanggilnya nilai 2.
Jadi x dan y, yang masing-masing.
>> Baiklah, jadi sekarang jika tugas di tangan - untuk anda, Jess, di hadapan semua
rakan sekelas anda -
adalah untuk menukar nilai-nilai x dan y seperti yang kita mahu jus oren dalam
cawan lain dan susu di dalam cawan ini, bagaimana mungkin anda - sebelum anda benar-benar melakukan
ia - tidak melakukan ini?
>> OK, bijak keputusan.
Jadi, anda memerlukan memori yang lebih sedikit.
Jadi mari kita memperuntukkan sementara cawan, jika anda akan.
Dan kini meneruskan untuk menukar x dan y.
>> Excellent.
Jadi sangat baik dilakukan.
Terima kasih banyak, Jess.
Di sini anda.
A cenderamata kecil.
>> OK, jadi jelas, idea super mudah.
Sepenuhnya intuitif bahawa kita perlu sedikit lebih banyak ruang penyimpanan - dalam borang ini,
cawan - jika kita benar-benar mahu menukar kedua-dua pembolehubah.
Jadi mari kita melakukan perkara tersebut.
Di sini di antara mana saya menuntut saya akan melakukan beberapa bertukar-tukar, saya akan
pergi ke hadapan dan mengisytiharkan temp.
Dan saya akan menetapkan sama, berkata, x.
>> Kemudian saya akan menukar nilai x seperti Jess lakukan di sini dengan
susu dan jus oren menjadi sama dengan y.
Dan saya akan berubah y menjadi sama bukan x, kerana sekarang kita akan
terperangkap di dalam bulatan, tetapi sementara.
Di mana saya buat sementara waktu - atau mana Jess sementara meletakkan jus oren
sebelum clobbering bahawa cawan dengan susu.
>> Jadi biarlah saya pergi ke hadapan sekarang dan membuat ini.
Ia dipanggil noswap.c.
Dan sekarang mari saya menjalankan tiada swap.
Dan sesungguhnya saya lihat, jika saya mengembangkan tingkap sedikit, yang
x 1, y ialah 2.
Dan kemudian x 2, y ialah 1.
>> Tetapi ingat bahawa pada hari Isnin kita melakukan perkara-perkara sedikit berbeza di mana saya
bukannya melaksanakan fungsi penolong, jika anda akan, yang sebenarnya tidak sah.
Saya memanggilnya menukar.
Saya berikan dua parameter, dan saya dipanggil mereka dan saya memanggil mereka b.
>> Terus terang, saya boleh memanggil mereka x dan y.
Tidak ada yang berhenti saya dari berbuat demikian.
Tetapi saya akan berhujah ia kemudian yang kabur sedikit.
Kerana ingat untuk Isnin bahawa kita mendakwa bahawa parameter ini adalah
salinan nilai berlalu masuk
Jadi ia hanya messes dengan anda fikiran, saya fikir, jika anda menggunakan
tepat pemboleh ubah yang sama.
>> Jadi saya bukannya akan memanggil mereka dan b, hanya untuk kejelasan.
Tetapi kita boleh memanggil mereka yang paling apa-apa yang kita mahu.
Dan saya akan copy dan paste berkesan kod ini dari sana
turun ke sini.
Kerana saya hanya melihat bahawa ia berfungsi.
Jadi, itu dalam keadaan cukup baik.
Dan saya akan menukar x saya kepada saya, x kepada, y saya untuk b dan y saya untuk b.
>> Jadi, dalam erti kata lain, logik yang tepat sama.
Perkara yang sama yang tepat bahawa Jess lakukan.
Dan kemudian satu perkara yang saya lakukan sehingga di sini, sudah tentu, kini sembah ini
fungsi, atau memanggil fungsi ini.
Jadi, saya akan memanggil fungsi ini dengan dua input, x dan y, dan tekan Simpan.
>> Baiklah, jadi asasnya perkara yang sama.
Malah, saya mungkin telah dibuat program tidak perlu kompleks oleh
menulis fungsi yang hanya mengambil kira-kira enam baris kod sedangkan saya
sebelum ini telah dilaksanakan ini dalam hanya tiga.
>> Jadi biarlah saya pergi ke hadapan sekarang dan membentuk semula ini, tidak membuat swap.
Baiklah, saya diskrukan di sini.
Ini harus menjadi satu kesilapan yang anda mungkin lihat semakin biasa sebagai anda
program mendapatkan lebih kompleks.
Tetapi ada satu menetapkan mudah.
Biar saya skrol kembali di sini.
>> Dan apa yang kesilapan yang pertama yang saya lihat?
Pengakuan tersirat.
Apa yang biasanya menunjukkan?
Oh, saya terlupa prototaip.
Saya terlupa untuk mengajar pengkompil bahawa swap akan wujud walaupun dia
tidak wujud pada awal-awal program.
Jadi, saya hanya akan mengatakan tidak sah, swap, int, b int, koma bertitik.
>> Jadi, saya tidak akan reimplement itu.
Tetapi sekarang ia sepadan dengan apa yang turun di sini.
Dan notis, ketiadaan koma bertitik di sini, yang tidak perlu apabila
melaksanakan.
>> Jadi biarlah saya membentuk semula ini, tidak membuat swap.
Bentuk yang lebih baik.
Main tiada swap.
Dan sialan.
Sekarang kita kembali di mana kita berada pada hari Isnin, di mana perkara yang tidak menukar.
>> Dan apa yang penjelasan yang intuitif mengapa ini berlaku?
Ya?
>> PELAJAR: [didengar].
>> DAVID MALAN: Tepat sekali.
Jadi a dan b adalah salinan x dan y.
Dan sebenarnya, bila-bila masa anda telah memanggil fungsi setakat yang
pas pembolehubah seperti Ints -
seperti swap menjangkakan di sini -
anda semua telah lulus dalam salinan.
>> Sekarang ini bermakna ia mengambil masa sedikit masa, kedua berpecah, bagi
komputer untuk menyalin dari satu bit berubah-ubah ke dalam bit yang lain.
Tetapi itu bukan satu masalah besar.
Tetapi mereka tetap satu salinan.
>> Dan sehingga kini, dalam konteks swap, Saya sebenarnya berjaya
berubah dan b.
Malah, mari kita buat cepat kewarasan cek.
Cetak f ialah% i, baris baru.
Dan plug mari dalam.
Sekarang mari kita lakukan perkara yang sama dengan b.
Dan mari kita melakukan perkara yang sama di sini.
>> Dan sekarang, saya tulis mereka garis yang sama sekali lagi di bahagian bawah fungsi
selepas tiga baris saya menarik boleh dilaksanakan, dan
mencetak dan b sekali lagi.
Jadi sekarang mari kita membuat ini, tidak membuat swap.
Izinkan saya membuat tetingkap terminal suatu sedikit lebih tinggi, supaya kita dapat melihat
lebih dari itu sekaligus.
>> Dan menjalankan tiada swap.
x 1, y ialah 2. ialah 1, b ialah 2.
Dan kemudian, ialah 2, b ialah 1.
Jadi ia sedang bekerja, seperti Jess lakukan di sini dalam swap.
Tetapi sudah tentu, ia mempunyai kesan pada pembolehubah utama.
>> Jadi kita lihat helah di mana kita boleh menetapkan ini, bukan?
Apabila anda berhadapan dengan skop ini isu, anda hanya boleh menyepak bola dan membuat x
dan y jenis pembolehubah bukan?
>> Anda boleh membuat mereka global.
Meletakkan mereka di bahagian paling atas fail seperti yang kita lakukan, walaupun dalam permainan 15.
Kami menggunakan ubah global.
Tetapi dalam konteks permainan 15, adalah wajar untuk mempunyai global
pembolehubah yang mewakili lembaga, kerana keseluruhan daripada 15.c adalah
kira-kira melaksanakan permainan itu.
Itulah yang fail wujud lakukan.
>> Tetapi dalam kes ini di sini, saya memanggil swap berfungsi.
Saya mahu untuk menukar dua pembolehubah.
Dan ia harus bermula untuk berasa ceroboh jika penyelesaian kepada semua kami
masalah apabila kita masuk ke dalam skop isu ini menjadikan ia global.
Kerana dengan cepat program kami akan menjadi agak kacau-bilau.
Dan kita lakukan yang sangat berhati-hati akibat di 15.c.
>> Tetapi ternyata ada cara yang lebih baik sama sekali.
Biar saya benar-benar pergi ke belakang dan memadam mencetak f itu, hanya untuk memudahkan kod ini.
Dan biarlah saya mencadangkan supaya ini, sesungguhnya, yang buruk.
Tetapi jika saya bukan menambah dalam beberapa asterisk dan bintang, saya bukannya boleh menjadikan ini
fungsi ke dalam satu yang sebenarnya operasi.
>> Jadi biarlah saya kembali di sini dan mengakui mengatakan asterisk sentiasa sukar,
jadi saya akan berkata bintang.
Saya hanya akan mengaku kepada yang satu.
Baiklah.
Dan kini, apa yang saya akan untuk melakukan sebaliknya?
>> Jadi pertama sekali, saya akan nyatakan bahawa bukan lulus int ke dalam
fungsi swap ini, saya bukan pergi untuk mengatakan int bintang.
Kini, apa yang bintang menunjukkan?
Ini adalah bahawa konsep penunjuk bahawa Binky, watak claymation, adalah
merujuk kepada masa lalu.
>> Jadi, jika kita katakan int bintang, makna sekarang ini adalah bahawa tidak akan menjadi
diluluskan oleh nilainya.
Ia tidak akan disalin masuk
Sebaliknya, alamat adalah akan berlalu masuk
>> Jadi ingat bahawa di dalam komputer anda adalah sejumlah besar memori, jika
dikenali sebagai RAM.
Dan RAM yang hanya keseluruhan sekumpulan bait.
Jadi, jika Mac atau PC anda mempunyai dua gigabait, anda mempunyai 2
bilion bait ingatan.
>> Sekarang mari kita hanya menganggap bahawa hanya untuk menjaga perkara-perkara yang baik dan teratur, kita
memberikan alamat -
beberapa -
kepada tiap-tiap bait RAM dalam komputer anda.
Bait pertama mereka 2 bilion dengan bilangan sifar.
Yang seterusnya adalah nombor satu bait, bilangan dua, semua cara di atas, dot dot
dot, untuk kira-kira 2 bilion.
>> Jadi, anda boleh nombor satu bait memori dalam komputer anda.
Jadi mari kita menganggap bahawa itulah yang kita maksudkan dengan alamat.
Oleh itu, apabila saya melihat int bintang, apa yang berlaku akan diluluskan ke swap sekarang ialah
alamat a.
Bukan nilai, tetapi apa sahaja yang posnya alamat adalah, jadi untuk bercakap -
lokasi dalam RAM.
>> Dan juga untuk b, saya akan untuk mengatakan perkara yang sama.
Int, bintang, b.
Sebagai mengetepikan, teknikal bintang boleh pergi di lokasi lain.
Tetapi kita akan menyeragamkan pada bintang yang sedang betul-betul bersebelahan dengan jenis data.
>> Jadi menukar tandatangan sekarang bermakna, memberi saya alamat int, dan panggilan
yang alamat.
Dan memberikan saya alamat yang lain daripada int dan hubungi alamat yang b.
>> Tetapi sekarang kod saya di sini telah berubah.
Kerana jika saya mengisytiharkan int temp -
yang masih jenis int -
tetapi saya menyimpan di dalamnya, apa jenis nilai?
Untuk menjadi jelas, saya meletakkan satu dengan kod yang ditulis sekarang?
>> Saya meletakkan lokasi dalam.
Tetapi saya tidak mengambil berat tentang lokasi sekarang, betul?
Suhu wujud hanya cawan ketiga Jess ' wujud, untuk tujuan apa?
Untuk menyimpan nilai.
Susu atau jus oren.
Tidak benar-benar menyimpan alamat sama ada perkara-perkara, yang merasakan
sedikit tidak masuk akal dalam hal ini sebenar konteks dunia juga.
>> Jadi benar-benar, apa yang saya mahu dimasukkan ke dalam temp bukan alamat, tetapi
kandungan.
Jadi, jika adalah satu nombor seperti 123, ini adalah bait yang ke-123 memori yang hanya
berlaku kepada penjajah, bahawa nilai dalam berlaku kepada penjajah.
>> Jika saya mahu pergi ke alamat itu, Saya perlu mengatakan bintang.
Begitu juga, jika saya mengubah apa yang di alamat, saya menukar
ini untuk memulakan.
Jika saya mahu menyimpan dalam apa yang di lokasi dengan apa yang di lokasi
di b, bintang b bintang.
>> Jadi ringkasnya, walaupun ini adalah tidak cukup tenggelam dalam lagi - dan saya tidak akan mengharapkan
bahawa ia akan begitu pantas -
menyedari bahawa semua yang saya lakukan adalah awalan bintang-bintang kepada pembolehubah saya,
kata tidak merebut nilai.
Jangan menukar nilai-nilai.
Tetapi sebaliknya, mereka pergi ke alamat dan mendapatkan nilai.
Pergi ke alamat itu dan perubahan nilai di sana.
>> Jadi sekarang biarlah saya skrol kembali ke atas, hanya untuk menetapkan garis ini di sini, untuk
menukar prototaip kepada perlawanan.
Tetapi sekarang saya perlu untuk melakukan satu perkara yang lain.
Dengan kata lain, jika saya telah mengubah jenis hujah swap yang menjangkakan,
apa lagi yang saya perlu perubahan dalam kod saya?
>> Apabila saya memanggil swap.
Kerana sekarang, apa yang saya Saya lulus untuk menukar masih?
Nilai x dan nilai y, atau susu dan jus oren.
Tetapi saya tidak mahu berbuat demikian.
Saya bukan mahu lulus dalam apa?
Lokasi x dan lokasi y.
Apakah alamat pos mereka, jadi untuk bercakap.
>> Jadi untuk berbuat demikian, ada Ampersand An.
Ampersand jenis bunyi seperti alamat.
jadi n, Ampersand, alamat x, dan alamat y.
Jadi ia sengaja yang kita gunakan ampersands apabila memanggil fungsi,
dan bintang apabila mengisytiharkan dan apabila melaksanakan fungsi tersebut.
>> Dan hanya memikirkan Ampersand sebagai alamat pengendali, dan bintang sebagai
pergi ke sana operator -
atau lebih dengan betul, operator dereference.
Jadi itulah banyak keseluruhan perkataan hanya untuk mengatakan bahawa kini, mudah-mudahan, swap akan
betul.
>> Biar saya pergi ke hadapan dan membuat -
mari kita sebenarnya menamakan semula fail, supaya program ini masih boleh dipanggil tidak swap.
Saya mendakwa bahawa kita akan memanggilnya swap.c sekarang.
Oleh itu, menukar.
Dot, slash, menukar.
>> Dan sekarang sesungguhnya, x 1, y ialah 2.
Dan kemudian, x 2, y adalah satu.
Nah mari kita lihat jika kita tidak boleh melakukan ini sedikit berbeza tentang apa yang
berlaku di sini.
Pertama, izinkan saya mengezum masuk pada kami lukisan skrin di sini.
Dan biarlah saya mencadangkan untuk seketika - dan setiap kali saya menarik di sini akan mencerminkan
di sana sekarang - izinkan saya mencadangkan supaya di sini adalah sejumlah besar memori, atau
RAM, di dalam komputer saya.
>> Dan ini akan menjadi nombor menggigit, katakan, 1.
Ini akan menjadi bait nombor 2.
Dan saya akan melakukan sejumlah lebih, dan maka sekumpulan dot dot titik untuk
menunjukkan bahawa terdapat 2 bilion perkara-perkara ini.
4, 5, dan sebagainya.
>> Jadi ada yang pertama lima bait memori komputer saya.
Semua betul?
Sangat sedikit daripada 2 bilion.
Tetapi sekarang saya akan mencadangkan berikut.
Saya akan mencadangkan supaya x akan menyimpan nombor 1, dan y akan
untuk menyimpan nombor 2.
Dan biarlah saya pergi ke hadapan sekarang dan mewakili nilai-nilai seperti berikut.
>> Mari kita buat ini seperti berikut.
Berikan saya hanya satu kedua.
Yang kedua.
OK.
Saya mahu membuat ini sedikit -
mari kita buat ini lagi.
Jika tidak, saya akan dan menggunakan nombor yang sama, tidak sengaja,
berkali-kali.
>> Jadi hanya jadi kita mempunyai nombor yang berlainan untuk bercakap tentang, mari kita memanggilnya bait ini
nombor 123, 124, 125, 126, dan dot dot dot.
Dan biarlah saya menuntut sekarang bahawa saya akan meletakkan nilai 1 di sini, dan nilai 2
di sini, atau dikenali sebagai x dan y.
Jadi ia hanya kebetulan bahawa ini x, ini adalah y.
>> Dan hanya dengan beberapa peluang rawak, komputer, sistem operasi,
berlaku untuk meletakkan x di lokasi nombor 123.
Dan y berakhir di lokasi 124 -
sialan.
Saya sepatutnya ditetapkan ini.
Oh lelaki, adakah saya benar-benar mahu untuk melakukan ini?
Ya, saya mahu untuk menetapkan ini dan b yang betul kira-kira hari ini.
Maaf, baru di ini.
>> 127, 131, dan saya tidak mahu menjadi ini kompleks, tetapi kenapa saya menukar
nombor di sana?
Kerana saya mahu Ints untuk sebenarnya empat bait.
Jadi mari kita dubur super tentang perkara ini.
Supaya jika 1 berlaku ditangani 123, 2 akan berada di alamat
127 kerana ia adalah hanya 4 bye dari sini.
Itu sahaja.
Dan kita akan lupa tentang semua alamat lain di dunia.
>> Jadi x adalah di lokasi 123, y adalah di lokasi 127.
Dan kini, apa yang saya benar-benar mahu lakukan?
Apabila saya memanggil swap sekarang, apa yang sebenarnya berlaku?
Nah, apabila saya panggil swap, saya lulus dalam alamat x dan alamat y.
Jadi untuk contoh, jika kedua-dua keping kertas kini mewakili dua
hujah-hujah dan b untuk menukar, apa yang saya akan menulis pada hari pertama ini,
yang saya akan memanggil merujuk kepada sebagai?
>> Tepat sekali, 123.
Jadi ini saya menuntut adalah.
Ini adalah parameter a.
Saya meletakkan alamat x di sana.
>> Apa itu?
>> Tidak, tidak.
Itu OK.
Masih baik, masih baik.
Jadi ini adalah satu.
Dan kini pada bahagian kedua kertas, ini akan menjadi b, dan apa yang saya
akan menulis mengenai ini sekeping kertas?
127.
>> Jadi satu-satunya perkara itu berubah sejak ketara sekali kami sebelum ini cerita ini adalah,
dan bukannya benar-benar 1 dan 2, saya akan lulus dalam 123 dan 127.
Dan saya kini akan diletakkan di dalam ini kotak ini, betul?
Supaya kotak hitam kini mewakili fungsi swap.
>> Sementara itu, mari kita kini mempunyai seseorang melaksanakan fungsi swap.
Adakah seseorang di sini suka secara sukarela?
Ayuh up.
Apa nama anda?
Charlie.
Baiklah, Charlie.
Ayuh up.
>> Jadi Charlie akan bermain peranan kotak hitam kita.
Dan Charlie, apa yang saya ingin anda lakukan kini melaksanakan swap dalam apa-apa cara
bahawa, memandangkan kedua-dua alamat, anda sebenarnya akan
untuk menukar nilai-nilai.
Dan saya akan berbisik di telinga anda bagaimana untuk menjalankan TV di sini.
>> Oleh itu, pergilah ke hadapan, dan anda kotak hitam.
Sampai di sana.
Apakah nilai-nilai yang anda lihat, dan nilai apa yang anda lihat untuk b?
>> CHARLIE: adalah 123 dan b adalah 127.
>> DAVID MALAN: OK, betul-betul.
Sekarang berhenti di sana untuk seketika.
Perkara pertama yang anda akan lakukan sekarang, mengikut kod - yang
Saya kini akan tarik sehingga pada skrin -
akan menjadi untuk memperuntukkan sedikit sedikit ingatan dipanggil temp.
Jadi, saya akan pergi ke hadapan dan memberi ingatan itu.
>> Jadi ini akan menjadi pembolehubah ketiga bahawa anda mempunyai akses kepada
anda dipanggil temp.
Dan apa yang anda akan menulis di atas sekeping menggoda kertas?
>> CHARLIE: Penunjuk, bukan?
>> DAVID MALAN: OK, juga tidak semestinya petunjuk.
Jadi garis kod yang saya telah diserlahkan pada sebelah kanan,
mari kita mulakan di sana.
Ia mengatakan bintang.
Jadi kini menyimpan nombor 123.
Dan hanya intuitif, apa adakah bintang 123 maksudkan?
>> Tetapi secara khusus, jika adalah 123, bintang bermaksud apa?
Nilai sesuatu.
Atau lebih bersahaja, pergi ke sana.
Jadi biarlah saya mencadangkan, memegang di tangan anda, teruskan dan merawat bahawa
seolah-olah ia adalah peta.
Dan berjalan sendiri ke komputer yang ingatan, dan mencari kami apa yang
di lokasi 123.
Tepat sekali.
>> Jadi kita lihat di lokasi 123 apa, jelas?
OK, jadi apa nilai kini anda akan dimasukkan ke dalam menggoda?
Tepat sekali.
Jadi teruskan dan berbuat demikian.
Dan menulis nombor 1 di atas sekeping kertas yang saat ini bertajuk temp.
>> Dan kini langkah seterusnya yang anda akan melaksanakan
akan menjadi apa.
Nah, di sebelah kanan Barisan seterusnya kod adalah bintang b. b, daripada
Sudah tentu, menyimpan alamat.
Yang menangani 127.
Star b bermaksud apa, bersahaja bercakap?
>> Pergi ke lokasi tersebut.
Oleh itu, pergilah ke hadapan dan mencari kami apa yang di lokasi 127.
OK.
Sudah tentu, di lokasi 127, masih nilai 2.
Jadi apa yang anda akan kini kedai di apa yang di lokasi yang dalam?
Jadi bintang cara pergi ke lokasi a.
Apakah lokasi yang?
>> Tepat sekali.
Jadi sekarang, jika anda mahu menukar apa yang di lokasi itu -
Saya akan pergi ke hadapan dan menjalankan pemadam berada di sini.
Dan kini meletakkannya kembali pada berus.
Apakah nombor yang anda akan menulis dalam kotak kosong sekarang?
>> Tepat sekali.
Jadi garis kod ini, jelas - mari saya berhenti apa Charlie lakukan dan
menegaskan di sini, apa yang dia hanya dilakukan adalah menulis ke dalam kotak yang di lokasi 123
nilai yang sebelum ini di b.
Dan supaya kita kini telah dilaksanakan memang baris kedua ini kod.
>> Sekarang malangnya, ada masih satu baris yang tinggal.
Sekarang apa yang ada dalam temp, betul-betul?
Ia adalah jelas nombor satu.
Itu bukan alamat.
Ia hanya nombor, jenis berubah-ubah dari satu minggu.
>> Dan sekarang apabila anda mengatakan bintang b, yang bermakna pergi ke alamat b, yang merupakan satu
kursus di sini.
Jadi apabila anda sampai ke sana -
Saya akan pergi ke hadapan dan memadam apa yang sebenarnya ada - dan apa yang anda
akan menulis di 127 lokasi?
>> CHARLIE: Suhu, yang merupakan salah.
>> DAVID MALAN: Suhu, yang merupakan salah.
Dan apa yang berlaku kepada suhu pada akhirnya?
Nah, kita tidak benar-benar tahu.
Kami tidak benar-benar peduli.
Mana-mana masa yang kita telah melaksanakan fungsi setakat ini, apa-apa pembolehubah tempatan anda mempunyai
memang tempatan.
Dan mereka hanya hilang.
Mereka dituntut oleh operasi sistem akhirnya.
>> Jadi hakikat bahawa sementara masih mempunyai nilai 1 adalah jenis asas
tidak menarik kepada kami.
Baiklah, jadi pusingan tepukan jika kita boleh bagi Charlie.
Sangat baik dilakukan.
>> Baiklah, jadi apa lagi yang tidak ini bermakna kita boleh buat?
Jadi ia ternyata bahawa kita telah memberitahu beberapa pembohongan putih
untuk sekian lama.
Malah, ia ternyata bahawa rentetan, semua masa ini, tidak benar-benar
jujukan aksara per se.
Ia jenis adalah intuitif.
>> Tetapi dari segi teknikal bercakap, rentetan adalah Jenis data yang kita diisytiharkan di dalam
perpustakaan CS50 untuk memudahkan dunia untuk beberapa minggu pertama kelas.
Apakah tali benar-benar adalah alamat yang bersifat suatu tempat di RAM.
Tali adalah benar-benar nombor, seperti 123 atau 127, yang berlaku kepada menanda
mana rentetan bermula pada memori komputer anda.
>> Tetapi ia tidak mewakili tali, per se, sendiri.
Dan kita boleh melihat ini sebagai berikut.
Biar saya pergi ke hadapan dan membuka beberapa kod itu di kalangan
contoh kod sumber hari ini.
Dan saya akan pergi ke hadapan dan membuka up, katakan, bandingkan 0.c.
Ini adalah program kereta yang akan yang akan dilaksanakan seperti berikut.
>> Pertama.
Saya akan mengatakan sesuatu.
Kemudian saya akan pergi ke hadapan dan mendapatkan rentetan daripada pengguna
di garis depan.
Kemudian saya akan mengatakan ia sekali lagi.
Kemudian saya akan mendapat satu lagi rentetan daripada pengguna.
>> Dan notis, saya menunjukkan salah satu daripada rentetan dalam pembolehubah yang dipanggil s, dan
satu lagi rentetan ini di ubah dipanggil t.
Dan sekarang saya akan mendakwa, sangat munasabah, bahawa jika s sama sama t,
tali adalah sama.
Anda menaip perkara yang sama.
Lagi, tali adalah bukan perkara yang sama.
>> Lagipun, jika kita input dua Ints, dua aksara, dua terapung, dua beregu, mana-mana
jenis data kita telah berbincang mengenai setakat ini untuk membandingkan mereka -
ingat kami membuat sangat jelas manakala yang lalu bahawa anda tidak melakukan ini, kerana
tanda sama tunggal sudah tentu pengendali tugasan.
Jadi yang akan menjadi bug.
>> Kami menggunakan tanda sama sama, yang sememangnya membandingkan
perkara untuk kesaksamaan benar.
Tetapi saya menuntut ini adalah kereta.
Jika saya pergi ke hadapan dan membuat membandingkan sifar, dan maka dot slash membandingkan sifar.
Dan saya menaip, katakan, hello.
Dan kemudian mari kita bertanya khabar sekali lagi.
Benar-benar perkara yang sama, komputer tuntutan saya menaip perkara yang berbeza.
>> Sekarang mungkin saya hanya disebabkan oleh kesalahan menaip sesuatu.
Saya akan menaip nama saya kali ini.
Maksud saya, hello.
Hello.
Ia berbeza setiap kali tunggal.
>> Nah, mengapa itu?
Apa yang benar-benar berlaku di bawah hood?
Nah, apa yang benar-benar berlaku di bawah hud adalah rentetan maka
Saya menaip dalam masa pertama misalnya adalah perkataan hello, sudah tentu.
Tetapi jika kita mewakili ini di bawah hud, ingat bahawa
rentetan dalam array.
Dan kita telah berkata banyak pada masa lalu.
>> Jadi, jika saya menarik array yang seperti ini, saya akan mewakili sesuatu yang agak
sama dengan apa yang kita lakukan sebentar tadi.
Dan ada sesuatu yang benar-benar khas di sini juga.
Apa yang kita telah menentukan di akhir setiap rentetan?
Ya, sifar backslash ini, yang hanya cara yang mewakili,
secara literal, 00000000.
Lapan 0 bit berturut-turut.
>> Saya tidak tahu, terus-terang, apa selepas ini.
Itu hanya RAM sekumpulan lebih di dalam komputer saya.
Tetapi ini adalah array.
Kita bercakap tentang pameran sebelum ini.
Dan kita biasanya bercakap mengenai barisan sebagai lokasi sifar,
maka satu, maka dua.
Tetapi itu hanya untuk kemudahan.
Dan yang sepenuhnya relatif.
>> Apabila anda sebenarnya mendapat memori daripada komputer, ia sudah tentu apa-apa
2 bilion beberapa bait ganjil, yang berpotensi.
Jadi benar-benar di bawah hud, semua masa ini, ya.
Ini sangat baik mungkin sifar kurungan.
Tetapi jika anda menggali lebih mendalam di bawah hud, yang benar-benar
menangani bilangan 123.
Ini adalah alamat 124.
Ini adalah alamat 125.
>> Dan saya tidak skru sehingga masa ini.
Ini adalah kini satu bait selain atas sebab apa?
Bagaimana besar adalah char?
Char adalah hanya satu bait.
Int Satu biasanya empat bait.
Jadi sebab itulah saya berjaya 123, 127, 131 dan sebagainya.
Sekarang saya boleh menjaga matematik mudah dan hanya melakukan campur 1.
Dan ini adalah apa yang kini benar-benar berlaku di bawah hood.
>> Oleh itu, apabila anda menyatakan sesuatu seperti ini, rentetan s, ini sebenarnya -
Ternyata -
bintang char.
Star, sudah tentu, ertinya alamat, penunjuk aka.
Jadi ia adalah alamat sesuatu.
Apakah alamat?
>> Well -
Saya satu-satunya yang boleh lihat sangat Perkara yang penting saya membuat, atau berfikir
Saya membuat.
Jadi tali -
Perkara yang menyedihkan adalah saya mempunyai monitor di sana di mana saya
dapat dilihat bahawa.
>> Baiklah, jadi rentetan s adalah apa yang Saya dilaporkan sebelum ini.
Tetapi ternyata, terima kasih kepada sedikit sihir dalam perpustakaan CS50, semua ini
rentetan masa telah benar-benar menjadi bintang char.
Bintang itu lagi bermakna penunjuk atau alamat.
Hakikat bahawa ia mengapitnya yang perkataan char bermakna ia adalah
alamat watak.
>> Jadi, jika mendapatkan rentetan dipanggil, dan saya menaip di H-E-L-L-O, mencadangkan kini apa yang telah mendapatkan
tali benar-benar telah kembali semua masa ini, walaupun kita telah agak
terlalu dipermudahkan dunia?
Apa yang tidak mendapat tali sebenarnya kembali sebagai nilai pulangan?
>> 123 dalam kes ini, misalnya.
Sebelum ini kami telah berkata bahawa mendapatkan tali hanya mengembalikan rentetan, satu turutan
watak-watak.
Tetapi itu sedikit dusta putih.
Cara mendapatkan tali benar-benar berkesan di bawah hud adalah ia mendapat
rentetan daripada pengguna.
Ia plops watak-watak yang dia jenis dalam ingatan.
Ia meletakkan sifar garis sendeng terbalik di hujung mereka jujukan aksara.
>> Tetapi apa yang tidak mendapat tali benar-benar kembali?
Ia benar-benar kembali alamat bait pertama dalam RAM yang
ia digunakan untuk kekuatan itu.
Dan ternyata bahawa hanya dengan kembali alamat tunggal
aksara pertama dalam rentetan, iaitu yang mencukupi untuk mencari keseluruhannya
tali.
>> Dalam erti kata lain, dapatkan tali tidak mempunyai untuk kembali 123 dan 124 dan 125.
Ia tidak perlu untuk memberikan saya yang panjang senarai semua bait yang
rentetan saya menggunakan.
Kerana satu, mereka semua kembali ke belakang.
Dan dua, berdasarkan alamat yang pertama, saya boleh memikirkan di mana tali berakhir.
Bagaimana?
>> Watak null khas, backslash sifar pada akhir.
Jadi, dalam erti kata lain, jika anda meninggal sekitar -
dalam pembolehubah -
alamat yang char, dan anda menganggap bahawa pada akhir mana-mana tali, apa-apa
jujukan aksara seperti yang kita manusia berfikir tali, jika anda menganggap bahawa
pada akhir mana-mana tali itu tidak sifar backslash, anda emas.
Kerana anda sentiasa boleh mencari akhir rentetan.
>> Sekarang apa yang benar-benar kemudian pergi di dalam program ini?
Mengapa program ini, istimewa-0.c, kereta?
Apa yang sebenarnya sedang berbanding?
Ya?
>> PELAJAR: [didengar].
>> DAVID MALAN: Tepat sekali.
Ia membandingkan lokasi daripada tali-tali.
Jadi, jika pengguna telah ditaip dalam hello sekali, seperti yang saya lakukan, ingatan mungkin berakhir
kelihatan seperti ini.
Jika pengguna itu jenis dalam hello lagi, tetapi dengan memanggil mendapatkan tali lagi, c ialah
tidak begitu bijak melainkan jika anda mengajar ia menjadi pandai dengan menulis kod.
>> C -
dan komputer secara umum -
jika anda menaip perkataan hello lagi, anda tahu apa yang anda akan mendapat.
Anda hanya akan mendapat pelbagai kedua ingatan bahawa, ya, yang berlaku menjadi
menyimpan H-E-L-L-O dan sebagainya.
>> Ia akan kelihatan sama untuk kita manusia, tetapi alamat ini
mungkin tidak 123.
Ia mungkin hanya begitu berlaku bahawa sistem operasi mempunyai beberapa didapati
ruang untuk contoh di lokasi -
mari kita mengatakan sesuatu yang sewenang-wenangnya, seperti ini adalah lokasi 200.
Dan ini adalah lokasi 201.
Dan ini adalah lokasi 202.
Kami tidak tahu di mana itu akan berada dalam ingatan.
>> Tetapi apa yang ini bermakna adalah bahawa apa yang akan disimpan akhirnya di s?
Nombor 123.
Apa yang akan disimpan di dalam t, dalam contoh ini sewenang-wenangnya?
Nombor 200.
Dan semua ini bermakna maka adalah jelas, 123 tidak sama 200.
Dan sebagainya ini jika keadaan tidak dinilai sebagai benar.
Kerana tali get menggunakan berbeza ketulan memori setiap kali.
>> Sekarang kita boleh melihat ini lagi dalam contoh yang lain.
Biar saya pergi ke hadapan dan membuka salinan 0.c.
Saya menuntut bahawa contoh ini akan cuba - tetapi gagal - untuk menyalin dua tali
seperti berikut.
>> Saya akan mengatakan sesuatu kepada pengguna.
Saya kemudian pergi untuk mendapatkan tali dan memanggilnya s.
Dan kini, saya melakukan pemeriksaan ini di sini.
Yang telah dinyatakan ini kembali sementara.
Tetapi apabila mungkin mendapat tali pulangan batal, lain aksara khas, atau khas
simbol mari kita katakan.
Jika ia daripada ingatan.
>> Sebagai contoh, jika pengguna adalah benar-benar menjadi sukar dan jenis yang kejam
beberapa watak-watak di papan kekunci dan hits Enter.
Jika nombor yang watak-watak tidak boleh dimuatkan dalam RAM untuk apa gila
sebab, dan mendapatkan tali mungkin baik kembali null.
>> Atau jika program anda sendiri melakukan banyak perkara-perkara lain dan tidak hanya
tidak memori yang cukup untuk rentetan get untuk berjaya, Ia mungkin berakhir
sehingga kembali null.
Tetapi mari kita lebih tepat tentang apa ini.
Apakah s ini jenis data benar-benar?
Bintang Char.
>> Jadi ternyata kini kita boleh mengupas menyokong lapisan null.
Rupa-rupanya, adalah batal - ya, jelas simbol khas.
Tetapi apa yang ia benar-benar?
Benar-benar, batal hanya simbol yang kita manusia digunakan untuk mewakili sifar juga.
>> Jadi pengarang C, dan komputer lebih umum, memutuskan tahun yang lalu
bahawa, anda tahu apa.
Mengapa kita tidak memastikan bahawa tidak ada pengguna data yang pernah, pernah, pernah
disimpan pada sifar bye?
Malah, dalam contoh saya sewenang-wenangnya sebelum ini, saya tidak bermula penomboran
bait pada sifar.
Saya mula pada satu.
Kerana saya tahu bahawa orang-orang di dunia telah membuat keputusan untuk menempah sifar
bait dalam RAM sesiapa sahaja sebagai sesuatu yang istimewa.
>> Sebab itu, bila-bila masa anda mahu isyarat bahawa sesuatu telah silapnya
berkenaan dengan alamat, anda kembali null - atau dikenali sebagai sifar -
dan kerana anda tahu bahawa tidak ada legit data di alamat sifar, jelas
yang bermaksud ralat.
Dan itulah sebabnya kita, oleh konvensyen, daftar for null dan pulangan sesuatu
seperti dalam kes-kes.
>> Jadi, jika kita tatal ke bawah sekarang, ini adalah hanya maka beberapa pemeriksaan ralat, hanya dalam kes
sesuatu yang tidak kena dengan [? menyelamatkan?]
sama sekali dan berhenti program dengan kembali awal.
Keturunan ini kini boleh ditulis semula seperti ini, yang bermaksud apa?
Pada sebelah kiri, memberi saya satu lagi penunjuk kepada watak, dan memanggilnya t.
Apa yang saya menyimpan dalam t, berdasarkan on-line ini salah satu kod?
>> Saya menyimpan lokasi.
Khususnya lokasi yang berada di s.
Jadi, jika pengguna telah ditaip dalam hello, dan yang pertama hello berlaku berakhir
di sini, kemudian 123 nombor adalah akan kembali dari mendapatkan
rentetan dan disimpan -
seperti yang kita katakan tadi -
dalam s.
>> Apabila saya kini mengisytiharkan penunjuk lain untuk t char dan memanggilnya, apa nombor adalah
benar-benar akan berakhir pada t mengikut cerita?
Jadi 123.
>> Jadi secara teknikal kini kedua-dua s dan t menunjuk kepada yang tepat
ketulan sama ingatan.
Jadi notis apa yang saya akan lakukan sekarang untuk membuktikan bahawa program ini adalah kereta.
>> Pertama saya akan mendakwa, dengan f cetak, kesempatan
salinan tali.
Kemudian saya akan melakukan sedikit Ralat menyemak.
Saya akan memastikan.
Mari kita pastikan bahawa rentetan adalah pada t kurangnya lebih besar daripada sifar panjang,
jadi ada beberapa watak terdapat untuk benar-benar mengambil kesempatan.
>> Dan kemudian anda mungkin ingat ini dari contoh sebelumnya.
2 atas - yang berada dalam fail ctype.h.
T sifar kurungan memberikan saya sifar watak rentetan t.
Dan 2 atas nilai yang sama, daripada Sudah tentu, menukarkan kepada huruf besar.
>> Jadi intuitif, ini selaras diketengahkan kod adalah kesempatan pertama
surat dalam t.
Tetapi ia tidak mengambil kesempatan, intuitif, huruf pertama dalam s.
Tetapi jika anda berfikir ke hadapan, apa yang saya kira-kira untuk melihat apabila saya menjalankan program ini
dan mencetak kedua-dua asal, s, dan salinan yang dipanggil, t?
>> Mereka sebenarnya akan sama.
Dan mengapa mereka akan sama?
Mereka kedua-dua menunjuk ke betul-betul perkara yang sama.
Jadi mari kita buat ini.
>> Buat sifar salinan.
Ia menyusun OK.
Izinkan saya menjalankan sifar salinan.
Izinkan saya menaip sesuatu seperti hello dalam semua huruf kecil kemudian tekan Enter.
Dan ia mendakwa bahawa kedua-dua s asal dan salinan memang serupa.
>> Jadi apa yang sebenarnya berlaku di sini?
Biar saya melukis gambar ini hanya untuk memberitahu cerita dalam
cara yang sedikit berbeza.
Apa yang benar-benar berlaku di bawah hud apabila saya mengisytiharkan sesuatu seperti
char permulaan s, atau tali s, Saya mendapat penunjuk -
yang berlaku kepada empat bait dalam perkakas CS50
dan dalam banyak komputer.
Dan saya akan memanggil s ini.
Dan ini kini mempunyai beberapa nilai yang tidak diketahui.
>> Apabila anda mengisytiharkan pembolehubah, melainkan jika anda diri anda meletakkan nilai di sana, yang
tahu apa yang ada.
Ia boleh menjadi beberapa urutan rawak bit dari pelaksanaan sebelumnya.
Oleh itu, apabila saya, selaras saya kod lakukan mendapat tali, dan kemudian menyimpan kembali
nilai s mendapatkan tali entah bagaimana -
dan akhirnya kita akan mengupas kembali bagaimana mendapatkan kerja-kerja tali, entah bagaimana memperuntukkan
array yang mungkin kelihatan sedikit seperti ini.
H-E-L-L-O, backslash sifar.
>> Mari kita andaikan bahawa ini adalah alamat 123 hanya konsisten pertama.
Jadi mendapatkan pulangan tali, dalam line diketengahkan di sana, ia mengembalikan
bilangan kita berkata, 123.
Jadi apa yang benar-benar berlaku di dalam s di sini?
>> Nah, apa yang benar-benar pergi dalam s adalah 123.
Tetapi terus-terang, saya mendapat sedikit keliru dengan semua alamat-alamat ini,
semua nombor-nombor ini sewenang-wenangnya.
123, 124, 127.
Jadi mari kita sebenarnya memudahkan dunia yang sedikit.
>> Apabila kita bercakap mengenai petunjuk, terus-terang, untuk kita manusia, yang palang pintu yang peduli di mana
perkara-perkara yang dalam ingatan?
Itu benar-benar sewenang-wenangnya.
Ia akan bergantung kepada berapa banyak RAM pengguna mempunyai.
Ia akan bergantung kepada apabila pada hari anda menjalankan program ini, mungkin, dan
apa input pengguna memberikan anda.
Kami kediaman pada butiran penting.
>> Jadi mari kita abstrak jauh dan mengatakan bahawa, apabila anda menjalankan baris kod seperti ini,
char bintang s mendapat pulangan nilai rentetan get.
Mengapa tidak kita bukan hanya menarik apa yang kita menyimpan memanggil penunjuk seolah-olah ia
menghala ke arah sesuatu?
Jadi saya menuntut sekarang bahawa s sehingga terdapat penunjuk -
bawah hud ia alamat.
Tetapi ia hanya menunjuk ke bait yang pertama di
tali itu telah dikembalikan.
>> Jika saya kini kembali kepada kod di sini, apa yang berlaku di garisan ini?
Nah, di dalam bidang ini menekankan sekarang, Saya mengisytiharkan nampaknya lain
ubah dipanggil t.
Tetapi ia juga penunjuk, jadi saya akan untuk menarik sebagai, dalam teori, yang tepat
kotak saiz yang sama.
Dan saya akan memanggilnya t.
>> Dan sekarang jika kita kembali kepada kod sekali lagi, apabila saya menyimpan s dalam t,
apa yang saya secara teknikal meletakkan dalam t?
Secara teknikal, ini adalah 123 nombor.
Jadi benar-benar saya perlu menulis 123 bilangan sana.
Tetapi mari kita mengambil tahap yang lebih tinggi.
t, jika ia hanya penunjuk, intuitif, hanya itu.
Itu semua itu menjadi disimpan di sana.
>> Jadi sekarang dalam barisan yang menarik lepas kod, apabila saya benar-benar pergi kira-kira
kesempatan watak sifar dalam t, apa yang berlaku?
Nah, t kurungan sifar kini menunjuk apa watak, mungkin?
>> Ia menunjuk ke h.
Kerana t kurungan sifar -
ingat, ini adalah sintaks lama. t kurungan sifar hanya bermakna jika t adalah rentetan, t
kurungan sifar bermakna mendapat sifar watak dalam kekuatan itu.
Jadi apa yang benar-benar bermakna adalah pergi ke pelbagai ini -
dan ya, ini mungkin 123, ini mungkin 124.
Tetapi itu semua relatif, ingat.
Apabila bercakap tentang pelbagai, kita mempunyai kelebihan bercakap tentang
indeks relatif.
>> Dan sekarang kita hanya boleh menganggap yang t kurungan sifar adalah h.
Jadi jika saya memanggil 2 atas pada itu, apa yang adalah benar-benar lakukan adalah kesempatan
h huruf kecil kepada huruf besar H. Tetapi sudah tentu, apa yang s?
Ia menunjuk kepada rentetan yang sama darn.
>> Jadi ini adalah semua itu telah berlaku dalam kod ini setakat ini.
Jadi apa yang kemudian implikasi?
Bagaimana kita menetapkan kedua-dua masalah?
Bagaimana kita bandingkan dengan tali sebenar?
>> Well intuitif, bagaimana akan kamu pergi membandingkan dua
tali untuk kesaksamaan benar?
>> Apa maknanya jika dua rentetan adalah sama?
Jelas tidak bahawa alamat mereka sama dalam ingatan, kerana itulah yang rendah
tahap pelaksanaan terperinci.
Semua watak-watak yang sama.
Jadi biarlah saya mencadangkan, dan biarlah saya memperkenalkan dalam versi salah satu compare.c
di sini, jadi bandingkan-1.c.
>> Biar saya mencadangkan bahawa kita masih mendapat penunjuk dipanggil s, dan kedai di dalamnya
mengembalikan nilai rentetan get.
Mari kita buat perkara yang sama dengan t.
Jadi tiada kod adalah berbeza.
Saya akan menambah sedikit lebih ralat memeriksa sekarang.
Jadi sekarang bahawa kita jenis mengupas kembali ini lapisan dalam CS50 apa tali
sebenarnya, kita perlu lebih dubur mengenai memastikan kita tidak menyalahgunakan
nilai yang tidak sah seperti null.
>> Jadi, saya hanya akan menyemak.
Jika s tidak batal sama dan t tidak batal sama, yang bererti kita OK.
Dapatkan tali tidak skru sehingga mendapat sama ada mereka tali.
Dan anda mungkin boleh meneka sekarang, apa tidak STR CMP mungkin lakukan?
Rentetan membandingkan.
>> Jadi jika anda telah dalam program java sebelum ini, ini adalah seperti kaedah yang sama dalam
kelas tali.
Tetapi bagi mereka yang tidak mempunyai diprogramkan sebelum ini,
ini adalah hanya satu fungsi c.
Ia berlaku kepada datang dalam file dipanggil string.h.
Itulah di mana ia diisytiharkan.
>> Dan rentetan Hotels.com -
Saya sebenarnya lupa penggunaannya, tetapi tidak pernah fikiran itu.
Ingat bahawa kita boleh lakukan manusia, kacau membandingkan.
Dan ini akan membawa sehingga Linux pengaturcara manual.
Dan ia adalah, terus-terang, sedikit samar.
Tetapi saya dapat melihat di sini bahawa, Ya.
Saya perlu termasuk string.h.
>> Dan ia mengatakan di sini di bawah Penerangan, "kata fungsi membandingkan tali membandingkan
dua tali S1 dan S2. "Dan S1 dan S2 adalah jelas kedua-dua
hujah-hujah yang diluluskan masuk
Saya tidak ingat apa yang malar, tetapi kini melihat -
dan anda mungkin telah melihat ini sudah apabila anda telah menggunakan laman lelaki jika anda
mempunyai semua -
bahawa bintang char hanya sinonim dengan tali.
>> Jadi ia membandingkan dua tali, S1 dan S2, dan ia mengembalikan integer yang kurang
daripada atau sama dengan atau lebih besar daripada sifar jika S1 ditemui, masing-masing, untuk menjadi
kurang daripada, atau perlawanan, atau lebih besar daripada S2.
Itu hanya satu cara yang sangat kompleks untuk mengatakan bahawa rentetan membandingkan pulangan
sifar jika dua rentetan intuitif sama, watak bagi
watak untuk watak.
>> Ia mengembalikan nombor negatif jika s, abjad, sepatutnya
datang sebelum t.
Atau mengembalikan nombor positif jika s sepatutnya datang selepas t
abjad.
Jadi dengan fungsi ini mudah, boleh anda, sebagai contoh, menyusun a
keseluruhan sekumpulan kata-kata?
>> Jadi dalam versi baru ini, saya akan untuk pergi ke hadapan dan membuat compare1.
Dot slash membandingkan satu.
Saya akan menaip hello dalam semua kes yang lebih rendah.
Saya akan menaip hello dalam semua huruf kecil lagi.
Dan bersyukur kerana kini ia menyedari Saya menaip perkara yang sama.
>> Sementara itu, jika saya menaip hello yang lebih rendah kes dan HELLO dalam huruf besar dan
membandingkan mereka, saya menaip perkara yang berbeza.
Kerana bukan sahaja alamat yang berbeza, tetapi kita membandingkan
watak yang berbeza lagi dan lagi.
>> Nah mari kita pergi dan menetapkan satu masalah lain sekarang.
Izinkan saya membuka versi salah satu salinan, yang kini menangani
isu ini seperti berikut.
Dan yang satu ini akan kelihatan sedikit lebih kompleks.
Tetapi jika anda berfikir tentang apa masalah yang kita perlu menyelesaikan, mudah-mudahan ini akan menjadi
jelas hanya dalam masa sekarang.
>> Jadi ini baris pertama, char permulaan t, dalam segi orang biasa itu boleh seseorang mencadangkan
apa baris ini di sini bermaksud?
Char bintang t, apakah yang lakukan?
>> Baik.
Buat penunjuk kepada beberapa tempat dalam ingatan.
Dan biarlah saya membaikinya sedikit.
Mengisytiharkan pembolehubah yang akan menyimpan alamat beberapa char dalam ingatan, hanya
untuk menjadi sedikit lebih betul.
>> OK, jadi sekarang pada sebelah kanan, saya telah tidak pernah melihat salah satu daripada fungsi-fungsi
sebelum ini, malloc.
Tetapi apa yang mungkin itu bermakna?
Peruntukan ingatan.
>> Jadi ternyata, sehingga sekarang, kita tidak benar-benar mempunyai cara yang kuat
meminta sistem operasi, memberi saya ingatan beberapa.
Sebaliknya, kita kini mempunyai fungsi yang dipanggil malloc yang tidak tepat itu.
Walaupun ini adalah sedikit gangguan sekarang, melihat bahawa di
antara kedua-dua kurungan adalah hanya akan menjadi nombor.
Di mana saya telah ditaip dalam soalan markah boleh menjadi nombor.
>> Dan bilangan yang bermaksud, memberi saya 10 bait.
Berikan saya 20 bait.
Berikan saya 100 bait.
Dan malloc akan melakukan yang terbaik untuk meminta sistem operasi -
Linux, dalam kes ini -
hey, adalah 100 bait mereka RAM boleh didapati?
Jika ya, mereka kembali bait kepada saya oleh kembali alamat yang mana satu
mereka bait, mungkin?
Yang pertama satu.
>> Jadi di sini juga - dan ini adalah utama dalam C, bila-bila masa anda
berurusan dengan alamat?
Anda hampir sentiasa berurusan dengan alamat yang mula-mula, tidak kira berapa besar
sebahagian memori anda sedang diserahkan kembali, jadi untuk bercakap.
>> Jadi mari menyelam di sini.
Saya cuba untuk memperuntukkan bagaimana banyak bait, sebenarnya?
Well.
Panjang rentetan s - mari melakukan satu contoh yang konkrit.
Jika s hello, H-E-L-L-O, apa panjang rentetan s, jelas?
Jadi ia adalah lima.
Tetapi saya melakukan campur 1 pada itu, mengapa?
Mengapa saya mahu enam bait dan bukannya lima?
Watak null.
>> Saya tidak mahu meninggalkan off ini watak null khas.
Kerana jika saya membuat salinan Hello dan hanya melakukan H-E-L-L-O, tetapi saya tidak meletakkan
watak yang istimewa, komputer mungkin tidak mempunyai, secara kebetulan, backslash a
sifar di sana untuk saya.
Dan jadi jika saya cuba untuk memikirkan panjang salinan itu, saya mungkin berfikir bahawa
ia adalah 20 perkataan, atau satu juta huruf jika saya hanya tidak pernah berlaku
mencecah sifar garis sendeng terbalik.
>> Jadi, kita perlu enam bait untuk menyimpan H-E-L-L-O, backslash sifar.
Dan kemudian ini hanya menjadi dubur super.
Katakan yang saya lupa apa saiz char adalah.
Kami terus mengatakan ia satu bait.
Dan ia biasanya.
Secara teori, ia boleh menjadi sesuatu yang berbeza, pada Mac yang berbeza atau
PC yang berbeza.
>> Jadi ternyata ada operator ini dipanggil sizeof bahawa jika anda meninggal ia
nama jenis data - seperti char, atau int, float atau -
ia akan memberitahu anda, dinamik, berapa banyak bait char mengambil di atas ini
komputer tertentu.
>> Jadi ini adalah berkesan hanya seperti mengatakan masa 1 atau
kali apa-apa.
Tetapi saya melakukannya hanya untuk dubur super, bahawa hanya dalam kes char yang berbeza
pada komputer berbanding lombong anda, cara ini matematik sentiasa akan menyemak.
>> Akhir sekali, ke sini saya memeriksa batal, yang sentiasa amalan yang baik - sekali lagi,
bila-bila masa kita berurusan dengan petunjuk.
Jika malloc tidak dapat memberikan saya enam bye - yang
tidak mungkin, tetapi hanya dalam kes -
kembali satu dengan segera.
Dan sekarang, teruskan dan salinan rentetan seperti berikut.
Dan ini adalah sintaks biasa, walaupun dalam peranan yang berbeza.
>> Saya akan pergi ke hadapan dan mendapatkan tali panjang s dan menyimpannya dalam n.
Saya kemudian akan melelar dari i sama sifar sehingga dan termasuk n,
lebih besar daripada atau sama dengan.
Supaya pada setiap lelaran, saya meletakkan watak i s dalam i
watak t.
>> Jadi apa yang benar-benar berlaku di bawah hud di sini?
Baik jika ini, sebagai contoh, adalah s -
dan saya telah ditaip dalam perkataan H-E-L-L-O dan ada sifar garis sendeng terbalik.
Dan sekali lagi, ini adalah s menunjuk sini.
Dan di sini sekarang ialah t.
>> Dan ini menunjukkan sekarang untuk salinan ingatan, betul?
Malloc telah memberikan saya satu keseluruhan sebahagian memori.
Saya tidak tahu apa yang pada mulanya dalam mana-mana lokasi ini.
Jadi, saya akan berfikir ini sebagai sejumlah besar tanda tanya.
>> Tetapi sebaik sahaja saya mula gelung dari sifar di atas melalui panjang s, t
kurungan sifar dan t kurungan 1 -
dan saya akan meletakkan ini kini di atas itu -
t kurungan sifar dan s kurungan sifar bermakna bahawa saya akan menyalin
iterative h di sini, E-L-L-O. Plus, kerana saya tidak campur
1, backslash sifar.
>> Jadi sekarang dalam kes-bandingkan 1.c, pada akhirnya, jika saya mencetak
Permodalan t, kita harus melihat bahawa s adalah tidak berubah.
Biar saya pergi ke hadapan sekarang dan melakukan ini.
Oleh itu, copy1.
Dot slash copy1.
Saya akan menaip hello, Enter.
Dan kini melihat, hanya salinan telah dipermodalkan.
Kerana saya benar-benar mempunyai dua ketulan ingatan.
>> Malangnya, anda boleh melakukan beberapa cantik perkara-perkara buruk dan cukup berbahaya di sini.
Biar saya tarik contoh di sini sekarang, yang memberikan kita satu contoh daripada beberapa
laluan yang berbeza.
Jadi hanya intuitif di sini, baris pertama kod, int bintang x, mengisytiharkan
berubah-ubah yang dipanggil x.
Dan apa jenis data pembolehubah itu?
Apakah jenis data yang berubah-ubah?
Yang tidak cliffhanger itu.
>> Jenis-jenis data int bintang.
Jadi apa maksudnya? x akan menyimpan alamat int an.
Semudah itu.
Y akan menyimpan alamat int an.
Apakah baris ketiga kod lakukan di sana?
Ia memperuntukkan berapa banyak bait, kemungkinan besar?
Empat.
Oleh kerana saiz adalah int umumnya empat, malloc empat memberikan
saya menyokong alamat sebahagian daripada memori, yang pertama bait yang merupakan
disimpan kini dalam x.
>> Sekarang kita bergerak sedikit cepat.
Bintang x bermaksud apa?
Ia bermaksud pergi ke alamat yang dan meletakkan apa nombor di sana?
Meletakkan nombor 42 di sana.
Bintang y bermakna pergi ke apa yang di y dan meletakkan nombor 13 di sana.
>> Tetapi tunggu satu minit.
Apa yang ada dalam y pada masa ini?
Apa yang alamat ialah y menyimpan?
Kita tidak tahu, kan?
Kami tidak pernah sekali menggunakan tugasan operator melibatkan y.
Jadi y seperti yang diisytiharkan pada baris kedua kod hanya beberapa nilai sampah, besar
tanda tanya jadi untuk bercakap.
Ia boleh menunjukkan secara rawak apa-apa jua dalam ingatan, yang
umumnya buruk.
>> Jadi sebaik sahaja kita mencapai garis yang ada, bintang y sama dengan 13, sesuatu yang buruk,
sesuatu yang sangat buruk adalah kira-kira berlaku kepada Binky.
Jadi mari kita lihat apa yang akan berakhir berlaku kepada Binky di sini di saat ini
atau lebih melihat.
>> [MAIN SEMULA VIDEO]
>> -Hey, Binky.
Bangun.
Ia adalah masa untuk bersenang-senang penunjuk.
>> -Apa itu?
Belajar mengenai petunjuk?
Oh, cenderahati.
>> -Nah, untuk memulakan, saya rasa kami akan memerlukan beberapa petunjuk.
>> -OK.
Kod ini memperuntukkan dua petunjuk yang boleh menunjukkan kepada integer.
>> -OK, baik, saya melihat kedua-dua petunjuk.
Tetapi mereka tidak seolah-olah menunjuk ke apa-apa.
>> -Itu betul.
Pada mulanya, petunjuk tidak menunjukkan apa-apa.
Perkara-perkara yang mereka menunjukkan dipanggil pointees, dan menetapkan mereka adalah
langkah berasingan.
>> -Oh, betul, betul.
Saya tahu bahawa.
The pointees adalah berasingan.
Jadi bagaimana anda memperuntukkan pointee a?
>> -OK.
Nah, kod ini memperuntukkan integer baru pointee, dan bahagian ini menetapkan x
untuk menunjukkan untuk itu.
>> -Hey, yang kelihatan lebih baik.
Oleh itu, ia melakukan sesuatu.
>> -OK.
Saya akan dereference penunjuk x untuk menyimpan nombor 42 ke pointee itu.
Untuk silap mata ini, saya akan perlu sihir saya tongkat penyahrujukan.
>> -Anda tongkat sihir penyahrujukan?
Eh, itu hebat.
>> -Ini adalah apa kod kelihatan seperti.
Saya hanya akan menubuhkan nombor, dan -
>> -Hey, melihat.
Terdapat ia pergi.
Jadi melakukan dereference pada x berikut anak panah untuk mengakses pointee itu.
Dalam kes ini, untuk menyimpan 42 di sana.
Hey, cuba menggunakan ia untuk menyimpan nombor 13 melalui penunjuk lain, y.
>> -OK.
Saya hanya akan pergi ke sini untuk y dan mendapatkan nombor 13 ditubuhkan.
Dan kemudian mengambil tongkat penyahrujukan dan hanya -
wah!
>> -Oh, hey.
Yang tidak bekerja.
Katakanlah, Binky, saya tidak fikir penyahrujukan y adalah idea yang baik,
kerana penubuhan pointee yang adalah satu langkah yang berasingan.
Dan saya tidak fikir kita pernah ia lakukan.
>> -Hmm.
Titik yang baik.
>> -Ya, kita diperuntukkan y penunjuk.
Tetapi kita tidak pernah menetapkan untuk menunjukkan pointee a.
>> -Hmm.
Sangat tajam.
>> -Hey, anda sedang mencari baik di sana, Binky.
Bolehkah anda menetapkan supaya y mata untuk pointee yang sama x?
>> -Pasti.
Saya akan menggunakan tongkat sakti saya tugasan penunjuk.
>> -Adakah itu akan menjadi masalah seperti sebelum ini?
>> -No.
Ini tidak menyentuh pointees.
Ia hanya menukar satu penunjuk untuk menunjukkan untuk perkara yang sama seperti yang lain.
>> -Oh, saya melihat.
Sekarang y mata kepada tempat yang sama dengan x.
Jadi tunggu.
Sekarang y ditetapkan.
Ia mempunyai pointee a.
Jadi, anda boleh cuba tongkat daripada penyahrujukan lagi
untuk menghantar 13 lebih.
>> -OK.
Di sini pergi.
>> -Hey, melihat itu.
Sekarang penyahrujukan kerja-kerja pada y.
Dan kerana petunjuk berkongsian pointee yang satu, mereka
kedua-dua melihat 13 itu.
>> -Ya.
Berkongsi.
Apa sahaja.
Jadi kita akan bertukar tempat ini?
>> -Oh, melihat.
Kami berada di luar masa.
>> -Tetapi -
>> -Hanya ingat tiga peraturan penunjuk.
Nombor satu, struktur asas adalah bahawa anda mempunyai penunjuk.
Dan ia menunjukkan kepada pointee a.
Tetapi penunjuk dan pointee adalah berasingan.
Dan kesilapan yang sama adalah untuk menubuhkan penunjuk, tetapi untuk
lupa untuk diberikan pointee a.
>> Nombor dua, penunjuk penyahrujukan bermula pada penunjuk dan berikut yang
arrow kepada mengakses pointee itu.
Seperti yang kita semua tahu, ini hanya berfungsi jika terdapat adalah pointee, yang mendapat kembali ke
memerintah nombor satu.
>> Nombor tiga, tugasan penunjuk mengambil salah satu penunjuk dan perubahan untuk menunjukkan
pointee sama dengan penunjuk lain.
Jadi selepas tugasan, kedua-dua petunjuk akan
menunjukkan pointee yang sama.
Kadang-kadang yang dipanggil perkongsian.
Dan itu semua ada padanya, benar-benar.
Bye bye sekarang.
>> [AKHIR VIDEO MAIN SEMULA]
>> DAVID MALAN: Jadi lebih kepada petunjuk, lanjut mengenai Binky minggu depan.
Kami akan melihat anda pada hari Isnin.