[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]