DAVID Malan: Halo, dan selamat datang kembali ke CS50. Jadi ini adalah akhir minggu keempat. Hanya satu pengumuman pertama. Jadi yang disebut kelima hari Senin datang hari Senin mendatang. Ini adalah kesempatan untuk mengubah dari SAT / UNSAT ke nilai-huruf, atau dari Surat kelas SAT / UNSAT. Mengganggu, proses yang tidak memerlukan tanda tangan, karena Anda harus mengisi out salah satu add / drop bentuk pink. Karena secara teknis, SAT / UNSAT dan versi nilai-huruf memiliki nomor katalog yang berbeda. Tapi tidak ada masalah besar. Datang saja ke saya atau Rob atau Lauren pada titik apapun. Atau email kami jika Anda tidak memiliki jenis yang dari dokumen yang Anda butuhkan saat ini, dan kami pasti akan membantu Anda mengambil mengurus sebelum hari Senin. Baiklah, jadi hari ini - sebenarnya, ada sedikit gema. Bisakah kita nada saya turun sedikit? OK. Jadi hari ini, kami memperkenalkan topik dikenal sebagai pointer. Dan aku akan mengakui bahwa ini adalah salah satu topik yang lebih kompleks yang kita cenderung menutupi di kelas ini, atau benar-benar pengantar saja yang menggunakan C. Tetapi mengambil kata saya untuk itu, terutama jika pikiran Anda merasa sedikit lebih membungkuk hari ini dan di minggu-minggu mendatang. Ini tidak mewakili Anda mendapatkan lebih buruk ini itu hanya berarti bahwa itu adalah topik yang sangat canggih bahwa saya berjanji, beberapa minggu maka, akan tampak terlalu mencolok langsung dalam retrospeksi. Saya masih ingat sampai hari ini. Aku sedang duduk di Elliott Dining Hall, duduk di samping saya TF Nishat Mehta, yang merupakan penduduk dari Elliott rumah. Dan untuk beberapa alasan, ini topik hanya mengklik. Yang mengatakan bahwa saya juga berjuang dengan itu untuk beberapa jumlah waktu, tapi aku akan melakukan yang terbaik untuk membantu menghindari seperti berjuang dengan topik yang pada akhirnya cukup kuat. Bahkan, salah satu topik kita akan membahas dalam minggu-minggu yang akan datang adalah bahwa keamanan, dan bagaimana Anda dapat benar-benar mengeksploitasi mesin dengan cara yang tidak dimaksudkan. Dan orang-eksploitasi biasanya hasil dari bug, kesalahan yang kita orang membuat dengan tidak memahami beberapa dari pelaksanaan yang mendasari rincian melalui program mana yang dibuat. Sekarang untuk membuat ini tampak semua lebih user ramah, saya pikir saya akan memainkan 10 pratinjau kedua dari claymation kecil tokoh bernama Binky yang dibawa ke hidup dengan seorang teman kami di Stanford, Profesor Nick Parlante. Jadi izinkan saya untuk memberikan ini teaser dari Binky sini. [VIDEO PEMUTARAN] -Hei, Binky. Bangun. Sudah waktunya untuk pointer menyenangkan. -Apa itu? Pelajari tentang pointer? Oh, goodie. [END VIDEO PEMUTARAN] DAVID Malan: Itulah Stanford ilmu komputer. Jadi lebih pada datang. [Tepuk Tangan] DAVID Malan: Maaf, Nick. Jadi ingat bahwa terakhir kali kami berakhir pada cliffhanger ini benar-benar menarik dimana fungsi ini hanya tidak bekerja. Setidaknya intuitif, rasanya seperti itu harus bekerja. Cukup swapping nilai-nilai dari dua bilangan bulat. Tapi ingat bahwa ketika kita dicetak nilai-nilai asli dalam utama, satu dan dua, mereka masih satu dan dua dan bukan dua dan satu. Jadi biarkan aku benar-benar beralih ke alat. Dan Aku menulis sedikit kode tulang pada memajukan sini, di mana saya menyatakan bahwa x akan menjadi 1, y akan 2. Saya kemudian mencetak kedua mereka nilai-nilai dengan cetak f. Saya kemudian mengklaim di sini bahwa kita akan swap mereka. Aku meninggalkan tempat kosong di sini bagi kita untuk mengisi hari hanya dalam beberapa saat. Kemudian, aku akan mengklaim bahwa dua variabel telah bertukar. Lalu aku akan mencetak mereka keluar lagi. Dan mudah-mudahan, saya akan melihat 1, 2. 2, 1. Itulah super sederhana Tujuannya sekarang. Jadi bagaimana kita pergi tentang swapping dua variabel? Nah kalau saya mengusulkan di sini bahwa cangkir ini mungkin mewakili memori dalam komputer. Ini adalah beberapa gigitan, ini lain adalah beberapa gigitan. Bisakah kita relawan datang dan campuran kami beberapa minuman, jika familiar? Ayo up. Siapa nama Anda? JESS: Jess. DAVID Malan: Jess? Ayo up, Jess. Jika Anda tidak keberatan, kita harus menempatkan Google Kaca pada Anda sehingga kami dapat mengabadikan ini. OK, kaca. Merekam video. Dan OK, kita baik untuk pergi dengan Jess di sini. Baik. Senang bertemu Anda. Jadi apa yang saya ingin Anda lakukan di sini - jika Anda bisa, cukup cepat - hanya menuangkan kita setengah gelas jeruk jus dan setengah gelas susu, mewakili secara efektif angka 1 dalam satu cangkir dan 2 di Piala lain. Hal ini akan menjadi rekaman yang baik. JESS: Maaf. DAVID Malan: Tidak, tidak. Tidak apa-apa. Nice. Baiklah, jadi kami memiliki empat byte senilai jus jeruk. Kita akan menyebutnya nilai 1. Sekarang empat byte senilai susu. Akan menyebutnya nilai 2. Jadi x dan y masing-masing. Baiklah, jadi sekarang jika tugas di tangan - untukmu, Jess, di depan semua teman sekelas Anda - adalah untuk menukar nilai-nilai x dan y seperti bahwa kita ingin jus jeruk dalam cangkir lain dan susu dalam cangkir ini, bagaimana mungkin Anda - sebelum Anda benar-benar melakukan - pergi tentang melakukan ini? OK, bijaksana keputusan. Jadi, Anda perlu sedikit lebih banyak memori. Jadi mari kita mengalokasikan sementara cangkir, jika Anda mau. Dan sekarang melanjutkan untuk swap x dan y. Luar biasa. Jadi sangat baik dilakukan. Terima kasih banyak, Jess. Ini. Sebuah suvenir kecil. OK, jadi jelas, ide super sederhana. Benar-benar intuitif bahwa kita perlu sedikit lebih banyak ruang penyimpanan - dalam bentuk ini, cangkir - jika kita benar-benar ingin menukar kedua variabel. Jadi mari kita melakukan hal itu. Sampai di sini, di antara di mana saya mengklaim saya akan melakukan beberapa swapping, aku akan pergi ke depan dan menyatakan temp. Dan aku akan mengatur itu sama dengan, katakanlah, x. Lalu aku akan mengubah nilai x seperti Jess lakukan di sini dengan susu dan jus jeruk untuk menjadi sama dengan y. Dan aku akan mengubah y harus sama untuk tidak x, karena sekarang kita akan terjebak dalam lingkaran, melainkan temp. Dimana saya sementara - atau di mana Jess sementara menempatkan jus jeruk sebelum clobbering bahwa cangkir dengan susu. Jadi biarkan aku pergi ke depan sekarang dan membuat ini. Ini disebut noswap.c. Dan sekarang biarkan aku jalankan tanpa swap. Dan memang saya melihat, jika saya memperluas jendela sedikit, yang x 1, y adalah 2. Dan kemudian x adalah 2, y adalah 1. Tapi ingat bahwa pada hari Senin kita melakukan hal-hal sedikit berbeda dimana saya bukannya menerapkan fungsi pembantu, jika Anda mau, itu benar-benar batal. Aku menyebutnya bertukar. Saya memberikan dua parameter, dan aku menelepon mereka dan aku memanggil mereka b. Terus terang, aku bisa menelepon mereka x dan y. Tidak ada yang menghentikan saya dari melakukan hal itu. Tapi saya berpendapat itu kemudian sedikit ambigu. Karena ingat untuk hari Senin bahwa kita mengklaim bahwa parameter ini adalah salinan dari nilai-nilai lulus masuk Jadi itu hanya messes dengan Anda pikiran, saya berpikir, jika Anda menggunakan persis variabel yang sama. Jadi saya bukannya akan menelepon mereka dan b, hanya untuk kejelasan. Tapi kita bisa menyebut mereka yang paling apa pun yang kita inginkan. Dan aku akan copy dan paste efektif kode ini dari atas sana turun ke sini. Karena saya hanya melihat bahwa ia bekerja. Sehingga dalam kondisi yang cukup baik. Dan aku akan mengubah x ke, saya x ke, y saya untuk b dan y saya untuk b. Jadi dengan kata lain, logika yang sama persis. Hal yang sama persis yang Jess lakukan. Dan kemudian satu hal yang saya harus melakukan up sini, tentu saja, sekarang ini memanggil fungsi, atau memanggil fungsi ini. Jadi saya akan memanggil fungsi ini dengan dua input, x dan y, dan tekan Simpan. Baiklah, begitu mendasar hal yang sama. Bahkan, saya mungkin telah membuat program tidak perlu kompleks dengan menulis sebuah fungsi yang hanya mengambil sekitar enam baris kode sedangkan saya sebelumnya telah dilaksanakan ini hanya tiga. Jadi biarkan aku pergi ke depan sekarang dan remake ini, tidak membuat swap. Baiklah, aku mengacau di sini. Ini harus menjadi sebuah kesalahan yang Anda mungkin melihat semakin umum sebagai Anda program mendapatkan lebih kompleks. Tapi ada memperbaiki mudah. Mari saya gulir kembali ke sini. Dan apa kesalahan pertama yang saya lihat? Deklarasi implisit. Apa yang biasanya menunjukkan? Oh, aku lupa prototipe. Aku lupa untuk mengajarkan compiler bahwa pertukaran akan ada meskipun dia tidak ada di awal program. Jadi aku hanya akan mengatakan batal, swap, int, int b, titik koma. Jadi aku tidak akan reimplement itu. Tapi sekarang sesuai dengan apa yang di bawah sini. Dan perhatikan, tidak adanya titik koma di sini, yang tidak diperlukan bila pelaksana. Jadi biarkan aku remake ini, tidak membuat swap. Bentuk yang jauh lebih baik. Jalankan tanpa swap. Dan sialan. Sekarang kita kembali ke tempat kita berada pada hari Senin, di mana hal itu tidak bertukar. Dan apa penjelasan intuitif mengapa hal ini terjadi? Ya? SISWA: [Tak terdengar]. DAVID Malan: Tepat. Jadi a dan b adalah salinan dari x dan y. Dan pada kenyataannya, setiap kali Anda sudah memanggil fungsi sejauh yang melewati variabel seperti int - seperti swap mengharapkan di sini - kalian telah lewat di salinan. Sekarang berarti dibutuhkan sedikit waktu, sepersekian detik, untuk komputer untuk menyalin bit dari satu variabel ke dalam potongan-potongan yang lain. Tapi itu bukan masalah besar. Tapi mereka tetap salinan. Dan sekarang, dalam konteks swap, Saya malahan berhasil mengubah dan b. Bahkan, mari kita lakukan cepat kewarasan cek. Cetak f adalah% i, baris baru. Dan mari kita pasang di. Sekarang mari kita lakukan hal yang sama dengan b. Dan mari kita lakukan hal yang sama di sini. Dan sekarang, biarkan aku salin baris yang sama lagi di bawah fungsi setelah tiga baris saya menarik bisa dieksekusi, dan mencetak dan b lagi. Jadi sekarang mari kita buat ini, tidak membuat swap. Mari saya membuat jendela terminal sedikit lebih tinggi, sehingga kita bisa melihat lebih dari itu sekaligus. Dan menjalankan tanpa swap. x 1, y adalah 2. adalah 1, b 2. Dan kemudian, adalah 2, b adalah 1. Jadi itu bekerja, seperti Jess lakukan di sini dalam swap. Tapi tentu saja, itu tidak berpengaruh pada variabel utama. Jadi kami melihat trik dimana kita bisa memperbaiki ini, kan? Ketika Anda dihadapkan dengan scoping ini masalah, Anda hanya bisa menyepak bola dan membuat x dan y jenis variabel, bukan? Anda bisa membuat mereka global. Menempatkan mereka di bagian paling atas file seperti yang kita lakukan, bahkan dalam permainan 15. Kami menggunakan variabel global. Namun dalam konteks permainan 15, itu masuk akal untuk memiliki global variabel yang mewakili dewan, karena keseluruhan 15.c adalah semua tentang pelaksanaan pertandingan itu. Itulah yang ada file yang dapat dilakukan. Tapi dalam kasus ini di sini, aku memanggil fungsi swap. Saya ingin menukar dua variabel. Dan itu harus mulai merasa hanya ceroboh jika solusi untuk semua kami masalah ketika kita mengalami lingkup masalah adalah membuatnya global. Karena sangat cepat program kami adalah akan menjadi cukup berantakan. Dan kami melakukan itu sangat hemat sebagai hasil di 15.c. Tapi ternyata ada cara yang lebih baik sama sekali. Biarkan aku benar-benar kembali dan menghapus mencetak f, hanya untuk menyederhanakan kode ini. Dan biarkan aku mengusulkan bahwa ini memang buruk. Tapi kalau aku malah menambahkan beberapa tanda bintang dan bintang-bintang, aku malah dapat mengubah ini fungsi menjadi satu yang sebenarnya operasional. Jadi biarkan aku kembali ke sini dan mengakui mengatakan tanda bintang selalu sulit, jadi saya akan katakan. Aku akan mengaku untuk yang satu. Baik. Dan sekarang, apa yang akan saya yang bisa dilakukan? Jadi pertama-tama, aku akan menentukan bahwa bukan lewat sebuah int ke fungsi swap, aku bukan pergi untuk mengatakan bintang int. Sekarang, apakah bintang menunjukkan? Ini adalah gagasan pointer yang Binky, karakter claymation, adalah mengacu pada beberapa saat yang lalu. Jadi jika kita katakan int bintang, makna sekarang ini adalah bahwa tidak akan disahkan pada oleh nilainya. Ini tidak akan disalin masuk Sebaliknya, alamat adalah akan lulus masuk Jadi ingat bahwa dalam komputer Anda adalah sejumlah besar memori, jika dikenal sebagai RAM. Dan RAM yang hanya Seluruh sekelompok byte. Jadi jika Mac atau PC Anda memiliki dua gigabyte, Anda memiliki 2 miliar byte memori. Sekarang mari kita hanya menganggap bahwa hanya untuk menjaga hal-hal baik dan tertib, kami menetapkan alamat - nomor - setiap byte RAM di komputer Anda. Byte pertama dari orang-2 miliar adalah dengan angka nol. Yang berikutnya adalah nomor satu byte, nomor dua, semua jalan ke atas, dot dot dot, kira-kira 2 miliar. Sehingga Anda dapat jumlah byte memori dalam komputer Anda. Jadi mari kita asumsikan bahwa itulah yang kita maksud dengan alamat. Jadi, ketika saya melihat int bintang, apa yang terjadi untuk diteruskan ke Swap sekarang adalah alamat dari. Tidak nilainya, tapi apa pun pos nya alamat, sehingga untuk berbicara - lokasinya di RAM. Dan juga untuk b, aku akan untuk mengatakan hal yang sama. Int, bintang, b. Sebagai samping, secara teknis bintangnya bisa di lokasi lain. Tapi kita akan standarisasi pada bintang yang tepat di sebelah tipe data. Jadi bertukar tanda tangan sekarang berarti, memberi saya alamat int, dan panggilan alamat a. Dan memberi saya alamat lain dari int dan memanggil alamat b. Tapi sekarang kode saya di sini harus berubah. Karena jika saya menyatakan int suhu - yang masih bertipe int - tapi saya simpan di dalamnya, apa nilai? Untuk menjadi jelas, saya menempatkan dengan kode seperti ditulis sekarang? Aku menempatkan lokasi di. Tapi aku tidak peduli tentang lokasi sekarang, kan? Temp ada hanya Jess 'cangkir ketiga ada, untuk tujuan apa? Untuk menyimpan nilai. Susu atau jus jeruk. Tidak benar-benar menyimpan alamat salah satu dari hal-hal, yang merasa sedikit tidak masuk akal dalam hal ini nyata konteks dunia pula. Jadi benar-benar, apa yang saya inginkan untuk dimasukkan ke dalam suhu bukan alamat, tetapi isi. Jadi jika a adalah bilangan seperti 123, ini adalah byte 123 memori yang hanya kebetulan menduduki, bahwa nilai dalam kebetulan menempati. Jika saya ingin pergi ke alamat tersebut, Saya perlu mengatakan bintang. Demikian pula, jika saya harus mengubah apa di alamat, saya mengubah ini untuk memulai. Jika saya ingin menyimpan dalam apa yang di lokasi dengan apa yang ada di lokasi di b, b bintang bintang. Jadi singkatnya, bahkan jika hal ini tidak cukup tenggelam dalam namun - dan saya tidak akan mengharapkan bahwa itu akan begitu cepat - menyadari bahwa semua yang saya lakukan adalah awalan ini bintang untuk variabel saya, Pepatah tidak ambil nilai. Jangan mengubah nilai. Melainkan, pergi ke alamat tersebut dan mendapatkan nilai. Pergi ke alamat dan perubahan nilai di sana. Jadi sekarang biarkan aku gulir kembali ke atas, hanya untuk memperbaiki baris ini di sini, untuk mengubah prototipe untuk mencocokkan. Tapi aku sekarang perlu untuk melakukan satu hal lainnya. Secara intuitif, jika saya telah mengubah jenis argumen yang swap mengharapkan, apa lagi yang harus saya perubahan dalam kode saya? Ketika saya sebut swap. Karena sekarang, apa am Aku melewati untuk swap masih? Nilai x dan nilai y, atau susu dan jus jeruk. Tapi aku tidak ingin melakukan itu. Saya bukannya ingin lulus dalam apa? Lokasi x dan lokasi y. Apa alamat pos mereka, sehingga untuk berbicara. Jadi untuk melakukan itu, ada sebuah ampersand. Ampersand jenis terdengar seperti alamat. sehingga n, ampersand, alamat x, dan alamat y. Jadi disengaja yang kita gunakan ampersands saat memanggil fungsi tersebut, dan bintang-bintang ketika mendeklarasikan dan ketika menjalankan fungsinya. Dan hanya memikirkan ampersand sebagai alamat operator, dan bintang sebagai pergi ke sana Operator - atau, lebih benar, dereference operator. Jadi itulah seluruh banyak kata-kata hanya untuk mengatakan bahwa sekarang, mudah-mudahan, swap yang terjadi untuk menjadi benar. Biarkan aku pergi ke depan dan membuat - mari kita benar-benar mengubah nama file, jangan program ini masih bisa disebut tanpa swap. Saya menyatakan bahwa kita akan menyebutnya swap.c sekarang. Jadi membuat, swap. Dot, slash, swap. Dan sekarang memang, x 1, y adalah 2. Dan kemudian, x adalah 2, y adalah satu. Nah mari kita lihat apakah kita tidak bisa melakukan ini sedikit berbeda dengan apa yang terjadi di sini. Pertama, izinkan saya memperbesar kami menggambar layar di sini. Dan biarkan aku mengusulkan sejenak - dan setiap kali saya menarik di sini akan dicerminkan di sana sekarang - saya mengusulkan bahwa inilah sejumlah besar memori, atau RAM, dalam komputer saya. Dan ini akan menjadi nomor gigitan, katakanlah, 1. Ini akan menjadi byte nomor 2. Dan aku akan melakukan seluruh banyak lebih, dan kemudian sekelompok dot dot titik-titik untuk menunjukkan bahwa ada 2 miliar hal ini. 4, 5, dan sebagainya. Jadi ada lima pertama byte memori komputer saya. Baiklah? Sangat sedikit dari 2 miliar. Tapi sekarang aku akan mengusulkan berikut. Aku akan mengusulkan bahwa x akan menyimpan nomor 1, dan y akan untuk menyimpan nomor 2. Dan biarkan aku pergi ke depan sekarang dan mewakili nilai-nilai ini sebagai berikut. Mari kita lakukan ini sebagai berikut. Beri aku hanya satu detik. Satu detik. OK. Saya ingin membuat ini sedikit - mari kita lakukan ini lagi. Kalau tidak aku akan dan menggunakan angka yang sama, tidak sengaja, beberapa kali. Jadi supaya kita memiliki nomor yang berbeda bicarakan, mari kita sebut byte ini nomor 123, 124, 125, 126, dan dot dot dot. Dan biarkan aku mengklaim sekarang bahwa aku akan menempatkan nilai 1 di sini, dan nilai 2 di sini, atau dikenal sebagai x dan y. Jadi kebetulan bahwa ini adalah x, y ini. Dan hanya oleh beberapa kesempatan acak, komputer, sistem operasi, terjadi untuk menempatkan x di lokasi nomor 123. Dan y berakhir di lokasi 124 - sialan. Aku harus tetap ini. Oh man, aku benar-benar ingin melakukan ini? Ya, saya ingin memperbaiki ini dan b tepat tentang hari ini. Maaf, baru ini. 127, 131, dan aku tidak ingin menjadi ini kompleks, tapi mengapa saya mengubah angka di sana? Karena aku ingin ints untuk benar-benar menjadi empat byte. Jadi mari kita menjadi super anal tentang hal ini. Sehingga jika terjadi 1 ditangani 123, 2 tersebut akan berada di alamat 127 karena itu hanya 4 bye pergi. Itu saja. Dan kita akan melupakan semua alamat lain di dunia. Jadi x adalah di lokasi 123, y adalah di lokasi 127. Dan sekarang, apa yang saya benar-benar ingin lakukan? Ketika saya sebut tukar sekarang, apa sebenarnya terjadi? Nah, ketika saya sebut swap, aku lewat di alamat x dan alamat y. Jadi misalnya, jika dua buah kertas sekarang mewakili dua argumen a dan b untuk swap, apa aku akan menulis pada yang pertama ini, yang aku akan menelepon sebut sebagai? Tepat, 123. Jadi ini saya mengklaim adalah. Ini adalah parameter a. Aku menempatkan alamat x dalam sana. Apa itu? Apa itu? Tidak, tidak. Itu OK. Masih bagus, masih bagus. Jadi ini adalah. Dan sekarang bagian kedua kertas, ini akan menjadi b, dan apa yang aku akan menulis pada kertas ini? 127. Jadi satu-satunya hal yang berubah sejak menceritakan kami sebelumnya dari cerita ini adalah, daripada harfiah 1 dan 2, saya akan lewat di 123 dan 127. Dan aku sekarang akan dimasukkan ke dalam ini kotak ini, oke? Sehingga kotak hitam sekarang mewakili fungsi swap. Sementara itu, mari kita memiliki seseorang melaksanakan fungsi swap. Akankah seseorang di sini ingin menjadi relawan? Ayo up. Siapa nama Anda? Charlie. Baiklah, Charlie. Ayo up. Jadi Charlie akan bermain peran kotak hitam kami. Dan Charlie, apa yang saya ingin Anda lakukan sekarang menerapkan swap sedemikian rupa bahwa, mengingat dua alamat, Anda benar-benar akan untuk mengubah nilai. Dan aku akan berbisik di telinga Anda bagaimana menjalankan TV di sini. Jadi silakan, dan Anda kotak hitam. Jangkauan di sana. Nilai-nilai apa yang Anda lihat, dan nilai-nilai apa yang Anda lihat untuk b? CHARLIE: adalah 123 dan b adalah 127. DAVID Malan: OK, tepatnya. Sekarang berhenti di sana untuk sesaat. Hal pertama yang Anda akan lakukan sekarang, menurut kode - yang Sekarang saya akan menarik di layar - akan menjadi mengalokasikan sedikit sedikit memori yang disebut temp. Jadi aku akan pergi ke depan dan memberikan memori itu. Jadi, ini akan menjadi variabel ketiga bahwa Anda memiliki diakses Anda disebut temp. Dan apa yang Anda akan menulis pada potongan temp kertas? CHARLIE: Pointer, kan? DAVID Malan: OK, juga tidak tentu pointer. Jadi baris kode yang telah saya disorot pada sisi kanan, mari kita mulai dari sana. Dikatakan bintang. Jadi saat ini menyimpan nomor 123. Dan hanya intuitif, apa Apakah maksud star 123? Namun secara khusus, jika a 123, sebuah bintang berarti apa? Nilai dari. Atau lebih santai, pergi ke sana. Jadi biarkan aku mengusulkan bahwa, memegang dalam tangan Anda, pergi ke depan dan memperlakukan bahwa seolah itu peta. Dan berjalan sendiri ke komputer memori, dan menemukan kami apa yang di lokasi 123. Tepat. Jadi kita melihat di lokasi 123 adalah apa, jelas? OK, jadi apa nilai sekarang kau akan dimasukkan ke dalam suhu? Tepat. Jadi pergi ke depan dan melakukannya. Dan tulis nomor 1 pada sepotong kertas yang saat ini berjudul temp. Dan sekarang langkah berikutnya yang Anda akan mengimplementasikan akan menjadi apa. Nah, di sisi kanan baris kode yang berikutnya adalah bintang b. b, dari Tentu saja, menyimpan alamat. Yang membahas 127. Bintang b berarti apa, santai berbicara? Pergi ke lokasi tersebut. Jadi pergi ke depan dan menemukan kami apa di lokasi 127. OK. Tentu saja, di lokasi 127, masih nilai 2. Jadi apa yang Anda pergi sekarang toko pada apa pun di lokasi dalam? Jadi Bintang sarana pergi ke lokasi a. Apa lokasi yang? Tepat. Jadi sekarang, jika Anda ingin mengubah apa di lokasi itu - Aku akan pergi ke depan dan menjalankan penghapus di sini. Dan sekarang menempatkan kembali pada sikat. Nomor berapa yang Anda akan menulis dalam kotak kosong sekarang? Tepat. Jadi baris kode ini, harus jelas - biarkan saya berhenti sejenak apa yang Charlie lakukan dan menunjukkan di sini, apa yang dia saja dilakukan adalah menulis ke dalam kotak itu di lokasi 123 nilai yang sebelumnya di b. Dan sekarang kami telah diterapkan memang ini baris kedua kode. Sekarang sayangnya, ada masih tersisa satu baris. Sekarang apa yang ada di temp, secara harfiah? Ini jelas nomor satu. Itu bukan alamat. Ini hanya nomor, semacam variabel dari satu minggu. Dan sekarang ketika Anda mengatakan bintang b, yang berarti pergi ke alamat b, yang merupakan Tentu saja di sini. Jadi setelah Anda sampai di sana - Aku akan pergi ke depan dan menghapus apa yang sebenarnya ada - dan apa yang Anda akan menulis sekarang di 127 lokasi? CHARLIE: Temp, yang merupakan salah satu. DAVID Malan: Temp, yang merupakan salah satu. Dan apa yang terjadi pada suhu pada akhirnya? Yah, kita tidak benar-benar tahu. Kami tidak benar-benar peduli. Setiap kali kami telah menerapkan fungsi sejauh ini, setiap variabel lokal yang Anda miliki memang lokal. Dan mereka hanya menghilang. Mereka kembali oleh operasi sistem akhirnya. Jadi fakta bahwa suhu masih memiliki Nilai 1 adalah semacam fundamental tidak menarik bagi kami. Baiklah, jadi tepuk tangan jika kita bisa untuk Charlie. Sangat baik dilakukan. Baiklah, jadi apa lagi tidak ini berarti kita bisa lakukan? Jadi ternyata bahwa kita telah menceritakan kebohongan putih beberapa untuk beberapa waktu. Memang, ternyata string, sepanjang waktu ini, tidak benar-benar urutan karakter per se. Ini semacam adalah bahwa intuitif. Tapi secara teknis berbicara, tali adalah Jenis data yang kami nyatakan dalam yang CS50 perpustakaan untuk menyederhanakan dunia selama beberapa minggu pertama kuliah. Apa string sebenarnya adalah alamat dari karakter suatu tempat di RAM. Sebuah string adalah benar-benar angka, seperti 123 atau 127, yang terjadi untuk membatasi di mana string dimulai di memori komputer Anda. Tapi itu tidak mewakili String, per se, itu sendiri. Dan kita bisa melihat ini sebagai berikut. Biarkan aku pergi ke depan dan membuka beberapa kode yang salah contoh kode sumber saat ini. Dan aku akan pergi ke depan dan membuka up, katakanlah, bandingkan-0.c. Ini adalah program kereta yang akan dilaksanakan sebagai berikut. Pertama. Aku akan mengatakan sesuatu. Lalu aku akan pergi ke depan dan mendapatkan string dari pengguna dalam baris berikutnya. Lalu aku akan mengatakannya lagi. Lalu aku akan mendapatkan lain string dari pengguna. Dan perhatikan, aku menunjukkan salah satu string dalam variabel yang disebut s, dan lain string ini dalam variabel yang disebut t. Dan sekarang aku akan mengklaim, sangat cukup, bahwa jika s sama sama t, string adalah sama. Anda mengetik hal yang sama. Lain, senar bukan hal yang sama. Setelah semua, jika kita masukan dua ints, dua chars, dua mengapung, dua ganda, salah satu dari tipe data yang telah kita bicarakan sejauh ini untuk membandingkan mereka - ingat kami membuat sangat jelas beberapa waktu yang lalu bahwa Anda tidak melakukan ini, karena tanda sama tunggal tentu saja operator penugasan. Sehingga akan menjadi bug. Kami menggunakan tanda sama sama, yang memang membandingkan hal untuk kesetaraan sejati. Tapi saya mengklaim ini adalah kereta. Jika saya pergi ke depan dan membuat membandingkan nol, dan kemudian melakukan dot slash membandingkan nol. Dan aku mengetik, katakanlah, halo. Dan kemudian mari kita menyapa lagi. Secara harfiah hal yang sama, komputer klaim saya mengetik hal yang berbeda. Sekarang mungkin aku hanya salah tulis sesuatu. Aku akan mengetik nama saya saat ini. Maksudku, halo. Hello. Ini berbeda setiap waktu. Nah, kenapa begitu? Apa yang sebenarnya terjadi bawah tenda? Nah, apa yang sebenarnya terjadi di bawah tenda adalah string maka Saya mengetik yang pertama kalinya misalnya adalah kata halo, tentu saja. Tetapi jika kita merepresentasikan bawah kap mesin, ingat bahwa string dalam array. Dan kami telah mengatakan sebanyak di masa lalu. Jadi jika saya menggambar array seperti ini, aku akan mewakili sesuatu yang cukup mirip dengan apa yang kita lakukan beberapa saat yang lalu. Dan sebenarnya ada sesuatu khusus di sini, juga. Apa yang kita menentukan itu di akhir setiap tali? Ya, ini backslash nol, yaitu hanya cara untuk mewakili, harfiah, 00000000. Delapan bit 0 berturut-turut. Saya tidak tahu, terus terang, apa setelah ini. Itu hanya sekelompok RAM lebih dalam komputer saya. Tapi ini adalah sebuah array. Kami berbicara tentang array sebelumnya. Dan kita biasanya berbicara tentang array sebagai lokasi nol, lalu satu, lalu dua. Tapi itu hanya untuk kenyamanan. Dan itu sepenuhnya relatif. Ketika Anda benar-benar mendapatkan memori dari komputer, itu tentu saja setiap 2 miliar beberapa aneh byte, berpotensi. Jadi benar-benar di bawah tenda, selama ini, ya. Hal ini mungkin sangat baik menjadi braket nol. Tetapi jika Anda menggali lebih dalam di bawah kap mesin, itu benar-benar alamat nomor 123. Ini adalah alamat 124. Ini adalah alamat 125. Dan aku tidak mengacaukan saat ini. Ini sekarang satu byte terpisah untuk alasan apa? Seberapa besar adalah char? Char adalah hanya satu byte. Int biasanya empat byte. Jadi itulah mengapa saya membuat 123, 127, 131 dan sebagainya. Sekarang saya bisa menjaga matematika sederhana dan hanya melakukan ditambah 1. Dan ini sekarang apa yang sebenarnya terjadi di bawah tenda. Jadi, ketika Anda menyatakan sesuatu seperti ini, string s, ini sebenarnya - ternyata - arang star. Bintang, tentu saja, berarti alamat, pointer alias. Jadi alamat sesuatu. Apa itu alamat dari? Yah - Aku satu-satunya orang yang bisa melihat sangat hal penting saya sedang membuat, atau berpikir Saya sedang membuat. Jadi kata - hal yang menyedihkan adalah saya memiliki monitor di sana di mana aku bisa melihat itu. Baiklah, jadi string s adalah apa Saya menyatakan sebelumnya. Tapi ternyata, berkat sedikit sihir dalam CS50 perpustakaan, semua ini Waktu string yang memiliki harfiah menjadi bintang arang. Bintang lagi berarti pointer atau alamat. Fakta bahwa itu mengapit Kata arang berarti adalah alamat karakter. Jadi jika mendapatkan string disebut, dan saya ketik di H-E-L-L-O, mengusulkan sekarang apa yang telah mendapatkan string yang benar-benar telah kembali semua saat ini, meskipun kita sudah agak disederhanakan dunia? Apa mendapatkan string yang sebenarnya kembali sebagai nilai kembali? 123 dalam kasus ini, misalnya. Kita sebelumnya sudah mengatakan bahwa mendapatkan string yang hanya mengembalikan string, urutan karakter. Tapi itu sedikit kebohongan putih. Cara mendapatkan string yang benar-benar bekerja bawah tenda itu mendapat string dari pengguna. Ini menjatuhkan karakter yang dia jenis dalam memori. Ini menempatkan nol backslash di akhir dari mereka urutan karakter. Tapi kemudian apa yang mendapatkan tali harfiah kembali? Secara harfiah mengembalikan alamat dari byte pertama dalam RAM yang itu digunakan untuk kekuatan itu. Dan ternyata bahwa hanya dengan kembali satu alamat dari karakter pertama dalam string, yaitu cukup untuk menemukan keseluruhan string. Dengan kata lain, mendapatkan string tidak memiliki untuk kembali 123 dan 124 dan 125. Ini tidak harus memberi saya panjang daftar semua byte yang string saya menggunakan. Karena salah satu, mereka semua kembali ke belakang. Dan dua, berdasarkan pada alamat pertama, saya dapat mencari tahu di mana string berakhir. Bagaimana? Karakter null khusus, backslash nol di akhir. Jadi dengan kata lain, jika Anda lulus sekitar - dalam variabel - alamat char, dan Anda menganggap bahwa pada akhir string, setiap urutan karakter seperti yang kita manusia memikirkan string, jika Anda berasumsi bahwa pada akhir string apapun seperti ada nol backslash, kau emas. Karena Anda selalu dapat menemukan akhir string. Sekarang apa yang sebenarnya kemudian pergi di dalam program ini? Mengapa program ini, membandingkan-0.c, kereta? Apa yang sebenarnya sedang dibandingkan? Ya? SISWA: [Tak terdengar]. DAVID Malan: Tepat. Ini membandingkan lokasi dari string. Jadi jika pengguna telah mengetik hello setelah, seperti yang saya lakukan, memori mungkin berakhir terlihat seperti ini. Jika pengguna kemudian jenis dalam halo lagi, tapi dengan memanggil get tali lagi, c adalah tidak terlalu pintar kecuali Anda mengajar untuk menjadi pintar dengan menulis kode. C - dan komputer lebih umum - jika Anda mengetikkan kata halo lagi, Anda tahu apa yang Anda akan mendapatkan. Kau hanya akan mendapatkan array kedua memori yang, ya, terjadi menjadi menyimpan H-E-L-L-O dan sebagainya. Ini akan terlihat sama kita manusia, tetapi alamat ini mungkin tidak 123. Mungkin hanya begitu terjadi bahwa sistem operasi memiliki beberapa tersedia ruang misalnya di lokasi - katakanlah sesuatu yang sewenang-wenang, seperti ini adalah lokasi 200. Dan ini adalah lokasi 201. Dan ini adalah lokasi 202. Kami tidak tahu di mana itu akan berada di memori. Tapi apa ini berarti bahwa apa yang akan disimpan akhirnya di s? Nomor 123. Apa yang akan disimpan di t, dalam contoh ini sewenang-wenang? Nomor 200. Dan semua itu berarti kemudian jelas, 123 tidak sama dengan 200. Dan jadi ini jika kondisi tidak bernilai true. Karena get string menggunakan berbeda potongan memori setiap kali. Sekarang kita bisa melihat ini lagi dalam contoh lain. Biarkan aku pergi ke depan dan membuka copy-0.c. Saya menyatakan bahwa contoh ini akan coba - tapi gagal - untuk menyalin dua string sebagai berikut. Aku akan mengatakan sesuatu kepada pengguna. Saya kemudian akan mendapatkan tali dan menyebutnya s. Dan sekarang, aku melakukan cek ini di sini. Kami disebutkan ini beberapa waktu lalu. Tapi ketika mungkin mendapatkan null string kembali, karakter lain khusus, atau khusus simbol katakanlah. Jika keluar dari memori. Misalnya, jika pengguna benar-benar menjadi sulit dan jenis yang mengerikan jumlah karakter pada keyboard dan hit Enter. Jika jumlah karakter tidak bisa cocok dalam RAM untuk apa pun gila Alasannya, juga mendapatkan tali mungkin sangat baik kembali null. Atau jika program anda sendiri melakukan banyak hal-hal lain dan hanya ada tidak cukup memori untuk get string yang untuk berhasil, itu mungkin berakhir up kembali null. Tapi mari kita lebih tepat seperti apa ini. Apa s tipe data benar-benar? Bintang Char. Jadi ternyata sekarang kita dapat mengupas kembali lapisan null. Ternyata, null adalah - ya, jelas simbol khusus. Tapi apa itu benar? Sungguh, null hanyalah simbol bahwa kita manusia gunakan untuk mewakili nol juga. Jadi penulis C, dan komputer lebih umum, memutuskan tahun yang lalu yang, Anda tahu apa. Mengapa kita tidak memastikan bahwa tidak ada pengguna Data yang pernah, pernah, pernah disimpan pada bye nol? Pada kenyataannya, bahkan dalam contoh sewenang-wenang saya sebelumnya, saya tidak memulai penomoran byte nol. Saya mulai pada satu. Karena aku tahu bahwa orang di dunia telah memutuskan untuk memesan nol byte dalam RAM siapa pun sebagai sesuatu yang istimewa. Alasannya, kapan saja Anda mau sinyal bahwa sesuatu yang tidak beres berkaitan dengan alamat, Anda kembali nol - atau dikenal sebagai nol - dan karena Anda tahu bahwa tidak ada legit data pada alamat nol, jelas itu berarti kesalahan. Dan itulah mengapa kita, dengan konvensi, periksa for null dan kembali sesuatu seperti dalam kasus-kasus. Jadi jika kita gulir ke bawah sekarang, ini hanya kemudian beberapa pengecekan error, hanya dalam kasus sesuatu yang tidak beres dengan [? jaminan?] sama sekali dan keluar dari program dengan kembali awal. Baris ini sekarang bisa ditulis ulang karena hal ini, yang berarti apa? Di sisi kiri, beri aku lagi pointer ke karakter, dan menyebutnya t. Apa yang saya menyimpan dalam t, berdasarkan pada satu baris kode? Aku menyimpan lokasi. Khususnya lokasi yang berada di s. Jadi jika pengguna telah mengetik halo, dan yang pertama kali terjadi halo berakhir sini, maka nomor 123 adalah akan datang kembali dari mendapatkan merangkai dan disimpan - seperti yang kita katakan sebelumnya - di s. Ketika saya sekarang menyatakan pointer lain untuk char dan menyebutnya t, apa nomor yang harfiah akan berakhir di t menurut cerita? Jadi 123. Jadi secara teknis sekarang keduanya s dan t menunjuk ke tepat potongan yang sama dari memori. Jadi perhatikan apa yang akan saya lakukan sekarang untuk membuktikan bahwa program ini adalah kereta. Pertama aku akan mengklaim, dengan cetak f, memanfaatkan salinan string. Lalu aku akan melakukan sedikit kesalahan pemeriksaan. Aku akan memastikan. Mari kita pastikan bahwa string t berada pada setidaknya lebih besar dari nol panjang, jadi ada beberapa karakter ada untuk benar-benar memanfaatkan. Dan kemudian Anda mungkin ingat ini dari contoh sebelumnya. 2 atas - yang di file ctype.h. T braket nol memberi saya nol karakter dari string t. Dan 2 atas bahwa nilai yang sama, dari Tentu saja, mengkonversi ke huruf besar. Jadi secara intuitif, baris ini disorot kode adalah memanfaatkan pertama huruf di t. Tapi itu tidak memanfaatkan, intuitif, huruf pertama dalam s. Tapi jika Anda berpikir ke depan, apa yang aku akan melihat ketika saya menjalankan program ini dan mencetak baik asli, s, dan disebut copy, t? Mereka benar-benar akan menjadi sama. Dan mengapa mereka akan sama? Mereka berdua menunjuk ke hal yang sama. Jadi mari kita lakukan ini. Membuat salinan nol. Itu mengkompilasi OK. Biarkan aku menjalankan salinan nol. Biarkan saya ketik sesuatu seperti halo di huruf kecil semua kemudian tekan Enter. Dan mengklaim bahwa baik asli s dan copy memang identik. Jadi apa yang sebenarnya terjadi di sini? Mari saya redraw gambar ini hanya untuk menceritakan kisah dalam cara yang sedikit berbeda. Apa yang sebenarnya terjadi di bawah hood ketika saya menyatakan sesuatu seperti Char mulai s, atau string s, Saya mendapatkan pointer - yang terjadi menjadi empat byte dalam CS50 alat dan dalam banyak komputer. Dan aku akan menelepon s ini. Dan ini saat ini memiliki beberapa nilai yang tidak diketahui. Ketika Anda mendeklarasikan variabel, kecuali jika Anda sendiri memberikan nilai sana, yang tahu apa yang ada. Ini bisa menjadi beberapa urutan acak bit dari eksekusi sebelumnya. Jadi ketika saya, sejalan saya tidak mendapatkan kode tali, dan kemudian menyimpan return nilai dalam s mendapatkan string yang entah bagaimana - dan kami akan akhirnya mengupas bagaimana mendapatkan karya tali, entah bagaimana mengalokasikan array mungkin terlihat sedikit seperti ini. H-E-L-L-O, backslash nol. Mari kita mengira bahwa ini adalah alamat 123 hanya konsistensi pertama. Jadi bisa mengembalikan string, dalam disorot garis di sana, ia mengembalikan nomor kami berkata, 123. Jadi apa yang sebenarnya terjadi dalam s di sini? Nah, apa yang sebenarnya terjadi dalam s 123. Tapi terus terang, saya mendapatkan sedikit bingung dengan semua alamat ini, semua angka-angka ini sewenang-wenang. 123, 124, 127. Jadi mari kita benar-benar menyederhanakan dunia sedikit. Ketika kita berbicara tentang pointer, terus terang, untuk kita manusia, siapa sih yang peduli di mana hal-hal yang dalam memori? Itu benar-benar sewenang-wenang. Ini akan tergantung pada bagaimana banyak RAM pengguna memiliki. Ini akan tergantung pada saat hari Anda menjalankan program, mungkin, dan apa input pengguna memberi Anda. Kami tinggal pada detail penting. Jadi mari kita abstrak dan mengatakan bahwa, ketika Anda menjalankan baris kode seperti ini, Char star s mendapat pengembalian nilai get tali. Mengapa kita tidak bukan hanya menggambar apa yang kita terus menelepon pointer seolah itu menunjuk pada sesuatu? Jadi saya mengklaim sekarang bahwa terserah ada pointer - bawah tenda itu alamat. Tapi itu hanya menunjuk ke byte pertama dalam string yang telah dikembalikan. Jika saya sekarang kembali ke kode di sini, apa yang terjadi pada baris ini? Nah, di baris disorot sekarang, Saya menyatakan rupanya lain variabel yang disebut t. Tapi itu juga pointer, jadi saya akan menggambar sebagai, dalam teori, tepat kotak ukuran yang sama. Dan aku akan menyebutnya t. Dan sekarang jika kita kembali ke kode lagi, ketika saya menyimpan s dalam t, apa aku secara teknis menempatkan dalam t? Nah secara teknis, ini adalah nomor 123. Jadi benar-benar saya harus menulis nomor 123 di sana. Tapi mari kita bawa tingkat yang lebih tinggi. t, jika hanya pointer, intuitif, hanya itu. Itu semua yang menjadi disimpan dalam sana. Jadi sekarang dalam baris yang menarik lalu kode, ketika aku benar-benar pergi tentang memanfaatkan karakter nol di t, apa yang terjadi? Nah, t braket nol sekarang menunjuk apa karakter, mungkin? Ini menunjuk ke h. Karena t braket nol - ingat, ini adalah sintaks tua. t braket nol hanya berarti jika t adalah string, t braket nol berarti mendapatkan nol karakter dalam kekuatan itu. Jadi apa yang benar-benar berarti adalah pergi ke array ini - dan ya, ini mungkin 123, ini mungkin 124. Tapi itu semua relatif, ingat. Setiap kali berbicara tentang sebuah array, kita harus keuntungan berbicara tentang indeks relatif. Dan jadi sekarang kita hanya bisa berasumsi bahwa t braket nol h. Jadi jika saya sebut 2 atas di atasnya, apa yang benar-benar lakukan adalah memanfaatkan h huruf kecil ke huruf H. Tapi tentu saja, apa s? Ini menunjuk ke string sialan yang sama. Jadi ini adalah semua yang telah terjadi dalam kode ini sejauh ini. Jadi apa maka implikasinya? Bagaimana kita memperbaiki kedua masalah? Bagaimana kita dibandingkan dengan string yang sebenarnya? Nah intuitif, bagaimana Anda pergi tentang membandingkan dua string untuk kesetaraan yang sejati? Apa artinya jika dua string adalah sama? Jelas tidak bahwa alamat mereka sama dalam memori, karena itulah yang rendah tingkat implementasi detail. Semua karakter yang sama. Jadi biarkan saya mengusulkan, dan biarkan saya memperkenalkan dalam versi salah satu compare.c di sini, jadi membandingkan-1.c. Mari saya mengusulkan agar kita masih mendapatkan pointer disebut s, dan toko di dalamnya mengembalikan nilai dari get tali. Mari kita lakukan hal yang sama dengan t. Jadi tidak ada kode yang berbeda. Aku akan menambahkan sedikit lebih pengecekan error sekarang. Jadi sekarang kita semacam mengupas kembali ini lapisan dalam CS50 apa string sebenarnya, kita perlu lebih anal tentang memastikan kita tidak menyalahgunakan nilai-nilai yang tidak valid seperti null. Jadi aku hanya akan memeriksa. Jika s tidak nol sama dan t tidak nol yang sama, itu berarti kita OK. Dapatkan String tidak mengacaukan mendapatkan salah satu dari mereka string. Dan Anda mungkin bisa menebak sekarang, apa tidak STR CMP mungkin lakukan? String membandingkan. Jadi jika Anda sudah program java sebelumnya, ini adalah seperti sama dengan metode dalam kelas String. Namun bagi Anda yang belum diprogram sebelumnya, ini hanyalah sebuah fungsi c. Ini terjadi untuk datang dalam file yang bernama string.h. Itulah di mana itu dinyatakan. Dan tali membandingkan - Aku benar-benar lupa penggunaannya, tetapi tidak pernah keberatan. Ingatlah bahwa kita bisa melakukan manusia, aduk membandingkan. Dan ini akan memunculkan Linux programmer manual. Dan itu, terus terang, sedikit samar. Tapi aku bisa melihat di sini bahwa, yep. Saya harus menyertakan string.h. Dan dikatakan di sini di bawah deskripsi, "yang Fungsi membandingkan string yang membandingkan dua string S1 dan S2. "Dan S1 dan S2 rupanya dua argumen berlalu masuk Saya tidak begitu ingat apa yang const, tapi sekarang melihat - dan Anda mungkin telah melihat ini sudah ketika Anda telah menggunakan halaman manual jika Anda memiliki semuanya - bahwa bintang char adalah hanya identik dengan tali. Jadi membandingkan dua string, S1 dan S2, dan mengembalikan sebuah integer kurang dari atau sama dengan atau lebih besar dari nol jika S1 ditemukan, masing-masing, untuk menjadi kurang dari, atau cocok, atau lebih besar dari S2. Itu hanya cara yang sangat kompleks mengatakan string membandingkan pengembalian nol jika dua string yang intuitif identik, karakter karakter untuk karakter. Ia mengembalikan angka negatif jika s, abjad, seharusnya datang sebelum t. Atau mengembalikan sejumlah positif jika s seharusnya datang setelah t abjad. Jadi dengan fungsi sederhana ini, bisa Anda, misalnya, mengurutkan Seluruh sekelompok kata-kata? Jadi dalam versi baru ini, aku akan untuk pergi ke depan dan membuat compare1. Dot slash membandingkan satu. Aku akan ketik halo semua huruf kecil. Aku akan mengetik halo dalam semua huruf kecil lagi. Dan untungnya sekarang menyadari Aku mengetik hal yang sama. Sementara itu, jika saya ketik halo di bawah kasus dan HELLO dalam huruf besar dan membandingkan mereka, saya mengetik hal yang berbeda. Karena tidak hanya alamat yang berbeda, tapi kami membandingkan karakter yang berbeda lagi dan lagi. Nah mari kita pergi dan memperbaiki satu Masalah lain sekarang. Mari saya membuka salah satu versi fotokopi, yang sekarang alamat masalah ini sebagai berikut. Dan yang satu ini akan terlihat sedikit lebih kompleks. Tapi jika Anda berpikir tentang masalah apa yang kita perlu untuk memecahkan, mudah-mudahan ini akan menjadi jelas hanya dalam beberapa saat sekarang. Jadi ini baris pertama, char mulai t, di istilah awam bisa seseorang mengusulkan apa baris ini di sini berarti? Char star t, apa itu lakukan? Baik. Buat pointer untuk beberapa tempat dalam memori. Dan biarkan aku memperbaikinya sedikit. Mendeklarasikan variabel yang akan menyimpan alamat beberapa arang dalam memori, hanya menjadi sedikit lebih tepat. OK, jadi sekarang di sisi kanan, aku sudah pernah melihat salah satu fungsi sebelumnya, malloc. Tapi apa mungkin artinya? Alokasi memori. Alokasi memori. Jadi ternyata, sampai sekarang, kami belum benar-benar memiliki cara yang ampuh meminta sistem operasi, memberi saya beberapa memori. Sebaliknya, kita sekarang memiliki fungsi yang disebut malloc yang tidak tepat. Meskipun ini adalah sedikit gangguan sekarang, perhatikan bahwa dalam antara dua kurung adalah hanya akan menjadi nomor. Dimana aku mengetik dalam pertanyaan tanda dapat berupa angka. Dan angka tersebut berarti, memberi saya 10 byte. Beri aku 20 byte. Beri aku 100 byte. Dan malloc akan melakukan yang terbaik untuk meminta sistem operasi - Linux, dalam hal ini - hey, mereka adalah 100 byte RAM yang tersedia? Jika demikian, kembali mereka byte kepada saya oleh mengembalikan alamat dari mana mereka byte, mungkin? Yang pertama satu. Jadi di sini juga - dan ini adalah dominan di C, setiap kali Anda berurusan dengan alamat? Anda hampir selalu berhadapan dengan alamat tersebut pertama, tidak peduli seberapa besar sepotong memori Anda sedang diserahkan kembali, sehingga untuk berbicara. Jadi mari kita menyelam di sini. Saya mencoba untuk mengalokasikan berapa banyak byte, tepatnya? Yah. Panjang String s - mari kita melakukan contoh konkret. Jika s adalah halo, H-E-L-L-O, apa panjang string s, jelas? Jadi lima. Tapi aku melakukan ditambah 1 pada itu, mengapa? Mengapa saya ingin enam byte bukan lima? Null karakter. Saya tidak ingin meninggalkan off ini karakter null khusus. Karena jika saya membuat salinan Halo dan hanya melakukan H-E-L-L-O, tapi saya tidak menempatkan bahwa karakter khusus, komputer mungkin tidak memiliki, secara kebetulan, backslash nol ada untukku. Dan jadi jika saya sedang mencoba untuk mencari tahu Panjang kalimat, saya mungkin berpikir bahwa itu adalah 20 karakter, atau satu juta karakter jika saya hanya pernah terjadi untuk memukul nol backslash. Jadi kita perlu enam byte untuk menyimpan H-E-L-L-O, backslash nol. Dan kemudian ini hanya menjadi super anal. Misalkan saya lupa apa ukuran char adalah. Kami terus mengatakan itu satu byte. Dan biasanya. Secara teori, itu bisa menjadi sesuatu berbeda, pada Mac berbeda atau PC yang berbeda. Jadi ternyata ada operator ini disebut sizeof bahwa jika Anda lulus dengan nama tipe data - seperti char, atau int, atau mengambang - ini akan memberitahu Anda, dinamis, berapa banyak byte char a mengambil hal ini komputer tertentu. Jadi ini hanya efektif seperti mengatakan kali 1 atau kali tidak ada sama sekali. Tapi aku melakukannya hanya untuk menjadi super anal, bahwa hanya dalam kasus char a berbeda pada komputer Anda dibandingkan saya, cara ini matematika selalu akan memeriksa. Terakhir, di sini saya memeriksa null, yang selalu praktek yang baik - sekali lagi, setiap saat kita sedang berhadapan dengan pointer. Jika malloc tidak mampu memberikan saya enam bye - yang mungkin, tetapi hanya dalam kasus - kembali satu segera. Dan sekarang, maju dan menyalin string sebagai berikut. Dan ini adalah sintaks akrab, meskipun dalam peran yang berbeda. Aku akan pergi ke depan dan mendapatkan string panjang s dan menyimpannya dalam n. Saya kemudian pergi untuk beralih dari i sama nol sampai dengan n, lebih besar dari atau sama dengan. Sehingga pada setiap iterasi, saya menempatkan Karakter engan s di engan karakter t. Jadi apa yang sebenarnya terjadi di bawah kap di sini? Nah jika hal ini, misalnya, adalah s - dan saya telah mengetik kata H-E-L-L-O dan ada nol backslash. Dan lagi, ini adalah s menunjuk sini. Dan di sini sekarang adalah t. Dan ini menunjuk sekarang untuk salinan memori, kan? Malloc telah memberi saya seluruh sepotong memori. Saya tidak tahu awalnya apa di salah satu lokasi. Jadi aku akan menganggap ini sebagai sejumlah tanda tanya. Tapi begitu aku mulai perulangan dari nol ke atas melalui panjang s, t braket nol dan t braket 1 - dan aku akan menempatkan ini sekarang pada biaya overhead - t braket nol dan s braket nol berarti bahwa aku akan menyalin iteratif jam dalam sini, E-L-L-O. Plus, karena saya melakukan ditambah 1, backslash nol. Jadi sekarang dalam kasus membandingkan-1.c, pada akhirnya, jika saya mencetak kapitalisasi t, kita harus melihat bahwa s tidak berubah. Biarkan aku pergi ke depan sekarang dan melakukan hal ini. Jadi membuat COPY1. Dot slash COPY1. Aku akan mengetik halo, Enter. Dan sekarang perhatikan, hanya salinan telah dikapitalisasi. Karena aku benar-benar memiliki dua potongan memori. Sayangnya, Anda dapat melakukan beberapa cukup hal-hal buruk dan cukup berbahaya di sini. Biarkan aku menarik contoh di sini sekarang, yang memberi kita contoh beberapa baris yang berbeda. Jadi hanya intuitif sini, baris pertama kode, int star x, menyatakan variabel disebut x. Dan apa tipe data variabel itu? Apa jenis data variabel itu? Itu bukan cliffhanger tersebut. Tipe data int adalah bintang. Jadi apa artinya? x akan menyimpan alamat dari sebuah int. Sesederhana itu. Y akan menyimpan alamat int. Apa baris ketiga kode lakukan di sana? Ini mengalokasikan berapa banyak byte, kemungkinan besar? Empat. Karena ukuran int adalah umumnya empat, malloc empat memberikan saya kembali alamat sepotong memori, yang pertama dari yang byte disimpan sekarang x. Sekarang kita bergerak sedikit cepat. Bintang x berarti apa? Ini berarti pergi ke alamat tersebut dan menempatkan nomor berapa di sana? Masukan nomor 42 di sana. Bintang y berarti pergi ke apa yang di y dan memasukkan nomor 13 di sana. Tapi tunggu sebentar. Apa yang ada di y saat ini? Apa alamat y menyimpan? Kita tidak tahu, kan? Kami tidak pernah menggunakan tugas Operator yang melibatkan y. Jadi y sebagai dideklarasikan pada baris kedua Kode hanya beberapa nilai sampah, besar tanda tanya sehingga untuk berbicara. Ini bisa menunjuk secara acak untuk apa pun di memori, yang umumnya buruk. Jadi, segera setelah kita memukul garis yang ada, star y sama dengan 13, sesuatu yang buruk, sesuatu yang sangat buruk adalah tentang terjadi pada Binky. Jadi mari kita lihat apa yang akan berakhir terjadi pada Binky sini dalam satu menit ini atau lebih terlihat. [VIDEO PEMUTARAN] -Hei, Binky. Bangun. Sudah waktunya untuk pointer menyenangkan. -Apa itu? Pelajari tentang pointer? Oh, goodie. -Nah, untuk memulai, saya kira kita akan membutuhkan beberapa petunjuk. -OK. Kode ini mengalokasikan dua pointer yang dapat menunjukkan bilangan bulat. -OK, baik, saya melihat dua pointer. Tapi mereka tampaknya tidak menjadi menunjuk ke sesuatu. -Itu benar. Awalnya, pointer tidak menunjukkan apa pun. Hal-hal yang mereka menunjukkan disebut pointees, dan menyiapkannya adalah langkah terpisah. -Oh, benar, benar. Saya tahu itu. Para pointees terpisah. Jadi bagaimana Anda mengalokasikan sebuah Pointee? -OK. Nah, kode ini mengalokasikan bilangan bulat baru Pointee, dan bagian ini menetapkan x untuk menunjuk ke itu. -Hei, yang terlihat lebih baik. Jadi membuatnya melakukan sesuatu. -OK. Aku akan dereference pointer x untuk menyimpan nomor 42 ke Pointee nya. Untuk trik ini, saya perlu saya sihir tongkat dereferencing. -Anda tongkat sihir dereferencing? Eh, itu bagus. -Ini adalah apa yang tampak seperti kode. Aku hanya akan mengatur nomor, dan - -Hei, lihat. Ada kelanjutannya. Jadi melakukan dereference pada x berikut panah untuk mengakses Pointee nya. Dalam hal ini, untuk menyimpan 42 di sana. Hei, coba gunakan untuk menyimpan nomor 13 melalui pointer lain, y. -OK. Aku hanya akan pergi ke sini untuk y dan mendapatkan angka 13 mengatur. Dan kemudian mengambil tongkat dereferencing dan hanya - whoa! -Oh, hey. Itu tidak berhasil. Katakanlah, Binky, saya tidak berpikir dereferencing y adalah ide yang baik, karena menyiapkan Pointee merupakan langkah terpisah. Dan saya tidak berpikir kita pernah melakukannya. -Hmm. Good point. -Ya, kami mengalokasikan y pointer. Tapi kita tidak pernah set ke menunjuk ke sebuah Pointee. -Hmm. Sangat jeli. -Hei, yang Anda cari baik di sana, Binky. Dapatkah Anda memperbaikinya sehingga y poin ke Pointee sama dengan x? -Tentu. Saya akan menggunakan tongkat sihir saya penempatan penunjuk. -Apakah itu akan menjadi masalah seperti sebelumnya? -Tidak ada. Ini tidak menyentuh pointees. Itu hanya berubah satu pointer untuk menunjuk untuk hal yang sama seperti yang lain. -Oh, saya melihat. Sekarang y poin ke tempat yang sama dengan x. Jadi tunggu. Sekarang y adalah tetap. Memiliki Pointee a. Jadi Anda dapat mencoba tongkat dereferencing lagi untuk mengirim 13 lebih. -OK. Ini dia. -Hei, lihat itu. Sekarang dereferencing bekerja pada y. Dan karena pointer berbagi bahwa salah satu Pointee, mereka baik melihat 13 tersebut. -Ya. Berbagi. Apapun. Jadi kita akan bertukar posisi sekarang? -Oh, lihat. Kami kehabisan waktu. -Tapi - -Hanya ingat tiga aturan pointer. Nomor satu, struktur dasar adalah bahwa Anda memiliki pointer. Dan itu menunjukkan ke Pointee a. Tapi pointer dan Pointee terpisah. Dan kesalahan umum adalah untuk mengatur pointer, tetapi untuk lupa untuk diberikan Pointee a. Nomor dua, pointer dereferencing dimulai pada pointer dan berikut nya panah atas untuk mengakses Pointee nya. Seperti kita semua tahu, ini hanya bekerja jika ada adalah Pointee, yang akan kembali ke aturan nomor satu. Nomor tiga, penempatan penunjuk membutuhkan satu pointer dan perubahan untuk menunjuk ke yang Pointee sama dengan pointer lain. Jadi setelah penugasan, dua pointer akan menunjuk ke Pointee yang sama. Kadang-kadang disebut berbagi. Dan itu semua ada untuk itu, benar-benar. Bye bye sekarang. [END VIDEO PEMUTARAN] DAVID Malan: Jadi lebih pada pointer, lebih lanjut tentang Binky minggu depan. Kita akan melihat Anda pada hari Senin.