>> [Bermain muzik]
>> DOUG LLOYD: OK.
Kami telah bekerja dengan bilangan bulat, kami telah bekerja dengan watak-watak,
kami telah bekerja terapung, beregu, tali, dan bools.
Kami telah habis hampir semua yang [didengar] jenis yang
telah disediakan untuk kita semua bersama-sama.
Tetapi sekarang kita mahu melakukan sesuatu yang lebih.
Bagaimana kita berbuat demikian?
Bagaimana kita membuat pelbagai jenis data yang berbeza?
Kita boleh berbuat demikian dengan menggunakan struktur.
Jadi struktur membolehkan kita untuk menyatukan pembolehubah jenis
ke dalam satu, jenis pembolehubah baru, mana kita boleh memberikan nama jenis sendiri.
Ini adalah benar-benar kuat Perkara yang dapat dilakukan,
kerana kita kini boleh kumpulan elemen data berlainan jenis
bersama-sama yang mempunyai hubungan yang logik.
Kami telah mampu untuk melakukan ini dengan pameran jenis, bukan?
Kami kumpulan boleh pembolehubah jenis data yang sama
bersama-sama dalam unit yang besar memori, array.
>> Tetapi kami tidak mampu untuk bergaul sehingga jenis data yang berbeza bersama-sama.
Kita tidak boleh, berkata, pasangan integer, dan watak, dan dua semua
dalam perkara yang sama dan memanggil bahawa satu unit tunggal.
Tetapi dengan struktur, atau sering dirujuk sebagai structs,
kita benar-benar boleh.
Jadi struktur adalah jenis daripada seperti pembolehubah super.
Ia adalah satu pembolehubah yang mengandungi pembolehubah lain di dalamnya.
Jadi di sini adalah satu contoh struktur yang sangat mudah.
Inilah yang sintaks akan kelihatan suka untuk mewujudkan struktur untuk kereta.
Sekarang, mari kita pergi melalui sintaks di sini.
Struct, itulah kata kunci yang menunjukkan
bahawa saya mewujudkan jenis data baru di sini.
Khususnya, nama jenis data adalah akan menjadi kereta struct, seperti yang kita akan lihat.
Tetapi ini adalah jenis tip off untuk pengkompil bahawa ini
sebagai satu kumpulan pembolehubah yang akan untuk dianggap sebagai sebahagian daripada jenis yang sama
dalam satu minit.
>> Kereta, hanya nama struktur.
Sekali lagi, jenis data di sini akan menjadi kereta struct, bukan hanya kereta.
Tetapi jika anda mempunyai different-- jika anda membuat beberapa structs
dalam program yang sama, anda perlu membezakan antara struct dan struct.
Kereta supaya struct, saya juga mungkin mempunyai pelajar struct, sebagai contoh,
dalam program yang sama.
Di dalam pendakap kerinting adalah semua apa yang dikenali sebagai bidang,
atau anggota struktur.
Jadi apakah beberapa perkara yang wujud dalam kereta?
Nah, ia biasanya mempunyai setahun, telah nama model, dan plat lesen,
yang odometer yang biasanya mempunyai beberapa beberapa batu di atasnya,
dan mungkin saiz enjin.
Dan seperti yang anda lihat, saya mencampurkan integer dan watak-watak dan beregu.
Mereka semua akan menjadi sebahagian daripada jenis data baru ini.
>> Akhir sekali, perkara terakhir yang saya perlu lakukan, jangan lupa koma bertitik kecil ini
pada akhir.
Selepas kami selesai menentukan struktur, kita perlu meletakkan koma bernoktah di hujung.
Ia adalah satu sintaksis yang biasa kesilapan, kerana dengan fungsi,
sebagai contoh, anda hanya perlu kerinting terbuka, kerinting rapat.
Anda tidak meletakkan koma bernoktah di akhir definisi fungsi.
Ini kelihatan seperti fungsi definisi, tetapi tidak,
dan sebagainya koma bertitik terdapat hanya peringatan bahawa anda
perlu meletakkan ia di sana, kerana pengkompil akan sebaliknya tidak
tahu apa yang perlu dilakukan dengan ia.
Ia adalah satu kesilapan yang biasa sengaja membuat
apabila anda pertama mendefinisikan struktur.
>> OKAY.
Oleh itu, kita biasanya menentukan struktur kita di bahagian paling program kami
kerana mereka mungkin akan yang akan digunakan oleh pelbagai fungsi.
Kita tidak mahu untuk menentukan struct bahagian dalam fungsi,
kerana kita boleh only-- yang skop struktur benar-benar
hanya wujud di dalam fungsi itu.
Kami mungkin akan mahu menentukan struktur yang supaya kita boleh menggunakannya dalam pelbagai fungsi,
atau mungkin dalam pelbagai fail yang diikat bersama-sama
untuk mewujudkan program tunggal kami.
Kadang-kadang juga sebaliknya mentakrifkan struktur
di bahagian paling di mana anda meletakkan anda pound termasuk dan wang anda mentakrifkan,
sebagai contoh, anda mungkin meletakkan mereka dalam fail dot h berasingan, yang anda
pound termasuk diri sendiri.
>> Oleh itu, kita mempunyai struktur, tetapi sekarang kita perlu mendapatkan di dalam mereka.
Bagaimana kita mendapatkan bahagian dalam struktur untuk akses
mereka sub-pembolehubah, pembolehubah-pembolehubah yang wujud dalam struktur?
Nah, kita mempunyai sesuatu yang dipanggil pengendali titik, yang membolehkan kita
untuk mengakses bidang struktur.
Jadi, sebagai contoh, katakan saya telah diisytiharkan data struktur saya menaip di suatu tempat
di bahagian atas program saya, atau mungkin dalam titik h fail yang saya telah paun dimasukkan.
Jika saya kemudian mahu untuk mewujudkan baru pembolehubah yang jenis data, boleh saya katakan,
kereta struct, kereta saya, koma bertitik.
Sama seperti saya boleh mengatakan int x, atau nama rentetan koma bertitik.
>> Jenis data di sini adalah kereta struct, nama pembolehubah adalah kereta saya,
dan kemudian saya boleh menggunakan operator titik ke mengakses pelbagai bidang kereta saya.
Jadi saya boleh mengatakan kereta saya tahun dot sama 2011.
Yang betul-betul halus.
Tahun, jika anda masih ingat, ditakrifkan sebagai bidang integer dalam kereta struct ini
jenis data.
Jadi apa-apa ubah data struct kereta jenis, seperti kereta saya, saya boleh mengatakan kereta saya
tahun dot sama dan kemudian memberikan ia beberapa nilai integer, 2011.
Plat kereta dot My sama CS50.
Saya odometer kad dot sama dengan 50.505 koma bertitik.
Kesemua mereka adalah betul-betul halus dan itulah
bagaimana kita mengakses bidang struktur.
Struktur, walaupun, tidak perlu yang akan diwujudkan pada timbunan.
Sama seperti apa-apa ubah lain, kita dinamik boleh memperuntukkan mereka.
Jika kita mempunyai program yang mungkin dapat menjana banyak struktur,
kita tidak tahu berapa ramai kita akan perlukan,
maka kita perlu dinamik memperuntukkan struktur tersebut
kerana program kami sedang berjalan.
Dan jadi jika kita akan mengakses bidang struktur yang dalam konteks itu,
ingat bahawa pertama yang perlu kita dereference penunjuk kepada struktur,
dan kemudian sekali kita dereference yang penunjuk, maka kita boleh mengakses bidang.
Jika kita hanya mempunyai penunjuk kepada struktur,
kita tidak boleh hanya berkata bidang penunjuk dot menamakan dan mendapat apa yang kita cari.
Ada langkah tambahan sebanyak dereferencing.
Jadi mari kita mengatakan bahawa bukannya previous-- yang
seperti contoh sebelum ini, bukannya mengisytiharkan ia
pada timbunan, kereta struct, saya kereta, koma bertitik, saya katakan kereta struct,
bintang, penunjuk kepada kereta struct dipanggil kereta saya,
sama saiz malloc kereta struct.
Saiz kami akan memikirkan bagaimana banyak bait jenis data baru anda mengambil.
Anda tidak semestinya hanya perlu menggunakan saiz, lebar, int, atau char, atau mana-mana
satu jenis data terbina dalam.
Pengkompil cukup pintar untuk memikirkan berapa banyak bait
dikehendaki oleh struktur baru anda.
Jadi saya malloc diri saya satu unit memori cukup besar untuk mengadakan kereta struct,
dan saya mendapat penunjuk belakang itu blok ingatan,
dan penunjuk yang diberikan ke kereta saya.
>> Sekarang, jika saya mahu akses bidang kereta saya,
Saya mula-mula dereference kereta saya menggunakan pengendali dereference, bintang
yang kita lihat dari petunjuk video, dan kemudian selepas saya dereference,
maka saya boleh menggunakan operator titik ke mengakses pelbagai bidang kereta saya.
Bintang kereta saya dot tahun sama 2011.
Yang akan mempunyai kesan yang kita mahu dalam kes ini,
kerana kami telah dinamik diperuntukkan kereta saya.
>> Itulah jenis menjengkelkan, walaupun, bukan?
Ada proses 2 langkah sekarang.
Sekarang kita perlu dereference-- kita mempunyai operator bintang,
dan kami mempunyai operator titik.
Dan seperti yang anda jangkakan, kerana Pengaturcara C suka cara yang lebih pendek
untuk melakukan sesuatu, ada cara yang lebih pendek untuk melakukan ini.
Terdapat pengendali lain yang dipanggil anak panah, yang menjadikan proses ini lebih mudah.
Cara panah berfungsi ialah ia dereferences pertama
penunjuk di sebelah kiri sisi pengendali,
dan kemudian, setelah dereferenced penunjuk di sebelah kiri,
ia mengakses padang di sebelah kanan.
Dan sebagainya sebelum ini kita mempunyai seperti ini Star kereta saya dot semua barangan ini,
seperti ada banyak berlaku di sana.
Tetapi apa yang kita bukannya boleh lakukan ialah this-- saya kereta panah tahun sama 2011.
>> Sekali lagi, apa yang berlaku di sini?
Pertama, saya dereferencing kereta saya.
Yang sekali lagi, adalah penunjuk di sini.
Kemudian, selepas dereferenced kereta saya, saya
kemudian boleh mengakses bidang tahun, plat, dan odometer
hanya kerana saya boleh sebelum terlebih dahulu bintang digunakan untuk dereference kereta saya,
dan titik untuk mengakses lapangan.
Jadi, anda boleh mempunyai struktur, anda boleh mempunyai petunjuk untuk struktur,
dan anda mempunyai cara-cara untuk akses bidang struktur tersebut,
sama ada anda mempunyai petunjuk untuk mereka atau pemboleh ubah diri mereka sendiri.
Dot atau kekunci anak, bergantung kepada bagaimana pembolehubah telah diisytiharkan.
Saya Doug Lloyd, ini adalah CS50.