Pengenalan

Pengenalan

Kami akan meneruskan bahagian tutorial kami dengan jenis data yang kompleks di C, dan kami akan bercakap mengenai struktur. Banyak bahasa pengaturcaraan moden menawarkan mereka, satu bentuk atau yang lain, dan begitu juga c. Seperti yang anda lihat kemudian, struktur membolehkan anda memanipulasi data lebih mudah, dengan membolehkan anda menyimpan pembolehubah yang berbeza (mungkin) jenis yang berbeza di bawah satu "bumbung" tunggal.

Struktur permulaan

Walaupun saya mahu menangguhkan bahagian definisi untuk sub-bab ini, nampaknya saya tidak dapat menunggu dan memasukkannya dalam pengenalan. Ya, orang -orang, itulah strukturnya, dan anda akan melihat dengan seberapa bergunanya apabila saya akan menunjukkan kepada anda beberapa contoh. Satu selari yang menarik adalah yang merujuk kepada jadual pangkalan data: Jika anda mempunyai jadual yang dipanggil pengguna (nama unik), maka anda akan memasukkan dalam jadual itu data tepat yang berkaitan secara langsung kepada pengguna: umur, jantina, nama, alamat, dan sebagainya. Tetapi ini adalah jenis yang berbeza! Tidak ada masalah, anda boleh melakukannya dengan meja, seperti yang anda boleh lakukan dengan struct: umur akan menjadi integer, jantina akan menjadi char, nama akan menjadi rentetan dan sebagainya. Maka anda akan dapat mengakses ahli meja dengan mudah, dengan merujuk kepada nama jadual/ahli. Tetapi ini bukan kursus pangkalan data, jadi mari kita teruskan. Tetapi sebelum itu, mari kita lihat dengan singkat pada aspek logik: anda dijemput untuk membuat struktur dengan ahli yang mempunyai sesuatu yang sama dari sudut pandangan yang logik, seperti contoh di atas. Memudahkan anda dan orang yang kemudiannya akan melihat kod anda. Oleh itu, mari kita lihat bagaimana jadual pangkalan data pengguna kami akan diterjemahkan dalam struktur C:

Struktur Pengguna int umur; char jantina; Char *nama; alamat char *; ; 

Jangan lupa titik koma pada akhir. Ok, jadi saya berbangga bahawa ahli -ahli struktur adalah mudah untuk diakses. Inilah caranya, dengan syarat anda ingin mengakses umur pengguna:

printf ("Umur pengguna adalah %d.\ n ", pengguna.umur); 

Tetapi untuk printf itu berfungsi, kita mesti menentukan usia terlebih dahulu. Yang boleh dilakukan seperti ini

Struktur pengguna int umur; ... usrs; usrs.umur = 25; .. 

Apa yang kita buat di sini adalah menyatakan contoh dari struct (anda boleh mempunyai banyak contoh seperti yang anda suka), bernama "USRS". Anda boleh mempunyai USRS1, USRS2, USRS3 dan sebagainya, jadi anda boleh menggunakan atribut ini (seperti umur, jantina, alamat) pada mereka semua. Cara kedua untuk melakukan ini adalah untuk mengisytiharkan struktur seperti yang kita buat kali pertama (e.g. tanpa contoh) dan kemudian mengisytiharkan contoh masing -masing kemudian dalam kod:

Struktur Pengguna USRS1, USRS2, USRS3; 

... dan kemudian menjaga umur, jantina, alamat dan sebagainya seperti yang kita lakukan di atas.

Apabila kita bercakap mengenai struktur bersempena dengan fungsi, perkara yang paling penting untuk dibincangkan adalah mungkin fakta bahawa struct dianggap secara keseluruhan, bukan sebagai sebatian yang diperbuat daripada beberapa elemen. Inilah contoh:

void show_age (usrs i) printf ("usia pengguna adalah %d.\ n ", i.umur); printf ("Nama pengguna adalah %s.\ n ", (& i)-> name); 

Apa fungsi ini adalah: Ia memerlukan hujah angka dan mencetak semua pengguna yang mempunyai usia tertentu. Anda mungkin dapat melihat pengendali baru dalam kod di atas (jika tidak, lihat lagi). Pengendali "->" melakukan apa yang dilakukan oleh pengendali titik, yang membolehkan anda mengakses ahli struktur, dengan spesifikasi yang digunakan apabila petunjuk terlibat, sama seperti pengendali DOT digunakan dalam kes apabila petunjuk tidak terlibat. Satu pertimbangan yang lebih penting di sini. Memandangkan kod berikut:

Struktur mystruct int myint; char *mystring;  *p; 

Apa yang anda fikirkan ungkapan berikut akan dilakukan?

++p-> myint; 

Topik lanjutan

Salah satu perkara yang anda akan lihat cukup kerap berhubung dengan struktur, tetapi bukan hanya, adalah typedef kata kunci. Seperti namanya, ia membolehkan anda menentukan datatip tersuai, seperti dalam contoh di bawah:

typedef int panjang; / * sekarang panjang adalah sinonim untuk int */ typedef char * string; 

Mengenai structs, typedef pada dasarnya menghapuskan keperluan untuk menggunakan perkataan 's'. Jadi inilah struktur yang diisytiharkan dengan cara ini:

typedef Struktur rakan sekerja int umur; char jantina; ... colls; 

Untuk topik seterusnya, kami akan mengambil idea yang terdapat di K & R dan menggunakannya untuk menggambarkan titik kami. Kenapa? Ia dipikirkan dengan baik dan ia menunjukkan dengan baik dan dengan cara yang mudah untuk kita gambarkan. Tetapi sebelum kita mula, inilah soalan untuk anda: mengetahui bahawa C membolehkan struktur bersarang, adakah anda fikir bersarang bersarang dengan cara typedef boleh diterima? Kenapa?

Jadi, inilah topik seterusnya: Array Struct. Sekarang anda tahu array apa yang anda dapat dengan mudah meneka apa ini. Walau bagaimanapun, beberapa soalan kekal: bagaimana melaksanakan konsep dan, lebih penting, apa yang boleh digunakan? Contoh yang kita bicarakan akan segera memberi gambaran mengenai kedua -dua perkara. Mari kita anggap anda mempunyai program, yang ditulis dalam C, dan anda ingin mengira bilangan kejadian semua kata kunci yang ditentukan oleh standard. Kami memerlukan dua array: satu untuk menyimpan kata kunci dan satu lagi untuk menyimpan bilangan kejadian yang sepadan dengan setiap kata kunci. Pelaksanaan ini boleh ditulis seperti itu:

char *kata kunci [nrkeywords]; Keputusan int [nrkeywords]; 

Melihat konsep anda akan melihat bahawa ia menggunakan konsep pasangan, yang lebih berkesan digambarkan dengan menggunakan struktur. Oleh itu, kerana hasil akhirnya kita perlukan, kita akan mempunyai array yang setiap elemennya adalah struktur. Mari kita lihat.

Struktur kata kunci char *kata kunci; hasil int;  keywrdtbl [nrkeywords]; 

Sekarang mari kita mulakan array dengan kata kunci dan bilangan awal kejadian yang tentu saja akan menjadi 0.

Struktur kata kunci char *kata kunci; hasil int;  keywrdtbl [] = "auto", 0, "break", 0, "case", 0, ... "sementara", 0; 

Tugas seterusnya dan terakhir anda, kerana tugas ini sedikit lebih kompleks, adalah menulis program lengkap yang mengambil dirinya sebagai teks untuk bekerja dan mencetak bilangan kejadian setiap kata kunci, mengikut kaedah di atas.

Subjek terakhir pada structs yang akan saya hadapi adalah masalah petunjuk kepada structs. Sekiranya anda menulis program dalam latihan terakhir, anda mungkin sudah mempunyai idea yang baik bagaimana ia dapat ditulis semula supaya dapat menggunakan petunjuk bukannya pada indeks. Jadi jika anda suka menulis kod, anda mungkin menganggap ini sebagai latihan pilihan. Oleh itu, tidak ada banyak perkara di sini, hanya beberapa aspek, seperti (sangat penting), anda mesti memperkenalkan beberapa kod tambahan dengan penjagaan tambahan supaya apabila menguraikan kod sumber fail yang anda imbas untuk kata kunci, dan tentu saja fungsi carian mesti diubah suai, anda tidak akan membuat atau tersandung pada penunjuk haram. Lihat bahagian sebelumnya untuk rujukan mengenai aritmetik penunjuk dan perbezaan antara menggunakan array dan menggunakan petunjuk. Isu lain yang perlu diharapkan adalah saiz structs. Jangan tertipu: hanya ada satu cara untuk mendapatkan cara struktur yang betul, dan itu dengan menggunakan sizeof ().

#include  Struktur ujian int one; int dua; char *str; flt flt; ; int main () printf ("saiz struct adalah %d.\ n ", saiz(Struktur ujian)); kembali 0;  

Ini harus kembali 24, tetapi itu tidak dijamin, dan K & R menjelaskan ini adalah kerana pelbagai keperluan penjajaran. Saya cadangkan menggunakan sizeof setiap kali anda ragu -ragu, dan menganggap apa -apa.

Kesatuan

Saya sepatutnya mengubah tajuk dan memasukkan perkataan "kesatuan", dan mungkin juga "bitfields". Tetapi kerana kepentingan dan corak penggunaan umum struktur berbanding kesatuan dan bitfields, terutamanya sekarang bahawa perkakasan menjadi komoditi yang lebih murah (tidak semestinya pemikiran yang sihat, tetapi pula), saya rasa tajuk itu hanya akan mengatakan "struktur". Jadi apa itu kesatuan? Kesatuan menyerupai banyak struktur, apa yang berbeza adalah cara pengkompil berurusan dengan penyimpanan (memori) untuknya. Singkatnya, kesatuan adalah jenis data yang kompleks yang dapat menyimpan pelbagai jenis data, tetapi seorang ahli pada satu masa. Jadi tidak kira betapa besarnya pembolehubah yang disimpan, ia akan mempunyai 'tempatnya, tetapi yang lain tidak akan dibenarkan dalam kesatuan pada saat yang tepat. Oleh itu nama "Kesatuan". Pengisytiharan dan definisi kesatuan adalah sama dengan struktur, dan dijamin bahawa kesatuan akan mengambil ingatan sebanyak sebagai 'anggota terbesarnya.

Bitfields

Sekiranya anda ingin menggunakan C dalam pengaturcaraan sistem tertanam dan/atau barangan peringkat rendah adalah permainan anda, maka bahagian ini akan kelihatan menarik. Bitfield (ada yang menulis medan bit), tidak mempunyai kata kunci yang diberikan seperti enum atau kesatuan, dan memerlukan anda mengetahui mesin anda. Ia membolehkan anda melampaui batasan-batasan berasaskan perkataan yang tipikal bahasa lain membatasi anda. Ia juga membolehkan anda, dan ini mungkin definisi rasmi, "pek" lebih daripada satu objek dalam satu perkataan.

Enum

Untuk memulakan dengan fakta sejarah yang pendek, enum diperkenalkan di C ketika C89 keluar pintu, yang bermaksud K & R tidak mempunyai jenis yang bagus. Satu enum membolehkan pengaturcara untuk membuat satu set nilai yang dinamakan, juga dikenali sebagai penghitung, yang mempunyai ciri utama mereka bahawa mereka mempunyai nilai integer yang berkaitan dengan mereka, sama ada secara tersirat (0,1,2 ...) atau secara eksplisit oleh pengaturcara ( 1,2,4,8,16 ...) . Ini memudahkan untuk mengelakkan nombor sihir.

enum Tekanan pres_low, pres_medium, pres_high; enum Tekanan p = pres_high; 

Sekarang, ini lebih mudah, jika kita memerlukan pres_low menjadi 0, sederhana 1 dan sebagainya, dan anda tidak perlu menggunakan #defines untuk ini. Saya cadangkan sedikit membaca jika anda berminat.

Kesimpulan

Walaupun maklumat mungkin kelihatan sedikit lebih pekat daripada sebelumnya, jangan risau. Konsepnya agak mudah dipahami dan sedikit senaman akan berfungsi dengan keajaiban. Kami sedang menunggu anda di forum Linux kami untuk perbincangan lanjut.

Semua artikel dalam siri ini:

  • I. C Pembangunan di Linux - Pengenalan
  • Ii. Perbandingan antara c dan bahasa pengaturcaraan lain
  • Iii. Jenis, pengendali, pembolehubah
  • Iv. Kawalan aliran
  • V. Fungsi
  • Vi. Petunjuk dan tatasusunan
  • VII. Struktur
  • Viii. Asas I/O
  • Ix. Gaya dan cadangan pengekodan
  • X. Membina program
  • Xi. Pembungkusan untuk Debian dan Fedora
  • Xii. Mendapatkan pakej di repositori debian rasmi

Tutorial Linux Berkaitan:

  • Perkara yang hendak dipasang di Ubuntu 20.04
  • Pengenalan kepada Automasi, Alat dan Teknik Linux
  • Perkara yang perlu dilakukan setelah memasang ubuntu 20.04 Focal Fossa Linux
  • Ubuntu 20.04 Trik dan Perkara yang Anda Tidak Tahu
  • Menguasai Gelung Skrip Bash
  • Gelung bersarang dalam skrip bash
  • Perkara yang perlu dipasang di Ubuntu 22.04
  • Mint 20: Lebih baik daripada Ubuntu dan Microsoft Windows?
  • Cara Dual Boot Kali Linux dan Windows 10
  • Manipulasi data besar untuk keseronokan dan keuntungan bahagian 1