Perkenalan

Perkenalan

Kami akan melanjutkan bagian tutorial kami dengan tipe data yang kompleks di C, dan kami akan berbicara tentang struktur. Banyak bahasa pemrograman modern menawarkannya, satu bentuk atau yang lain, dan begitu juga c. Seperti yang akan Anda lihat nanti, struktur memungkinkan Anda untuk memanipulasi data lebih mudah, dengan memungkinkan Anda untuk menyimpan variabel yang berbeda dari (mungkin) jenis yang berbeda di bawah satu "atap" tunggal.

Struktur awal

Meskipun saya ingin menunda bagian definisi untuk sub-bab ini, sepertinya saya tidak bisa menunggu dan memasukkannya ke dalam pendahuluan. Ya, teman -teman, itulah struktur itu, dan Anda akan melihat dengan penuh betapa bermanfaatnya ketika saya akan menunjukkan kepada Anda beberapa contoh. Salah satu paralel yang menarik adalah yang mengacu pada tabel basis data: Jika Anda memiliki tabel yang disebut pengguna (nama unik), maka Anda akan memasukkan data yang tepat yang berkaitan langsung dengan pengguna: usia, jenis kelamin, nama, alamat, dan seterusnya. Tapi ini tipe yang berbeda! Tidak masalah, Anda dapat melakukannya dengan tabel, seperti halnya Anda dapat melakukannya dengan struct: usia akan menjadi bilangan bulat, jenis kelamin akan menjadi char, nama akan menjadi string dan sebagainya. Maka Anda akan dapat mengakses anggota dari tabel dengan mudah, dengan merujuk pada nama tabel/anggota. Tapi ini bukan kursus database, jadi mari kita lanjutkan. Tapi sebelum itu, mari kita perhatikan sebentar aspek logis: Anda diundang untuk membuat struct dengan anggota yang memiliki kesamaan dari sudut pandang logis, seperti contoh di atas. Membuatnya lebih mudah bagi Anda dan orang -orang yang nantinya akan melihat kode Anda. Jadi, mari kita lihat bagaimana tabel basis data pengguna kami akan diterjemahkan dalam struct C:

struct pengguna int usia; Jenis kelamin char; nama karakter; alamat char *; ; 

Tolong jangan lupa titik titik koma di akhir. Oke, jadi saya membual bahwa anggota struktur itu mudah diakses. Begini caranya, asalkan Anda ingin mengakses usia pengguna:

printf ("Usia pengguna adalah %d.\ n ", pengguna.usia); 

Tetapi agar printf itu berfungsi, kita harus mendefinisikan usia terlebih dahulu. Itu bisa dilakukan seperti ini

struct pengguna int age;… usrs; USRS.Usia = 25;… 

Apa yang kami lakukan di sini adalah menyatakan contoh dari struct (Anda dapat memiliki sebanyak mungkin contoh), bernama "USRS". Anda dapat memiliki USRS1, USRS2, USRS3 dan sebagainya, sehingga Anda dapat menggunakan atribut ini (seperti usia, jenis kelamin, alamat) pada semuanya. Cara kedua untuk melakukan ini adalah dengan mendeklarasikan struct seperti yang kami lakukan pertama kali (e.G. tanpa contoh) dan kemudian menyatakan contoh masing -masing dalam kode:

.. struct Pengguna USRS1, USRS2, USRS3; 

... dan kemudian menjaga usia, jenis kelamin, alamat, dan sebagainya seperti yang kami lakukan di atas.

Ketika kita berbicara tentang struct dalam hubungannya dengan fungsi, hal yang paling penting untuk dibicarakan adalah fakta bahwa struct dianggap secara keseluruhan, bukan sebagai senyawa yang terbuat dari beberapa elemen. Inilah contohnya:

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

Apa yang dilakukan fungsi ini adalah: dibutuhkan argumen numerik dan mencetak semua pengguna yang memiliki usia spesifik. Anda mungkin telah memperhatikan operator baru dalam kode di atas (jika belum, lihat lagi). Operator "->" melakukan persis apa yang dilakukan operator DOT, yang memungkinkan Anda untuk mengakses anggota struktur, dengan spesifikasi yang digunakan ketika pointer terlibat, seperti halnya operator titik digunakan dalam kasus ketika pointer tidak terlibat. Satu pertimbangan penting lagi di sini. Mengingat kode berikut:

struct myStruct int myint; char *mystring;  *P; 

Menurut Anda apa yang akan dilakukan oleh ekspresi berikut?

++p-> myint; 

Topik lanjutan

Salah satu hal yang sering Anda lihat dalam kaitannya dengan struktur, tetapi tidak hanya, adalah typedef kata kunci. Seperti namanya, ini memungkinkan Anda untuk mendefinisikan tipe data khusus, seperti pada contoh di bawah ini:

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

Mengenai struct, typedef pada dasarnya menghilangkan kebutuhan untuk menggunakan kata 's'. Jadi, inilah struct yang dinyatakan dengan cara ini:

typedef struct kolega int usia; Char Jender;… Colls; 

Untuk topik kami berikutnya, kami akan mengambil ide yang ditemukan di K&R dan menggunakannya untuk menggambarkan poin kami. Mengapa? Itu dipikirkan dengan baik dan itu terlihat sangat baik dan dengan cara sederhana apa yang akan kita ilustrasikan. Tetapi sebelum kita mulai, inilah pertanyaan untuk Anda: mengetahui bahwa C memungkinkan struct bersarang, apakah menurut Anda struct bersarang melalui typedef dapat diterima? Mengapa?

Jadi, inilah topik berikutnya: array struct. Sekarang Anda tahu array apa yang dapat Anda tebak dengan mudah tentang apa ini. Namun, beberapa pertanyaan tetap: bagaimana menerapkan konsep dan, yang lebih penting, apa yang bisa digunakan? Contoh yang kita bicarakan akan segera menjelaskan kedua hal itu. Mari kita anggap Anda memiliki program, ditulis dalam C, dan Anda ingin menghitung jumlah kejadian dari semua kata kunci yang ditentukan standar. Kami membutuhkan dua array: satu untuk menyimpan kata kunci dan lainnya untuk menyimpan jumlah kejadian yang sesuai dengan setiap kata kunci. Implementasi ini dapat ditulis seperti itu:

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

Melihat konsep Anda akan segera melihat bahwa ia menggunakan konsep pasangan, yang lebih efisien dijelaskan dengan menggunakan struktur. Jadi, karena hasil akhirnya yang akan kita butuhkan, kita akan memiliki array yang setiap elemennya adalah struktur. Mari kita lihat.

struct kata kunci char *kata kunci; hasil int;  KEYWRDTBL [NRKEYWORDS]; 

Sekarang mari kita inisialisasi array dengan kata kunci dan jumlah awal kejadian yang akan, tentu saja, menjadi 0.

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

Tugas Anda berikutnya dan terakhir, karena tugas ini sedikit lebih kompleks, adalah menulis program lengkap yang menganggap dirinya sebagai teks untuk dikerjakan dan mencetak jumlah kejadian dari setiap kata kunci, sesuai dengan metode di atas.

Subjek terakhir pada struct yang akan saya tangani adalah masalah pointer ke structs. Jika Anda menulis program dalam latihan terakhir, Anda mungkin sudah memiliki ide yang cukup bagus bagaimana itu dapat ditulis ulang sehingga dapat menggunakan pointer sebagai gantinya pada indeks. Jadi jika Anda suka menulis kode, Anda dapat menganggap ini sebagai latihan opsional. Jadi tidak ada banyak hal di sekitar sini, hanya beberapa aspek, seperti (sangat penting), Anda harus memperkenalkan beberapa kode tambahan dengan perawatan ekstra sehingga ketika menguraikan kode sumber file yang Anda pindai untuk kata kunci, dan tentu saja fungsi pencarian Harus dimodifikasi, Anda tidak akan membuat atau tersandung pada penunjuk ilegal. Lihat bagian sebelumnya untuk referensi pada aritmatika pointer dan perbedaan antara menggunakan array dan menggunakan pointer. Masalah lain untuk berhati -hati adalah ukuran struct. Jangan tertipu: hanya ada satu cara untuk mendapatkan jalan yang benar, dan itu dengan menggunakan sizeof ().

#termasuk  struct uji int satu; int dua; char *str; float flt; ; int main () printf ("Ukuran struct adalah %d.\N", ukuran dari(struct tes)); kembali 0;  

Ini harus kembali 24, tetapi itu tidak dijamin, dan K&R menjelaskan ini karena berbagai persyaratan penyelarasan. Saya sarankan menggunakan sizeof setiap kali Anda ragu, dan tidak menganggap apa pun.

Serikat pekerja

Saya seharusnya mengubah judul dan memasukkan kata "serikat", dan mungkin bahkan "bitfields". Tetapi karena pentingnya dan pola penggunaan struktur secara umum versus serikat pekerja dan bitfields, terutama sekarang bahwa perangkat keras menjadi komoditas yang lebih murah (tidak selalu pemikiran yang sehat, tapi bagaimanapun), saya kira judulnya hanya akan mengatakan "struktur". Jadi apa itu Union? Persatuan sangat mirip dengan struktur, yang berbeda adalah cara kompiler berurusan dengan penyimpanan (memori) untuk itu. Singkatnya, serikat adalah tipe data yang kompleks yang dapat menyimpan berbagai jenis data, tetapi satu anggota sekaligus. Jadi terlepas dari seberapa besar variabel yang disimpan, ia akan memiliki tempatnya, tetapi orang lain tidak akan diizinkan di Union pada saat yang tepat itu. Karenanya nama "Union". Deklarasi dan definisi serikat pekerja sama dengan struktur, dan dijamin bahwa serikat akan mengambil ingatan sebanyak 'anggota terbesar.

Bitfields

Jika Anda ingin menggunakan C dalam pemrograman sistem tertanam dan/atau hal-hal tingkat rendah adalah permainan Anda, maka bagian ini akan tampak menarik. Bitfield (beberapa bidang bit menulisnya), tidak memiliki kata kunci yang ditugaskan seperti enum atau persatuan, dan itu mengharuskan Anda untuk mengetahui mesin Anda. Ini memungkinkan Anda untuk melampaui batasan berbasis kata yang tipikal, bahasa lain membatasi Anda. Ini juga memungkinkan Anda untuk melakukannya, dan ini mungkin definisi formal, "bungkus" lebih dari satu objek dalam satu kata.

Enum

Untuk mulai dengan fakta sejarah singkat, enum diperkenalkan di C ketika C89 keluar dari pintu, yang berarti K&R tidak memiliki tipe yang bagus ini. Enum memungkinkan programmer untuk membuat serangkaian nilai bernama, juga dikenal sebagai enumerator, yang memiliki karakteristik utama mereka bahwa mereka memiliki nilai integer yang terkait dengannya, baik secara implisit (0,1,2 ...) atau secara eksplisit oleh programmer ( 1,2,4,8,16 ...) . Ini membuatnya mudah untuk menghindari angka ajaib.

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

Sekarang, ini lebih mudah, jika kita membutuhkan pres_low untuk 0, medium 1 dan sebagainya, dan Anda tidak perlu menggunakan #defines untuk ini. Saya merekomendasikan sedikit membaca jika Anda tertarik.

Kesimpulan

Meskipun informasinya mungkin tampak sedikit lebih kental dari sebelumnya, jangan khawatir. Konsepnya relatif mudah dipahami dan sedikit olahraga akan bekerja dengan keajaiban. Kami sedang menunggu Anda di forum Linux kami untuk diskusi lebih lanjut.

Semua artikel dalam seri ini:

  • SAYA. C Perkembangan di Linux - Pendahuluan
  • Ii. Perbandingan antara C dan bahasa pemrograman lainnya
  • AKU AKU AKU. Jenis, Operator, Variabel
  • Iv. Alur kontrol
  • V. Fungsi
  • Vi. Pointer dan Array
  • Vii. Struktur
  • Viii. I/O Dasar
  • Ix. Gaya pengkodean dan rekomendasi
  • X. Membangun program
  • Xi. Kemasan untuk Debian dan Fedora
  • Xii. Mendapatkan paket di repositori resmi Debian

Tutorial Linux Terkait:

  • Hal -hal yang harus diinstal pada ubuntu 20.04
  • Pengantar Otomatisasi Linux, Alat dan Teknik
  • Hal -hal yang harus dilakukan setelah menginstal ubuntu 20.04 FOSSA FOSSA Linux
  • Ubuntu 20.04 trik dan hal -hal yang mungkin tidak Anda ketahui
  • Menguasai loop skrip bash
  • Loop bersarang dalam skrip bash
  • Hal -hal yang harus diinstal pada Ubuntu 22.04
  • Mint 20: Lebih baik dari Ubuntu dan Microsoft Windows?
  • Cara Dual Boot Kali Linux dan Windows 10
  • Manipulasi data besar untuk kesenangan dan keuntungan bagian 1