>> [MUSIC PLAYING]
>> Doug LLOYD: OK.
Kami telah bekerja dengan bilangan bulat, kami telah bekerja dengan karakter,
kami telah bekerja mengapung, ganda, string, dan bools.
Kami telah kehabisan hampir semua dari [tak terdengar] jenis yang
telah tersedia bagi kita semua bersama.
Tapi sekarang kami ingin melakukan sesuatu yang lebih.
Bagaimana kita melakukannya?
Bagaimana kita membuat jenis data yang berbeda?
Kita dapat melakukannya dengan menggunakan struktur.
Jadi struktur memungkinkan kita untuk menyatukan variabel dari berbagai jenis
menjadi satu, jenis variabel baru, yang dapat kita berikan nama jenisnya sendiri.
Ini adalah benar-benar kuat Hal yang dapat dilakukan,
karena sekarang kita dapat mengelompokkan elemen jenis data yang berbeda
bersama-sama yang memiliki koneksi logis.
Kami sudah mampu melakukan ini dengan array semacam, kan?
Kita bisa variabel kelompok dari tipe data yang sama
bersama-sama dalam sebuah unit besar memori, sebuah array.
>> Tapi kita belum mampu untuk mencampur up yang berbeda tipe data bersama-sama.
Kita tidak bisa, mengatakan, pasangan integer, dan karakter, dan ganda semua
dalam hal yang sama dan menyebut bahwa satu unit.
Tetapi dengan struktur, atau sering disebut sebagai struct,
kita benar-benar bisa.
Jadi struktur semacam seperti variabel yang super.
Ini adalah variabel yang berisi variabel lain di dalamnya.
Jadi di sini adalah contoh struktur yang sangat sederhana.
Ini adalah apa sintaks akan terlihat ingin membuat struktur untuk mobil.
Sekarang, mari kita pergi melalui sintaks di sini.
Struct, itulah kata kunci yang menunjukkan
bahwa saya sedang membuat tipe data baru di sini.
Secara khusus, nama tipe data adalah akan menjadi struct mobil, karena kami akan melihat.
Tapi ini adalah semacam tip off untuk compiler bahwa ini
sebagai kelompok variabel yang akan harus dianggap sebagai bagian dari jenis yang sama
dalam semenit.
>> Mobil, hanya nama struktur.
Sekali lagi, tipe data di sini akan menjadi mobil struct, bukan hanya mobil.
Tapi jika Anda memiliki different-- jika Anda membuat beberapa struct
dalam program yang sama, Anda perlu membedakan antara struct dan struct.
Jadi struct mobil, saya mungkin juga memiliki struct mahasiswa, misalnya,
dalam program yang sama.
Dalam kurung kurawal adalah semua yang disebut bidang,
atau anggota struktur.
Jadi apa adalah beberapa hal yang melekat di dalam mobil?
Nah, biasanya memiliki satu tahun, telah nama model, dan plat,
odometer yang biasanya memiliki beberapa jumlah mil di atasnya,
dan mungkin ukuran mesin.
Dan seperti yang Anda lihat, saya mencampur bilangan bulat dan karakter dan ganda.
Mereka semua akan menjadi bagian dari tipe data baru.
>> Terakhir, hal terakhir yang harus saya lakukan, jangan lupa titik koma kecil ini
pada akhirnya.
Setelah kami selesai mendefinisikan struktur, kita perlu menempatkan titik koma di akhir.
Ini adalah sintaksis sangat umum kesalahan, karena dengan fungsi,
misalnya, Anda hanya akan memiliki penjepit keriting terbuka, dekat penjepit keriting.
Anda tidak menaruh titik koma di akhir definisi fungsi.
Ini tampak seperti sebuah fungsi definisi, tapi tidak,
dan jadi titik koma ada hanya pengingat bahwa Anda
harus meletakkannya di sana, karena compiler akan dinyatakan tidak
tahu apa yang harus dilakukan dengan itu.
Ini adalah kesalahan yang sangat umum untuk sengaja membuat
ketika Anda pertama kali mendefinisikan struktur.
>> OKE.
Jadi kita biasanya menentukan struktur kami di bagian paling atas dari program kami
karena mereka mungkin akan untuk digunakan oleh beberapa fungsi.
Kami tidak ingin mendefinisikan struct dalam fungsi,
karena dengan begitu kita bisa only-- yang lingkup struktur benar
hanya ada dalam fungsi itu.
Kami mungkin ingin mendefinisikan struktur sehingga kita dapat menggunakannya dalam beberapa fungsi,
atau mungkin dalam beberapa file yang diikat bersama-sama
untuk membuat program tunggal kami.
Kadang-kadang juga sebaliknya mendefinisikan struktur
di bagian paling atas di mana Anda meletakkan Anda pon termasuk dan pound Anda mendefinisikan,
misalnya, Anda mungkin menempatkan mereka di file dot h terpisah, yang kemudian
pon termasuk diri Anda.
>> Jadi kita memiliki struktur, tapi sekarang kita perlu untuk mendapatkan dalam diri mereka.
Bagaimana kita mendapatkan dalam struktur akses
mereka sub-variabel, variabel-variabel yang ada di dalam struktur?
Yah, kita memiliki sesuatu yang disebut dot operator, yang memungkinkan kita
untuk mengakses bidang struktur.
Jadi misalnya, katakanlah saya sudah menyatakan Data struktur saya ketik di suatu tempat
di bagian atas program saya, atau mungkin di file dot h bahwa saya telah pound disertakan.
Jika saya kemudian ingin membuat baru variabel jenis data, saya dapat mengatakan,
struct mobil, mobil saya, titik koma.
Sama seperti saya bisa mengatakan int x, atau nama string yang koma.
>> Tipe data di sini adalah struct mobil, nama variabel adalah mobil saya,
dan kemudian saya bisa menggunakan dot operator untuk mengakses berbagai bidang mobil saya.
Jadi saya bisa mengatakan mobil saya dot tahun sama dengan 2011.
Itu baik-baik saja.
Tahun, jika Anda ingat, didefinisikan sebagai bidang bilangan bulat dalam struct mobil ini
tipe data.
Jadi setiap variabel data struct mobil jenis, seperti mobil saya, saya dapat mengatakan mobil saya
tahun dot sama dan kemudian menetapkan itu beberapa nilai integer, 2011.
Saya mobil dot piring sama CS50.
Saya kartu dot odometer sama dengan 50.505 titik koma.
Semua dari mereka adalah baik-baik saja dan itu
bagaimana kita mengakses bidang struktur.
Struktur, meskipun, tidak perlu yang akan dibuat di stack.
Sama seperti variabel lainnya, kita dinamis dapat mengalokasikan mereka.
Jika kita memiliki program yang mungkin akan menghasilkan banyak struktur,
kita tidak tahu berapa banyak kita akan membutuhkan,
maka kita perlu untuk secara dinamis mengalokasikan struktur mereka
sebagai program kami berjalan.
Dan jadi jika kita akan mengakses bidang struktur dalam konteks itu,
ingat bahwa pertama kita perlu dereference pointer ke struktur,
dan kemudian setelah kami dereference pointer, maka kita dapat mengakses ladang.
Jika kita hanya memiliki pointer ke struktur,
kita tidak bisa hanya mengatakan pointer dot bidang nama dan mendapatkan apa yang kita cari.
Ada langkah ekstra dari dereferencing.
Jadi mari kita mengatakan bahwa bukannya previous-- yang
seperti contoh sebelumnya, bukannya menyatakan itu
di stack, struct mobil, saya mobil, titik koma, saya katakan struct mobil,
bintang, pointer ke struct mobil yang disebut mobil saya,
sama dengan ukuran malloc dari struct mobil.
Ukuran kita akan mencari tahu berapa banyak byte tipe data baru Anda membutuhkan.
Anda tidak perlu hanya perlu menggunakan ukuran, lebar, int, atau char, atau
dari tipe data built-in.
Compiler cukup pintar untuk mengetahui berapa banyak byte
diperlukan oleh struktur baru Anda.
Jadi saya malloc sendiri unit memori cukup besar untuk mengadakan mobil struct,
dan saya mendapatkan pointer kembali ke blok memori,
dan pointer yang ditugaskan untuk mobil saya.
>> Sekarang, jika saya ingin akses bidang mobil saya,
Saya pertama kali dereference mobil saya menggunakan operator dereference, bintang
bahwa kita telah melihat dari pointer video, dan kemudian setelah saya dereference,
maka saya bisa menggunakan dot operator untuk mengakses berbagai bidang mobil saya.
Membintangi mobil saya dot tahun sama dengan 2011.
Yang akan memiliki efek kita inginkan dalam kasus ini,
karena kita sudah dinamis dialokasikan mobil saya.
>> Itu semacam menjengkelkan, meskipun, kan?
Ada proses 2-langkah sekarang.
Sekarang kita harus dereference-- kami memiliki operator bintang,
dan kami memiliki operator dot.
Dan seperti yang Anda harapkan, karena C programmer suka cara yang lebih pendek
melakukan hal-hal, ada cara yang lebih pendek untuk melakukan hal ini.
Ada operator lain yang disebut panah, yang membuat proses ini jauh lebih mudah.
Cara kerjanya adalah panah itu dereferences pertama
pointer di sebelah kiri sisi operator,
dan kemudian, setelah dereferenced pointer di sebelah kiri,
ia mengakses lapangan di sebelah kanan.
Dan sebelumnya kita punya semacam ini Star mobil saya dot semua hal ini,
seperti ada banyak terjadi di sana.
Tapi apa yang kita justru bisa lakukan adalah this-- saya tahun mobil panah sama 2011.
>> Sekali lagi, apa yang terjadi di sini?
Pertama, aku dereferencing mobil saya.
Yang lagi, adalah pointer di sini.
Kemudian, setelah dereferenced mobil saya, saya
kemudian dapat mengakses bidang tahun, piring, dan odometer
seperti aku bisa sebelum memiliki pertama digunakan bintang untuk dereference mobil saya,
dan dot untuk mengakses lapangan.
Sehingga Anda dapat memiliki struktur, Anda dapat memiliki pointer ke struktur,
dan Anda memiliki cara untuk mengakses bidang struktur tersebut,
apakah Anda memiliki pointer ke mereka atau variabel itu sendiri.
Dot atau panah, tergantung pada bagaimana variabel dideklarasikan.
Aku Doug Lloyd, ini CS50.