[Powered by Google Translate] Mari kita bicara tentang structs. Structs memberikan kami cara untuk mengelompokkan sekelompok variabel bersama-sama ke dalam suatu paket yang bagus. Ini mungkin paling mudah untuk melihat contoh langsung, jadi kita katakan struct, kemudian membuka brace keriting, dan dalam struct ini, kita akan memiliki usia int, nama char *, dan hanya itu. Ini mungkin tampak aneh dengan titik koma setelah tanda kurung kurawal, tapi itu sebenarnya diperlukan dengan struct. Tipe apapun yang benar bisa pergi dalam definisi struct. Di sini, kita telah menggunakan int dan char *, tetapi Anda juga bisa menggunakan array, katakanlah, 100 elemen atau bahkan struct lain. Bila Anda menggunakan structs di C, Anda sedang menciptakan jenis baru keluar dari koleksi jenis lainnya. Di sini, kita membuat jenis baru keluar dari integer dan char *. Seperti yang akan kita lihat nanti, jenis struct adalah dalam banyak cara yang setara dengan jenis lain yang Anda terbiasa. Biasanya, saya akan membandingkan bagaimana tipe struct mirip dengan tipe integer. Sedangkan kode yang kami tulis adalah C berlaku, itu tidak terlalu berguna, dan dentang akan memberi kita peringatan. Ingat bagaimana structs dan yang mirip? Nah, kita pada dasarnya hanya mengatakan int, yang bukan merupakan garis yang sangat membantu. Jadi mari kita benar-benar mendeklarasikan variabel dari jenis yang dengan memberikan nama sebelum titik koma. Kami akan memanggil si mahasiswa variabel. Sekarang kita sudah menyatakan seorang mahasiswa disebut variabel dengan tipe yang diberikan oleh struct. Bagaimana kita bisa sampai ke variabel di dalam struct? Secara teknis, nama-nama untuk variabel-variabel adalah anggota. Untuk mengakses setiap anggota tertentu dalam struct mahasiswa, Anda menambahkan sebuah titik ke nama variabel, diikuti oleh nama anggota yang Anda inginkan. Jadi di sini, hanya 2 kemungkinan berlaku adalah student.age dan student.name. Dan kita bisa melakukan sesuatu seperti student.age = 12 dan student.name = mahasiswa. Sekarang bagaimana jika kita ingin membuat mahasiswa kedua? Anda mungkin berpikir untuk menyalin dan menyisipkan baris-baris dan mengubah siswa kepada siswa 2 atau sesuatu, dan itu akan bekerja, tetapi secara teknis, pelajar dan mahasiswa 2 tidak memiliki tipe yang sama. Lihat, Anda tidak akan dapat menetapkan mereka untuk satu sama lain. Hal ini karena, sejauh ini, struct Anda telah anonim. Kita perlu untuk memberikan nama. Untuk melakukan itu, kita masukkan nama struct setelah struct kata. mahasiswa, diikuti oleh definisi. Kita masih bisa segera mendeklarasikan variabel jenis struct mahasiswa, seperti yang kami lakukan sebelumnya. Kita akan menyebutnya S1 Dengan memberikan struct nama, kita sekarang dapat menggunakan struct mahasiswa di hampir dengan cara yang sama kita akan menggunakan int. Jadi kita bisa mendeklarasikan variabel mahasiswa tipe struct, seperti struct mahasiswa S2. Seperti array, struct memberikan sintaks inisialisasi pintas, sehingga kita dapat mengatakan, struct mahasiswa S2 sama kiri keriting brace 3, S2. Di sini, S2.age akan 3, dan S2.name akan mengarah ke S2. Pikirkan semua hal yang dapat Anda lakukan dengan tipe int dan sebagian besar dari mereka dapat Anda lakukan dengan tipe mahasiswa struct. Kita dapat menggunakan struct mahasiswa sebagai jenis parameter fungsi. Kita dapat menggunakan mahasiswa struct dalam struct baru. Kita dapat memiliki pointer ke struct mahasiswa. Kita bisa melakukan ukuran mahasiswa struct. Struct mahasiswa adalah tipe seperti int adalah tipe. Kita juga dapat menetapkan S1 ke S2 karena keduanya adalah dari jenis yang sama, sehingga kami dapat melakukan S1 = S2. Apa yang terjadi jika kita melakukan S1.age = 10? Apakah perubahan S2 sama sekali? Sekali lagi, memikirkan structs seperti bilangan bulat biasa. Jika kita menetapkan beberapa X int untuk beberapa Y int, seperti X = Y dan kemudian mengubah X, seperti di X + +, Y tidak berubah sama sekali? Y tidak berubah di sini, dan begitu juga tidak S2 di atas. S2.age masih 3. Tetapi perhatikan bahwa ketika menetapkan satu struct yang lain, semua pointer masih menunjuk ke hal yang sama, karena mereka hanya disalin. Jika Anda tidak ingin pointer untuk dibagikan, Anda harus secara manual menangani itu, mungkin dengan malicking satu blok memori untuk salah satu pointer untuk menunjuk ke dan menyalin data di atas. Ini mungkin mengganggu harus menulis mahasiswa struct di mana-mana. Menggunakan def jenis, yang bisa kita lakukan Jenis def struct dan kita akan menyebutnya siswa. Sekarang, kita dapat menggunakan mahasiswa di mana-mana yang kita gunakan untuk menggunakan struct mahasiswa. Ini def jenis merupakan struct anonim dan menyebutnya siswa. Tetapi jika kita juga menjaga identifier mahasiswa sebelah struct kata, seperti dalam mahasiswa struct typedef, kita bisa menggunakan kedua mahasiswa struct dan siswa bergantian sekarang. Mereka bahkan tidak memiliki nama yang sama. Kita bisa mengetik mahasiswa struct def ke Bob dan kemudian struct mahasiswa dan Bob akan jenis dipertukarkan. Terlepas dari def jenis, kita perlu identifier berikutnya untuk struct jika definisi struct adalah rekursif. Misalnya, Tipe def struct simpul dan itu akan didefinisikan sebagai val int dan itu akan memiliki pointer yang menunjuk ke node lain struct., seperti dalam simpul struct * berikutnya. Dan kemudian kita akan menyebutnya simpul. Struct ini rekursif, karena definisi node struct mengandung di dalamnya pointer ke node struct. Perhatikan bahwa kita harus mengatakan struct simpul * berikutnya dalam definisi node struct, sejak def jenis belum selesai untuk memungkinkan kita untuk menyederhanakan ini hanya * node berikutnya. Anda akan belajar lebih banyak tentang structs seperti ini ketika berhadapan dengan daftar link dan pohon. Bagaimana structs dalam suatu fungsi? Hal ini juga benar-benar berlaku. Kita bisa memiliki membatalkan func yang mengambil sebagai argumen, siswa s dan melakukan sesuatu dengan siswa itu. Dan kemudian kita bisa lulus sebagai struct mahasiswa seperti begitu. Func S1 dari sebelumnya. Struct berperilaku persis seperti integer akan ketika melewati ke fungsi. Func menerima salinan S1 sehingga tidak dapat memodifikasi S1; melainkan, hanya salinannya yang disimpan dalam S. Jika Anda ingin fungsi untuk dapat memodifikasi S1, func akan perlu untuk mengambil * mahasiswa S, dan Anda akan harus melewati S1 berdasarkan alamat, seperti begitu. Mahasiswa * S, func & S1. Ada alasan lain untuk lewat alamat di sini. Bagaimana jika struct kami berisi 100 bidang? Setiap kali kami melewati siswa untuk func, program kami perlu untuk menyalin semua orang 100 bidang dalam S argumen fungsi ini, bahkan jika itu tidak pernah menggunakan sebagian besar dari mereka. Jadi bahkan jika fungsi tidak berencana untuk memodifikasi siswa, jika masih dapat berharga lewat alamat. Oke, bagaimana jika kita ingin membuat pointer ke struct? Kita bisa melakukan sesuatu seperti Mahasiswa S * sama dengan malloc ukuran mahasiswa. Perhatikan bahwa ukuran masih bekerja di sini. Jadi bagaimana kita sekarang mengakses anggota usia dari blok yang menunjuk ke S? Pertama-tama Anda mungkin berpikir untuk melakukan * S.age = 4, tapi ini tidak akan cukup bekerja. Karena ini benar-benar akan ditafsirkan sebagai * S.age dalam tanda kurung = 4, yang bahkan tidak akan mengkompilasi, karena S bukan struct atau lebih tepatnya pointer ke struct, dan sehingga titik tidak akan bekerja di sini. Kita bisa melakukan (* S). Usia 4 = tetapi kurung bisa mengganggu dan membingungkan. Untungnya, kita memiliki operator panah khusus yang terlihat seperti S-> umur = 4. Ini 2 cara referensi usia yang setara dan kita tidak benar-benar merasa perlu operator panah, tapi itu membuat hal-hal yang terlihat lebih bagus. Karena S adalah pointer ke beberapa blok memori yang berisi struct, Anda bisa memikirkan usia> S sebagai berikut panah pointer dan ambil anggota usia. Jadi mengapa harus kita pernah menggunakan struct? Ini jelas mungkin untuk lolos dengan hanya bilangan bulat primitif, karakter, pointer dan sejenisnya bahwa kita terbiasa; bukannya S1 dan S2 sebelumnya, kita bisa memiliki age1, age2, name1, dan name2 semua pada variabel yang terpisah. Ini bagus dengan hanya 2 siswa, tapi bagaimana jika kita memiliki 10 dari mereka? Dan bagaimana jika bukan hanya 2 bidang, struct mahasiswa memiliki 100 bidang? IPK, kursus, warna rambut, jenis kelamin, dan sebagainya. Alih-alih hanya 10 structs, kita perlu 1.000 variabel yang terpisah. Juga, pertimbangkan fungsi yang mengambil struct bahwa dengan 100 bidang dengan argumen-satunya dan mencetak semua bidang. Jika kita tidak menggunakan struct, setiap kali kita memanggil fungsi itu, kita harus lulus di semua 100 variabel, dan jika kita memiliki 100 variabel untuk siswa 1, dan 100 variabel untuk siswa 2, kita harus yakin kita tidak sengaja melewati beberapa variabel dari siswa 1 dan beberapa variabel dari siswa 2. Tidak mungkin untuk membuat kesalahan itu dengan struct, karena semua 100 variabel yang terkandung dalam satu paket. Hanya beberapa catatan akhir: Jika Anda sudah mengerti segala sesuatu sampai titik ini, besar. Sisanya video hanya demi kelengkapan '. Karena structs dapat menahan semua jenis pointer, mereka juga dapat menyelenggarakan fungsi pointer. Jika Anda terbiasa dengan pemrograman berorientasi objek, ini menyediakan cara untuk menggunakan struct untuk program dalam gaya berorientasi objek. Lebih lanjut mengenai pointer fungsi di lain waktu. Juga, kadang-kadang Anda mungkin memiliki 2 structs definisi yang tergantung pada satu sama lain. Misalnya, kita bisa memiliki struct A, yang didefinisikan sebagai pointer ke struct B, struct B * X, dan sekarang kita dapat memiliki B struct yang didefinisikan sebagai pointer ke A struct, struct A * Y. Tapi ini tidak dapat dikompilasi, karena struct B tidak ada pada waktu itu struct A sedang disusun. Dan jika kita bertukar struct A dan B struct, maka kita hanya akan dibiarkan dengan masalah yang sama; Kali ini, dengan struct A tidak ada. Untuk mengatasi hal ini, kita dapat menulis struct B; sebelum definisi struct A. Ini disebut deklarasi maju. Ini hanya memungkinkan compiler tahu bahwa struct B adalah jenis yang valid yang akan sepenuhnya ditentukan kemudian atau di tempat lain. Nama saya Rob Bowden, dan ini adalah CS50. [CS50.TV]