[Powered by Google Translate] Mari kita bicara tentang array.
Jadi mengapa kita pernah ingin menggunakan array?
Nah katakanlah Anda memiliki program yang perlu untuk menyimpan 5 ID mahasiswa.
Ini mungkin tampak masuk akal untuk memiliki 5 variabel yang terpisah.
Untuk alasan kita akan melihat dalam sedikit, kita akan mulai menghitung dari 0.
Variabel kita akan memiliki akan id0 int, int id1, dan sebagainya.
Setiap logika kita ingin tampil pada ID siswa akan perlu disalin dan disisipkan
untuk masing-masing ID mahasiswa.
Jika kita ingin memeriksa siswa kebetulan berada di CS50,
pertama-tama kita harus memeriksa apakah id0 mewakili siswa dalam kursus.
Kemudian untuk melakukan hal yang sama untuk mahasiswa berikutnya, kita harus copy dan paste kode untuk id0
dan mengganti semua kejadian dari id0 dengan id1 dan seterusnya untuk id2,, 3, dan 4.
>> Segera setelah Anda mendengar bahwa kita perlu copy dan paste,
Anda harus mulai berpikir bahwa ada solusi yang lebih baik.
Sekarang bagaimana jika Anda menyadari bahwa Anda tidak perlu 5 ID mahasiswa melainkan 7?
Anda perlu kembali ke kode sumber Anda dan menambahkan id5, suatu id6,
dan copy dan paste logika untuk memeriksa apakah ID milik kelas untuk 2 ID baru.
Tidak ada yang menghubungkan semua ID bersama-sama, sehingga tidak ada cara untuk meminta
program untuk melakukan hal ini untuk ID 0 sampai 6.
Nah sekarang Anda sadar bahwa Anda memiliki 100 ID mahasiswa.
Ini mulai tampak kurang dari ideal untuk perlu secara terpisah menyatakan masing-masing ID,
dan copy dan paste logika bagi mereka ID baru.
Tapi mungkin kami bertekad, dan kami melakukannya untuk semua 100 siswa.
Tapi bagaimana jika Anda tidak tahu berapa banyak siswa sebenarnya ada?
Hanya ada beberapa siswa n dan program Anda harus meminta pengguna apa yang n.
Uh oh. Ini tidak akan bekerja dengan baik.
Program Anda hanya bekerja untuk beberapa nomor konstan siswa.
>> Memecahkan semua masalah ini adalah keindahan array.
Jadi apa array?
Dalam beberapa bahasa pemrograman sebuah tipe array mungkin bisa melakukan sedikit lebih,
tetapi di sini kita akan fokus pada struktur data array dasar seperti yang Anda akan melihat dalam C.
Array adalah hanya blok besar memori. Itu saja.
Ketika kita mengatakan kita memiliki sebuah array dari 10 bilangan bulat, itu hanya berarti kita memiliki beberapa blok
memori yang cukup besar untuk menampung 10 bilangan bulat terpisah.
Dengan asumsi bahwa integer adalah 4 byte, ini berarti bahwa sebuah array dari 10 bilangan bulat
adalah blok kontinu dari 40 byte memori.
Bahkan ketika Anda menggunakan array multidimensi, yang kita tidak akan masuk ke sini,
itu masih hanya blok besar memori.
Notasi multidimensi hanya kenyamanan.
Jika Anda memiliki 3 oleh 3 array multidimensi bilangan bulat,
maka program Anda akan benar-benar hanya memperlakukan ini sebagai blok besar dari 36 byte.
Jumlah total bilangan bulat adalah 3 kali 3, dan integer masing-masing membutuhkan 4 byte.
>> Mari kita lihat contoh dasar.
Kita bisa lihat di sini 2 cara yang berbeda dari array menyatakan.
Kita harus komentar 1 dari mereka keluar untuk program untuk mengkompilasi
karena kita mendeklarasikan x dua kali.
Kita akan melihat beberapa perbedaan antara 2 jenis deklarasi dalam sedikit.
Kedua garis mendeklarasikan array berukuran N,
di mana kita telah # define N sebagai 10.
Kita bisa dengan mudah meminta pengguna untuk bilangan bulat positif
dan digunakan yang bulat sebagai jumlah elemen dalam array kita.
Seperti contoh mahasiswa ID kami sebelumnya, ini adalah jenis seperti menyatakan 10 benar-benar terpisah
imajiner variabel, x0, x1, x2, dan seterusnya sampai xN-1.
Mengabaikan garis di mana kita mendeklarasikan array, perhatikan tanda kurung siku utuh
dalam untuk loop.
Ketika kita menulis sesuatu seperti x [3], yang saya hanya akan membaca sebagai x braket 3,
Anda dapat berpikir seperti meminta x3 imajiner.
Perhatikan dibandingkan dengan array berukuran N, ini berarti bahwa jumlah dalam kurung,
yang kita sebut indeks, bisa apa saja dari 0 sampai N-1,
yang merupakan total indeks N.
>> Untuk berpikir tentang bagaimana hal ini benar-benar bekerja
ingat bahwa array adalah sebuah blok besar memori.
Dengan asumsi bahwa integer adalah 4 byte, x seluruh array adalah blok 40 byte memori.
Jadi x0 mengacu pada 4 byte pertama dari blok.
X [1] mengacu pada 4 byte berikutnya dan seterusnya.
Ini berarti bahwa awal x adalah semua program yang pernah perlu untuk melacak.
Jika Anda ingin menggunakan x [400], maka program tahu bahwa ini setara
hanya 1.600 byte setelah dimulainya x.
Dimana kita mendapatkan 1.600 byte dari? Hanya saja 400 kali 4 byte per integer.
>> Sebelum pindah, itu sangat penting untuk menyadari bahwa dalam C
tidak ada penegakan indeks yang kita gunakan dalam array.
Blok besar kami hanya 10 bilangan bulat panjang, tapi tidak akan berteriak pada kita jika kita menulis x [20]
atau bahkan x [-5].
Indeks bahkan tidak harus nomor.
Hal ini dapat berupa ekspresi sewenang-wenang.
Dalam program ini kita menggunakan variabel i dari untuk loop untuk indeks ke array.
Ini adalah pola yang sangat umum, perulangan dari i = 0 sampai panjang array,
dan kemudian menggunakan i sebagai indeks untuk array.
Dengan cara ini Anda secara efektif loop atas seluruh array,
dan Anda dapat menetapkan untuk setiap tempat dalam array atau menggunakannya untuk beberapa perhitungan.
>> Pada bagian pertama untuk loop, i dimulai dari 0,
dan sehingga akan menetapkan ke tempat 0 dalam array, nilai 0 kali 2.
Kemudian saya bertahap, dan kami menetapkan tempat pertama dalam array nilai 1 kali 2.
Kemudian saya akan menambahkan lagi dan seterusnya sampai kita tetapkan untuk posisi N-1 dalam array
nilai N-1 kali 2.
Jadi kami telah membuat sebuah array dengan 10 angka pertama bahkan.
Mungkin evens akan menjadi nama yang sedikit lebih baik untuk variabel daripada x,
tapi itu akan memberikan hal-hal pergi.
Yang kedua untuk loop kemudian hanya mencetak nilai-nilai yang kita telah disimpan dalam array.
>> Mari kita coba jalankan program dengan kedua jenis deklarasi array
dan lihatlah output dari program.
Sejauh yang bisa kita lihat, program berperilaku dengan cara yang sama untuk kedua jenis deklarasi.
Mari kita juga kita lihat apa yang terjadi jika kita mengubah loop pertama untuk tidak berhenti di N
melainkan katakanlah 10.000.
Jalan di luar akhir array.
Ups. Mungkin Anda pernah melihat ini sebelumnya.
Sebuah kesalahan segmentasi berarti program Anda telah jatuh.
Anda mulai melihat ini ketika Anda menyentuh daerah memori Anda tidak boleh menyentuh.
Di sini kita menyentuh 10.000 tempat di luar awal x,
yang jelas adalah tempat di memori kita tidak harus menyentuh.
Jadi sebagian besar dari kita mungkin tidak akan sengaja menempatkan 10.000 bukannya N,
tapi bagaimana jika kita melakukan sesuatu yang lebih halus seperti mengatakan menulis kurang dari atau sama dengan N
dalam kondisi loop sebagai lawan kurang dari N.
Ingat bahwa array hanya memiliki indeks dari 0 sampai N-1,
yang berarti bahwa indeks N berada di luar akhir array.
Program ini tidak mungkin kecelakaan dalam kasus ini, tapi masih error.
Bahkan, kesalahan ini sangat umum bahwa ia memiliki nama itu sendiri,
off oleh 1 kesalahan.
>> Itu saja untuk dasar-dasar.
Jadi apa perbedaan utama antara 2 jenis deklarasi array?
Salah satu perbedaan adalah di mana blok besar memori berjalan.
Dalam deklarasi pertama, yang saya akan menelepon jenis braket-array,
meskipun hal ini tidak berarti nama konvensional,
ia akan pergi pada stack.
Sedangkan di kedua, yang saya akan menelepon jenis pointer-array, ia akan pergi di heap.
Ini berarti bahwa ketika kembali fungsi, array braket otomatis akan deallocated,
sedangkan saat Anda Eksplisit harus panggilan gratis pada array pointer
atau Anda memiliki kebocoran memori.
Selain itu, array braket sebenarnya tidak variabel.
Hal ini penting. Ini hanya simbol.
Anda dapat menganggapnya sebagai konstanta yang compiler memilih untuk Anda.
Ini berarti bahwa kita tidak dapat melakukan sesuatu seperti x + + dengan tipe braket,
meskipun ini adalah hal yang sah dengan tipe pointer.
>> Jenis pointer adalah variabel.
Untuk jenis pointer, kita memiliki 2 blok yang terpisah dari memori.
Variabel x itu sendiri disimpan dalam stack dan hanya pointer tunggal,
tapi blok besar memori disimpan di heap.
Variabel x pada stack hanya menyimpan alamat
dari blok besar memori di heap.
Salah satu implikasi dari hal ini adalah dengan ukuran operator.
Jika Anda bertanya untuk ukuran array braket, itu akan memberi Anda ukuran blok besar memori,
sesuatu seperti 40 byte,
tetapi jika Anda meminta untuk ukuran jenis pointer array,
akan memberikan ukuran variabel x itu sendiri, yang pada alat mungkin hanya 4 byte.
Menggunakan jenis pointer-array, adalah mustahil untuk secara langsung meminta
ukuran blok besar memori.
Hal ini biasanya tidak banyak pembatasan karena kita sangat jarang ingin ukuran
dari blok besar memori, dan biasanya kita dapat menghitung jika kita membutuhkannya.
>> Akhirnya, array braket terjadi untuk menyediakan kami dengan jalan pintas untuk menginisialisasi array.
Mari kita lihat bagaimana kita bisa menulis 10 bilangan bulat pertama bahkan menggunakan initilization pintas.
Dengan array pointer, tidak ada cara untuk melakukan jalan pintas seperti ini.
Ini hanyalah pengantar untuk apa yang dapat Anda lakukan dengan array.
Mereka muncul di hampir setiap program yang Anda tulis.
Mudah-mudahan Anda sekarang dapat melihat cara yang lebih baik melakukan contoh mahasiswa ID
dari awal video.
>> Nama saya Rob Bowden, dan ini adalah CS50.