Anda tidak perlu menggunakan C setiap hari untuk menghormatinya. Bahasanya ada di mana-mana. Ini mendukung kernel sistem operasi Anda, menggerakkan perangkat yang tertanam, dan berfungsi sebagai lapisan dasar untuk raksasa seperti Python, Java, dan C++. Jika Anda seorang pembuat kode, kemungkinan besar Anda sering menulis dalam bahasa tingkat tinggi. Tidak apa-apa. Namun mengetahui cara mempelajari C memberikan keunggulan yang hanya dapat ditandingi oleh beberapa keterampilan lainnya. Ini bukan hanya tentang menulis kode yang efisien; ini tentang memahami mesin.
Saat Anda memahami C, Anda berhenti memperlakukan komputer Anda seperti kotak ajaib. Anda mulai melihat manajemen memori, pengumpulan sampah, dan batasan perangkat keras sebagai konsep nyata. Visibilitas ini membantu Anda menulis kode yang lebih baik dalam bahasa apa pun. Inilah perbedaan antara mengetahui cara mengemudikan mobil dan mengetahui cara memperbaiki mesinnya.
Bagi para profesional TI, manfaatnya bahkan lebih langsung. Administrasi sistem sering kali melibatkan pembuatan skrip dan pemeliharaan lingkungan yang kompleks. Sebagian besar shell—lingkungan eksekusi terkontrol tempat skrip dijalankan—didasarkan pada C. C shell (atau csh) tetap merupakan adaptasi populer bagi para profesional TI yang perlu memanipulasi sistem operasi pada tingkat rendah. Memahami struktur yang mendasari alat-alat ini membuat pemecahan masalah menjadi lebih cepat dan lebih sedikit dugaan.
Asal Usul C dan UNIX
Untuk memahami mengapa C terstruktur seperti itu, Anda harus melihat kelahirannya. Awal tahun 1970-an adalah masa yang kacau untuk pemrograman. Jika Anda ingin berbicara dengan perangkat keras, Anda menggunakan bahasa assembly. Itu sangat bertele-tele. Debugging adalah mimpi buruk. Menambahkan fitur memerlukan pekerjaan manual yang membosankan yang memperlambat pengembangan hingga merangkak.
Ken Thompson dan Dennis Ritchie di Bell Labs membutuhkan cara yang lebih baik. Mereka sedang mengerjakan sistem operasi UNIX. Upaya pertama mereka pada bahasa tingkat tinggi disebut B, dibangun di atas bahasa pemrograman sistem BCPL. Ketika Bell Labs mendapatkan Digital Equipment Corporation PDP-11, Thompson mengubah B agar sesuai dengan tuntutan perangkat keras baru. Hasilnya adalah C.
Itu bukan hanya sintaksis baru. Itu adalah pergeseran dalam filsafat. Pada tahun 1973, C sudah cukup stabil sehingga seluruh kernel UNIX ditulis ulang di dalamnya. Ini adalah langkah yang berani. Hal ini membuktikan bahwa bahasa tingkat tinggi dapat menangani tugas-tugas tingkat rendah tanpa mengorbankan kinerja.
Standardisasi dan “Buku Putih”
Awalnya, C agak liar di barat. Pemrogram yang berbeda menciptakan dialek mereka sendiri. Untuk memperbaikinya, pengembang menghabiskan tahun 1980-an untuk menciptakan standar. Tonggak sejarah besar pertama adalah “Bahasa Pemrograman C” oleh Brian Kernighan dan Dennis Ritchie. Penggemar C menyebutnya K&R, atau “Buku Putih”.
Versi asli C, yang diambil dari buku K&R, masih disebut sebagai K&R C hingga saat ini.
Buku itu menjadi panduan definitif. Edisi keduanya, yang diterbitkan pada tahun 1988, tetap menjadi rujukan bagi banyak orang. Tapi buku bukanlah standar. Institut Standar Nasional Amerika (ANSI) merilis standar X3.159-1989 pada tahun 1989. Organisasi Internasional untuk Standardisasi (ISO) diikuti dengan ISO/IEC 9899:1990 pada tahun 1990.
Standar-standar ini memberi C identitas modernnya. Anda mungkin melihat referensi ke C89, C90, atau C99 di dokumentasi. Ini hanyalah singkatan dari standar yang dirilis pada tahun-tahun tersebut. Ketika seseorang mengatakan “ANSI C”, mereka biasanya berbicara tentang standar tahun 1989. Standardisasi ini memungkinkan C menyebar ke luar Bell Labs. Ini menjadi alat universal, bukan alat milik sendiri.
Warisan: C++ dan Java
Keberhasilan C menciptakan efek riak. Komputer menjadi lebih cepat. Aplikasi menjadi lebih kompleks. Pemrogram memerlukan cara untuk mengelola kompleksitas ini tanpa menciptakan kembali rodanya.
Masukkan C++. Dibutuhkan C dan menambahkan fitur pemrograman berorientasi objek (OOP). Hal ini memungkinkan pengembang untuk menggunakan kembali kode dengan lebih efektif. Ini mengoptimalkan kemampuan untuk menangani proyek perangkat lunak berskala besar dengan banyak bagian yang bergerak. Java mengikuti jalur serupa, banyak meminjam sintaksis C sambil menyederhanakan manajemen memori.
Bahasa-bahasa ini tidak menggantikan C. Mereka mengandalkannya. C tetap menjadi jembatan antara kode aplikasi dan perangkat keras. Itu adalah fondasi yang tidak terlihat. Tanpa C, bahasa tingkat tinggi yang Anda gunakan sehari-hari tidak akan memiliki cara yang konsisten untuk berkomunikasi dengan mesin.
Mengapa C Masih Relevan
Argumen yang menentang C adalah bahwa C sudah tua. Ini manual. Itu berbahaya. Anda dapat membuat sistem Anda crash dalam satu baris kode jika Anda mengacaukan sebuah pointer. Namun bahaya itu juga merupakan kekuatannya. C memberi Anda kendali penuh. Itu tidak menyembunyikan sesuatu dari Anda.
Bagi pengembang, ini berarti wawasan yang lebih dalam. Ketika Anda mengetahui bagaimana memori dialokasikan di C, Anda memahami mengapa skrip Python Anda berjalan lambat. Anda melihat overhead. Anda melihat pengumpulan sampah secara real-time. Pengetahuan ini memungkinkan Anda mengoptimalkan. Ini memungkinkan Anda menulis program yang tidak hanya berfungsi, namun bekerja secara efisien.
Bagi spesialis TI, ini adalah soal kontrol. Bahasa skrip nyaman digunakan. Mereka cepat menulis. Namun ketika ada sesuatu yang rusak jauh di dalam tumpukan, Anda perlu memahami apa yang terjadi di balik terpal. C menyediakan konteks itu. Ini menjelaskan mengapa shell berperilaku dengan cara tertentu. Ini menjelaskan bagaimana sistem operasi mengelola sumber daya.
Mempelajari C bukanlah tentang menjadi programmer C. Ini tentang menjadi programmer yang lebih baik. Ini tentang melihat kabelnya. Dan begitu Anda melihat kabelnya, Anda tidak akan pernah bisa mengabaikannya.
C tidak berjalan secara langsung. Anda tidak bisa hanya mengklik dua kali file sumber dan melihatnya menari di layar. Ini adalah bahasa yang dikompilasi. Itu berarti Anda harus menerjemahkan teks yang dapat dibaca manusia menjadi instruksi yang dapat dijalankan mesin terlebih dahulu. Proses ini melibatkan kompiler. Kompilator memindai kode Anda, memeriksa kesalahan sintaksis, dan jika puas dengan apa yang dilihatnya, ia akan mengeluarkan file yang dapat dieksekusi. Itu adalah biner yang sebenarnya dijalankan oleh komputer.
Anda dapat menulis kode C di hampir semua editor teks. Pengguna Windows mungkin menggunakan Notepad secara default. Pengguna Mac sering kali menggunakan TextEdit. Pengguna Linux mungkin lebih memilih gedit. Alatnya tidak terlalu penting dibandingkan hasilnya. Anda sedang membuat file teks biasa. Keajaiban terjadi pada langkah berikutnya.
Menemukan dan Menyiapkan Kompiler Anda
Sebelum Anda menulis satu baris logika kompleks, Anda memerlukan alat yang tepat. Jika Anda menggunakan macOS atau distribusi Linux seperti Ubuntu, Anda sudah memiliki apa yang Anda perlukan. Anda hanya perlu menginstal alat pengembangan untuk sistem operasi Anda. Ini memberi Anda akses ke kompiler C.
Ini adalah alat baris perintah. Anda tidak akan menemukan tombol mengkilap untuk diklik di menu aplikasi Anda. Anda akan membuka jendela terminal. Dari sana, Anda mengetikkan perintah. Perintah standar biasanya cc atau gcc. Setelah perintah, Anda mengetik opsi dan argumen. Ini adalah instruksi yang memberitahu kompiler apa yang harus dilakukan.
Atau jika Anda menggunakan GCC:
Ini sangat mudah. Juga tidak kenal ampun jika Anda melakukan kesalahan.
IDE untuk Windows dan Kebutuhan Lintas Platform
Baris perintah bukan untuk semua orang. Jika Anda lebih menyukai antarmuka grafis, atau jika Anda menggunakan Windows, Anda mungkin menginginkan Lingkungan Pengembangan Terpadu (IDE). Sebuah IDE menggabungkan segalanya. Anda menulis kode. Anda mengkompilasinya. Anda men-debugnya. Anda melakukan semuanya dalam satu jendela. Kesalahan disorot. Perbaikan lebih mudah ditemukan.
Untuk Windows, Microsoft Visual C++ adalah pilihan yang kuat. Ini menangani C dan C++. Ini sangat kuat. Biayanya juga mahal jika Anda tidak menggunakan edisi Komunitas gratis.
Eclipse adalah pilihan populer lainnya. Ini gratis. Ini berbasis Java tetapi diperluas untuk mendukung C dan banyak bahasa lainnya. Ini berjalan di Windows, Mac, dan Linux. Jika Anda sudah berada di ekosistem Eclipse, menambahkan plugin C/C++ adalah langkah logis.
Mengapa Versi Kompiler Penting
Versi kompiler yang Anda gunakan bukanlah detail kecil. Ini penting. Anda harus menggunakan versi kompiler yang sama atau lebih baru dari standar bahasa C yang diandalkan oleh kode Anda. Jika Anda mencoba mengkompilasi kode C99 atau C11 modern dengan kompiler kuno, itu akan gagal. Itu tidak akan memahami sintaksis baru.
Jika Anda menggunakan IDE, periksa pengaturan proyek Anda. Pastikan IDE dikonfigurasi untuk menargetkan versi C tertentu yang Anda gunakan. Jika Anda berada di terminal, Anda meneruskan informasi ini melalui argumen baris perintah.
Menguraikan Perintah GCC
Mari kita lihat contoh nyata. Perintah ini adalah cara Anda mengontrol proses kompilasi secara eksplisit.
Baris ini memberi tahu kompiler apa yang harus dilakukan. Hancurkan:
gcc: Ini memanggil Koleksi Kompiler GNU. Itu mesinnya.-std=c99: Ini menetapkan standar. Ia memberitahu gcc untuk menggunakan bahasa C versi C99. Tanpa hal ini, standarnya mungkin lebih lama dan lebih ketat.-o myprogram.exe: Ini menetapkan nama file keluaran. Tanpa tanda-o, gcc akan memberi namaa.outyang dapat dieksekusi secara default. Itu tidak terlalu deskriptif.myprogram.c: Ini adalah file sumber Anda. Masukan.
Perintah tersebut secara efektif mengatakan: “Ambil myprogram.c, kompilasi menggunakan aturan C99, dan simpan hasilnya sebagai myprogram.exe.”
Opsi Navigasi
Ada ratusan opsi yang tersedia untuk gcc dan kompiler lainnya. Anda tidak perlu menghafalnya. Anda tidak perlu menggunakan semuanya. Namun Anda perlu tahu bahwa mereka ada.
Telusuri dokumentasi untuk kompiler spesifik Anda. Cari tanda yang mengoptimalkan kinerja. Carilah tanda yang meningkatkan tingkat peringatan. Setiap opsi yang Anda tambahkan mengubah perilaku biner akhir.
Menulis Program C Pertama Anda
Sekarang kompiler telah diinstal dan dikonfigurasi, Anda siap membuat kode. Hambatan untuk masuk rendah. Konsep-konsepnya sangat mendasar.
Mulailah dengan struktur dasar. Setiap program C membutuhkan fungsi utama. Itu membutuhkan header. Itu membutuhkan pernyataan pengembalian. Ini adalah tulang-tulangnya.
Ini adalah program C valid yang paling sederhana. Ini mencakup perpustakaan input/output standar. Ini mendefinisikan fungsi utama. Ini mencetak string. Ini mengembalikan nol untuk menunjukkan keberhasilan.
Simpan file ini sebagai hello.c. Kompilasi itu.
Jalankan.
Anda akan melihat “Halo, Dunia” di layar Anda. Anda baru saja menulis, menyusun, dan
Anatomi Program Hello World
Mulailah dengan file teks kosong. Beri nama sample.c. Jangan beri nama sample.txt. Jika default editor Anda adalah .txt, kompiler akan menolaknya. Anda memerlukan ekstensi .c untuk memberi sinyal bahwa ini adalah kode sumber C, bukan dokumen teks.
Ini kodenya. Itu telanjang. Minimal.
Kompilasi itu. Jalankan. Komputer mencetak string dan keluar. Cukup sederhana. Tapi lihat lebih dekat. Setiap karakter di sini memiliki pekerjaan.
Baris pertama adalah komentar. Tag /* dan */ memberitahu kompiler untuk mengabaikan semua yang ada di dalamnya. Manusia membaca ini. Mesinnya tidak. Ini untuk Anda, atau siapa pun yang menyimpan kode ini nanti.
Jalur kedua adalah tempat segalanya menjadi nyata. #include menarik perpustakaan. Khususnya, perpustakaan input/output standar. File ini berisi definisi untuk fungsi seperti printf. Anda tidak menulis logika untuk mencetak ke layar. Anda hanya memberi tahu kompiler di mana menemukan instruksi yang sudah ada.
Baris ketiga mendefinisikan titik masuk. ke dalam utama(). Setiap program C membutuhkan ini. Ini adalah hal pertama yang dipanggil oleh sistem operasi. Kata kunci int berarti fungsi mengembalikan bilangan bulat. Tanda kurungnya kosong di sini, tapi itu detailnya nanti.
Baris empat dan tujuh adalah kurung kurawal. { dan }. Mereka membungkus badan fungsinya. Beberapa pengembang menempatkan kurung kurawal pembuka pada baris yang sama dengan main(). Lainnya, seperti contoh ini, meletakkannya pada barisnya sendiri. Itu tidak mengubah cara kode dijalankan. Itu hanya mengubah tampilannya. Dan di C, keterbacaan penting karena Anda akan melihatnya dalam waktu lama. Indentasi membantu. Gunakan spasi.
Jalur lima memanggil printf. Fungsi ini ada di perpustakaan stdio.h yang Anda sertakan sebelumnya. Dibutuhkan argumen string. Perhatikan \n di akhir. Itu adalah rangkaian pelarian. Itu tidak mencetak garis miring terbalik dan n. Ini memindahkan kursor ke baris berikutnya. Tanpanya, command prompt Anda akan terasa canggung tepat setelah output Anda. Dan lihat titik koma. ;. Setiap pernyataan harus diakhiri dengan satu. Lewatkan saja, dan kompiler tersedak.
Jalur enam adalah sinyal keluar. kembali 0;. Ketika main selesai, ia mengembalikan nilai ke sistem operasi. Nol berarti sukses. Bukan nol biasanya berarti ada yang rusak. Anda mungkin tidak menggunakan nilai ini dalam kode Anda, tetapi sistem akan menggunakannya. Saat Anda menguji skrip atau menjalankan program dalam pekerjaan batch, OS memeriksa bahwa nol. Ini adalah lampu hijau bahwa proses selesai tanpa terhenti.
Kompilasi dari Command Line
Sekarang setelah Anda memiliki kodenya, Anda perlu mengubahnya menjadi sesuatu yang dipahami CPU. Anda memerlukan kompiler. Anggaplah Anda menggunakan gcc.
Buka terminal Anda. Arahkan ke folder tempat Anda menyimpan sample.c. Ketik ini:
Hancurkan perintahnya. gcc adalah alat kompiler. -o berarti keluaran. Anda memberi tahu nama file yang dihasilkan. sample.exe adalah nama itu. sample.c adalah file masukan.
Jika Anda salah mengetik titik koma, baris ini akan gagal. Outputnya akan menjadi dinding teks merah. Ini adalah kesalahan sintaksis. Anda salah mengetik sesuatu. Mungkin Anda lupa kutipannya. Mungkin Anda melewatkan brace. Perbaiki kodenya. Menyimpan. Jalankan perintah lagi. Itu sebuah siklus.
Jika berhasil maka akan muncul file baru. sampel.exe. Ini adalah eksekusinya. Ini bukan lagi teks yang bisa dibaca manusia. Itu kode mesin.
Menjalankan Eksekusi
Jangan hanya menatap file baru. Jalankan.
./ itu penting. Ini memberitahu shell untuk mencari di direktori saat ini untuk executable. Jika Anda mengabaikannya, sistem mungkin akan mencari jalur Anda dan gagal menemukannya, atau lebih buruk lagi, menemukan jalur yang salah.
Saat dijalankan, Anda melihat teksnya. Kemudian kursor bergerak. Kemudian Anda kembali ke command prompt Anda.
Itulah siklus hidupnya. Menulis. Menyusun. Berlari. Merusak. Memperbaiki. Mengulang.
Ini bukan sihir. Itu hanyalah seperangkat aturan yang sangat ketat. Anda mengikutinya, dan komputer melakukan apa yang Anda perintahkan. Anda mengabaikannya, dan itu tidak menghasilkan apa-apa.
Tapi ini hanya permukaannya saja. Anda telah melihat suatu fungsi. Anda pernah melihat perpustakaan. Anda telah melihat nilai kembaliannya. Blok bangunannya ada di sana. Kompleksitas sebenarnya muncul saat Anda mulai menghubungkan keduanya.
Jika Anda mencoba memahami konsep pemrograman C, Anda tidak sendirian. Ini adalah bahasa yang menuntut ketelitian. Anda tidak hanya menulis kode; Anda mengelola memori, menentukan tipe, dan memberi tahu CPU apa yang harus dilakukan. Tidak ada keajaiban di sini. Hanya logika.
Berikut rincian apa yang sebenarnya terjadi ketika Anda mengkompilasi program C.
Cara Kerja Fungsi di C
Mari kita mulai dengan fungsi di C. Dalam banyak bahasa modern, hal ini disebut metode. Di C, mereka adalah fungsi. Fungsi adalah blok kode. Itu melakukan satu hal. Ketika program Anda dijalankan, ia mengeksekusi blok-blok ini.
Anda dapat menentukan beberapa fungsi. Anda dapat memanggil mereka dari dalam fungsi lainnya. Ini memungkinkan Anda membagi program besar menjadi beberapa bagian yang dapat dikelola dan digunakan kembali.
Struktur dasarnya terlihat seperti ini:
Setiap program C memerlukan setidaknya satu fungsi: main. Kompiler mencari nama spesifik ini untuk memulai eksekusi. Meskipun main memanggil fungsi lain, itu adalah titik masuknya.
Perhatikan contoh sederhana ini:
Ini memiliki tipe pengembalian integer. Tidak ada parameter. Dua pernyataan. Perintah printf mengirimkan teks ke layar. return 0 memberi tahu sistem bahwa program berhasil diakhiri.
Meneruskan Parameter ke Fungsi
Fungsi lain memerlukan definisi dan panggilan. Pemanggilan fungsi adalah pernyataan di dalam fungsi lain. Ini memberi nama fungsinya. Ini termasuk tanda kurung. Jika fungsi mengharapkan data, Anda harus menyediakannya. Ini disebut parameter passing.
Apa itu parameter? Ini adalah data dengan tipe tertentu. Fungsi ini membutuhkannya agar berfungsi. Fungsi C dapat menerima parameter dalam jumlah tidak terbatas. Ini juga disebut argumen.
Setiap parameter memerlukan tipe data dan nama variabel. Beberapa parameter dipisahkan dengan koma.
Lihatlah fungsi ini:
Dibutuhkan dua bilangan bulat. Ini menggandakannya. Itu menambahkan mereka. Ini mengembalikan hasilnya. Sederhana. Efektif.
Variabel dan Tipe Data
Variabel adalah placeholder. Mereka mewakili nilai-nilai yang belum Anda ketahui. Anda membutuhkan fleksibilitas. Anda tidak ingin memasukkan angka ke dalam logika Anda. C menangani ini seperti aljabar.
Tapi C lebih ketat. Anda harus menentukan tipe data. Ini memberi tahu kompiler berapa banyak memori yang akan dialokasikan. Ini memberitahu CPU bagaimana menafsirkan bit.
Setiap tipe data memiliki ukuran. Itu diukur dalam bit atau byte biner. Itu punya aturan. Jika Anda memilih jenis yang salah, program Anda mungkin crash atau memberikan hasil yang buruk. Memilih tipe data yang tepat di C sangat penting untuk performa dan kebenaran.
Operasi dan Alur Kontrol
Anda melakukan aritmatika pada angka. Anda menggabungkan string. C memiliki operasi bawaan untuk tugas-tugas ini.
Namun aliran kontrol adalah tempat logika berada.
Perulangan ulangi tindakan. Mereka mengulang berdasarkan kondisi. C menyediakan beberapa struktur loop:
– sementara
– lakukan/sementara
– untuk
– lanjutkan /istirahat
– goto (gunakan dengan hati-hati)
Ini juga memiliki persyaratan:
– jika/maka/lainnya
– saklar/kotak
Struktur ini memungkinkan Anda mengarahkan jalur program. Lakukan sesuatu. Periksa suatu kondisi. Mengulang. Istirahat jika diperlukan.
Struktur Data dan Memori
Jika Anda memiliki banyak data, Anda memerlukan struktur data di C. Anda perlu mengurutkannya. Cari itu.
Struktur data adalah cara terstruktur untuk merepresentasikan beberapa bagian data dengan tipe yang sama. Yang paling umum adalah array. Ini adalah daftar yang diindeks dengan ukuran tertentu.
C memiliki perpustakaan untuk struktur umum. Tapi Anda juga bisa menulis sendiri. Anda dapat menentukan fungsi Anda sendiri. Anda memiliki kendali penuh.
Pengendalian ini memerlukan biaya. C mengharuskan Anda untuk menangani pointer. Ini mengharuskan Anda untuk mengelola memori. Tidak ada pengumpulan sampah di C. Jika Anda mengalokasikan memori, Anda harus mengosongkannya. Lupa melakukan ini, dan Anda mengalami kebocoran memori.
Operasi Praprosesor
Bahkan sebelum kompiler melihat kode Anda, praprosesor berjalan. Ini memberi Anda instruksi.
Ini menggantikan nilai konstan. Ini termasuk kode dari perpustakaan. Anda pernah melihatnya dengan #include. Ini menarik definisi standar.
Ini bukan bagian dari eksekusi akhir. Ini adalah fase pengaturan. Ini mempersiapkan kode Anda untuk kompilasi.
Mengapa Ini Penting
Ikhtisar ini mungkin terasa padat. Jika Anda baru mengenal pemrograman, banyak hal yang perlu diserap. Tapi ini adalah landasannya.
Anda tidak dapat menulis C tanpa memahami fungsi di C. Anda tidak dapat mengelola data tanpa tipe data. Anda tidak dapat mengontrol aliran tanpa loop.
Bahasanya tidak bisa mengendalikan tangan Anda. Ini memberi Anda alat. Anda memutuskan bagaimana menggunakannya.
Selanjutnya, kita akan mendalami lebih dalam bagaimana bagian-bagian ini dipadukan dalam program yang lebih besar. Struktur itu penting. Sintaksnya penting. Tapi logika adalah hal yang paling penting.
Bagaimana pendekatan Anda dalam mempelajari bahasa baru? Apakah Anda memulai dengan variabel? Atau apakah Anda langsung terjun ke fungsi? Jalannya adalah milik Anda untuk ditentukan.
Anda dapat menghapus definisi fungsi di mana pun dalam program C, selama definisi tersebut tidak berada di dalam fungsi lain. Tapi ada satu aturan ketat. Anda harus memberi tahu kompiler bahwa fungsi tersebut ada sebelum ia mencoba menggunakannya. Di sinilah prototipe fungsi berperan. Ini adalah pernyataan yang ditempatkan di bagian atas kode Anda. Ini mencerminkan baris pertama dari definisi fungsi Anda yang sebenarnya. Di C, Anda tidak perlu memberi nama parameter dalam pernyataan baris atas tersebut. Anda hanya memerlukan tipe datanya saja. Berikut tampilan doubleAndAdd sebagai prototipe:
int doubleDanTambahkan(int, int);
Bayangkan prototipe fungsi sebagai daftar pengepakan untuk perabot baru. Anda tidak akan mulai membuat rak buku tanpa mencentang kotak untuk semua sekrup dan rak. Kompiler melakukan hal yang sama. Ia memeriksa prototipe sebelum merakit program Anda. Ini memastikan semua bagian ada di sana.
Jika Anda bekerja dengan sample.c, tambahkan prototipe, definisi, dan panggilan untuk doubleAndAdd. Kompilasi itu. Jalankan. Perhatikan itu berhasil. Kodenya terlihat seperti ini:
Kami telah membahas struktur dasar. Sekarang kita perlu bicara tentang data. Jenis data apa yang dapat Anda tangani di C? Operasi apa yang diperbolehkan pada mereka?
Deklarasi Fungsi vs. Prototipe
Pemrogram C yang lebih lama akan menyebutnya sebagai deklarasi fungsi. Anda akan sering mendengar istilah ini. Kami menggunakan prototipe fungsi di sini karena perbedaannya penting. Deklarasi tradisional tidak memerlukan parameter. Hanya tipe pengembalian, nama, dan tanda kurung kosong saja sudah cukup. Prototipe berbeda. Ini memberikan rincian spesifik kepada kompiler. Ini memberi tahu kompiler berapa banyak parameter yang ada. Ini memberi tahu tipe data apa parameter tersebut. Informasi tambahan ini mencegah kesalahan. Ini adalah praktik terbaik modern. Ini berlaku untuk C dan banyak bahasa lainnya. Tanpanya, kompiler hanya bisa menebak-nebak. Dengan itu, kompiler tahu persis apa yang diharapkan.
Tipe data adalah blok penyusunnya. Operasi adalah alatnya. Kita berpindah dari struktur ke substansi.

Komputer melihat data sebagai biner mentah. Itu hanyalah aliran satu dan nol. Hard drive, memori, dan prosesor Anda tidak peduli dengan makna di balik bit-bit tersebut. Hanya perangkat lunak yang berjalan di mesin yang memberikan konteks miliaran digit tersebut.
C menonjol di sini. Ini adalah salah satu dari sedikit bahasa tingkat tinggi yang memungkinkan Anda memanipulasi data pada tingkat bit sambil juga menafsirkannya berdasarkan aturan tertentu.
Bagaimana C Mendefinisikan Tipe Data
Tipe data pada dasarnya adalah buku aturan. Ini memberitahu kompiler bagaimana menafsirkan urutan bit. Ini menentukan ukuran data dan cara kerja operasi seperti penjumlahan atau perkalian.
Ukuran tipe data di C bergantung pada prosesor. Ini belum diperbaiki.
Pertimbangkan tipe int standar. Dalam prosesor 16-bit, bilangan bulat panjangnya 16 bit. Beralih ke prosesor 32-bit atau 64-bit, dan int yang sama menjadi 32 bit. Variasi ini adalah bagian inti dari pemahaman tipe data di C.
Ditandatangani vs. Tidak Ditandatangani: Masalah Jangkauan
Cara C menangani bilangan positif dan negatif adalah detail penting lainnya.
Tipe yang ditandatangani mencadangkan satu bit untuk menunjukkan tandanya. Ini memotong jangkauan Anda menjadi dua. Pada sistem 16-bit:
unsigned intberkisar antara 0 hingga 65.535.int yang ditandatanganiberkisar antara -32.768 hingga 32.767.
Jika penghitungan Anda mendorong variabel melampaui batas ini, C tidak selalu menghentikan Anda. Hal ini dapat menyebabkan luapan. Anda harus menulis kode tambahan untuk menanganinya secara manual. Mengabaikan hal ini menyebabkan bug.
Tipe dan Array Primitif
Pemrogram C memilih tipe data berdasarkan kebutuhan program. Bahasa ini menyediakan tipe data primitif. Ini sudah ada di dalamnya. Mereka membentuk fondasi.
Untuk daftar lengkap jenis dan aturan konversi ini, Anda memerlukan panduan referensi. Namun ada satu struktur yang menjembatani kesenjangan antara organisasi primitif dan kompleks: array.
Array adalah daftar virtual. Semua elemen harus bertipe data yang sama. Anda tidak dapat mengubah ukuran array setelah dibuat. Anda dapat menyalin isinya ke dalam array yang lebih besar atau lebih kecil.
String dan File Header
Meskipun array angka merupakan hal yang umum, array karakter memiliki fitur unik. Kami menyebutnya string.
Sebuah string menyimpan teks. Ini memungkinkan program Anda menyimpan input pengguna atau output cetak. Karena manipulasi string melibatkan serangkaian operasi spesifik, C menyertakan file header khusus: string.h. Ini berisi fungsi-fungsi khas yang Anda perlukan untuk bekerja dengan teks.
Prioritas Operator Penting
C menyertakan operasi bawaan yang ditemukan di sebagian besar bahasa. Namun urutan pengoperasian tidak selalu intuitif jika Anda berasal dari latar belakang yang berbeda.
Anda perlu mengetahui prioritas operator. Ini adalah urutan kompiler mengevaluasi ekspresi matematika.
Ambil contoh ini:
(2+5)*3 sama dengan 21.
2+5*3 sama dengan 17.
C melakukan perkalian sebelum penjumlahan. Tanda kurung mengesampingkan perilaku default ini. Kesalahpahaman didahulukan menyebabkan logika yang salah.
Langkah Praktis untuk Pembelajar
Jika Anda sedang mempelajari C, jangan hanya melihat sekilas saja.
- Pahami semua tipe data primitif.
- Hafalkan prioritas operasi.
- Eksperimen dengan operasi tipe campuran.
Coba campur bilangan bulat dan pelampung. Lihat bagaimana C menangani konversi. Ini satu-satunya cara untuk menginternalisasikan aturan.
Ini mencakup dasar-dasar bagaimana C menangani data dan operasi. Namun menulis program dari awal setiap saat tidaklah efisien. Langkah logis berikutnya adalah penggunaan kembali.
Anda tidak menemukan kembali roda untuk setiap program C. Anda tidak harus memulai dari awal.
C adalah barebone. Ini melucuti semuanya hingga ke hal-hal yang penting. Itu tidak dilengkapi dengan fungsi input keyboard atau output layar bawaan. Jika Anda ingin mencetak ke konsol, Anda melakukannya sendiri kecuali Anda menggunakan perpustakaan.
Perpustakaan memecahkan masalah ini. Mereka menampung blok kode yang dapat digunakan kembali. Gunakan mereka.
Perpustakaan Standar vs. Kustom di C
Kita telah melihat perpustakaan I/O standar. Ini disebut stdio. Kompiler memuatnya melalui direktif #include. Ini menarik data dari file header stdio.h.
Pengelola C menggabungkan pustaka standar untuk operasi I/O, matematika, manipulasi waktu, dan string. Anda akan menemukan detail perpustakaan standar C89 di referensi bagus mana pun. C99 menambahkan lebih banyak. Cari pembaruan tersebut jika Anda memerlukan fitur modern.
Tapi Anda juga bisa menulis sendiri.
Memisahkan kode Anda menjadi modul yang dapat digunakan kembali memiliki manfaat. File yang lebih pendek lebih mudah dibaca. Proses debug menjadi tidak terlalu menyakitkan. Pengujian lebih terisolasi.
Untuk menautkan perpustakaan, Anda menambahkan baris #include.
Untuk perpustakaan standar, gunakan tanda kurung sudut. Ini memberitahu kompiler untuk mencari di direktori sistem.
Untuk perpustakaan khusus Anda sendiri, gunakan tanda kutip ganda. Kompiler memeriksa direktori lokal terlebih dahulu.
Perhatikan sintaksnya. Anda tidak memerlukan titik koma di akhir pernyataan #include. Ini bukan pemanggilan fungsi. Ini adalah arahan praprosesor.
Menulis perpustakaan bukanlah hal ajaib. Definisi fungsi identik dengan yang ada di program utama Anda. Perbedaannya terletak pada proses pembuatannya.
Anda mengkompilasi kode perpustakaan Anda ke dalam file objek. Itu diakhiri dengan .o. Anda membuat file header. Itu diakhiri dengan .h. Header berisi prototipe fungsi. Ini mendeklarasikan fungsi yang dilakukan tanpa mengimplementasikannya.
Saat Anda membangun program utama, Anda mereferensikan file header di baris #include. Anda meneruskan file objek ke perintah kompiler. Tautan menghubungkan mereka.
Pendekatan modular ini menjaga kode Anda tetap bersih. Ini memisahkan antarmuka dari implementasi.
Petunjuk: Inti Manajemen Memori C
Kami telah membahas dasar-dasarnya. Sekarang kita beralih ke memori.
Saat program C dijalankan, program tersebut berada di RAM. Setiap bagian data memiliki alamat tertentu. Variabel bukan hanya wadah. Itu adalah lokasi.
Saat Anda memanggil suatu fungsi, kode dimuat ke dalam memori. Ini berjalan. Itu kembali.
Secara default, C meneruskan parameter berdasarkan nilai. Ini menyalin data. Fungsi ini berfungsi pada salinan. Variabel asli dalam program utama tetap tidak tersentuh.
Terkadang inilah yang Anda inginkan.
Di lain waktu, Anda perlu mengubah data asli. Anda perlu mengubah variabel di lokasi memori aslinya.
Untuk melakukan ini, Anda memberikan sebuah pointer. Anda memberikan alamatnya. Ini adalah “melewati referensi.”
Pointer ada dimana-mana di C. Anda tidak dapat menggunakan C secara efektif tanpanya.
Pointer adalah variabel. Tapi itu menyimpan alamat. Ini menunjuk ke bagian data lain. Ini juga memiliki tipe. Tipe ini memberi tahu komputer berapa banyak byte yang harus dibaca pada alamat tersebut.
Menemukan petunjuk dalam kode bisa jadi rumit. Bahkan para ahli pun melewatkannya.
Saat Anda mendeklarasikan sebuah pointer, itu sudah jelas. Anda menggunakan tanda bintang. Ini adalah operator tipuan.
Di sini, i adalah bilangan bulat. p adalah penunjuk ke bilangan bulat.
Keduanya belum mempunyai nilai.
Tetapkan i nomor.
Sekarang buat p menunjuk ke i. Anda menggunakan alamat operator. Itu adalah ampersand (& ).
Kata & berarti “alamat”. Anda tidak perlu mengetahui alamat memori sebenarnya. Itu berubah setiap kali Anda menjalankan program. Kompiler mengetahuinya.
Jika Anda melewatkan &, Anda menetapkan nilai 3 ke penunjuk. Itu adalah bug. Penunjuk sekarang menyimpan nomor 3, bukan lokasi i.
Menggunakan Pointer dengan Benar di C
Menggunakan pointer menimbulkan kompleksitas. Anda mengelola memori secara langsung.
Kompiler tidak akan menyelamatkan Anda dari kesalahan.
Jika Anda melakukan dereferensi penunjuk nol, program Anda akan mogok. Jika Anda mengakses memori yang bukan milik Anda, Anda mendapatkan kesalahan segmentasi. Itu jelek.
Tapi kekuatannya nyata. Anda dapat meneruskan struktur data besar tanpa menyalinnya. Anda dapat mengubah variabel melintasi batas fungsi. Anda dapat membuat daftar tertaut, pohon, dan struktur data yang kompleks.
Menguasai petunjuk adalah perbedaan antara menulis skrip sederhana dan membangun sistem yang kuat. Ini bukan pilihan. Itu adalah fondasinya.

Berikan sebuah pointer, bukan nilai itu sendiri.
Anda dapat menukar pointer dengan variabelnya kapan saja mereka berbagi tipe data. Ini penting dalam pemanggilan fungsi dan matematika. Ambil int b. Anda dapat menulis b = *p + 2;. Tanda bintang memberitahu kompiler untuk melakukan dereferensi p. Ini mengambil nilai sebenarnya di alamat memori. Bukan alamatnya sendiri. Perbedaan ini adalah segalanya.
Tanpa pointer, memecah kode menjadi fungsi di luar main hampir mustahil. Anda akan terjebak dengan kode spaghetti atau variabel global. Pertimbangkan variabel h untuk tinggi badan dalam sentimeter. Anda ingin fungsi setHeight meminta masukan dari pengguna.
Ini kelihatannya masuk akal. Tidak. Fungsi ini menerima salinan h. Itu mengubah salinannya. h yang asli tetap tidak tersentuh. Saat fungsinya keluar, salinan itu hilang. Tinggi badan Anda tetap tidak diinisialisasi atau nol.
Untuk benar-benar memperbarui h, fungsi tersebut memerlukan referensi. Khususnya, sebuah penunjuk. Ubah daftar parameter untuk menerima alamat.
Sekarang Anda memiliki dua cara untuk menyebutnya.
Pertama, gunakan alamat operator & langsung di h.
setTinggi(&h);
Kedua, buat penunjuk perantara.
Keduanya bekerja. Mereka menunjuk ke tempat yang sama dalam ingatan. Ini mengungkapkan tantangan inti dari petunjuk. Beberapa pointer dapat mereferensikan nilai yang sama. Ubah satu, dan mereka semua melihat perubahannya.
Apakah ini baik atau buruk? Tergantung pada niat Anda. Ini ampuh untuk memperbarui status bersama. Berbahaya jika Anda lupa penunjuk mana yang mengontrol data. Satu penulisan yang tidak disengaja merusak semua yang mengarah ke sana.
Menguasai petunjuk bukanlah suatu pilihan. Inilah perbedaan antara menulis C dan menulis dalam C. Berlatihlah hingga tata letak memori terasa intuitif. Hingga Anda dapat melihat tumpukan dan heap tanpa melihat diagram.
Fitur bahasa yang telah kita bahas sejauh ini ada di sebagian besar bahasa modern. Python memiliki referensi. Java memiliki pegangan objek. C++ memiliki petunjuk cerdas. Tapi C menuntut sesuatu yang lain. Ini menuntut Anda mengelola memori sendiri. Tidak ada pemulung yang membersihkan kekacauan itu. Tidak ada waktu proses untuk menyelamatkan Anda dari kebocoran. Selanjutnya, kita melihat bagaimana C memaksa Anda menangani alokasi dan dealokasi memori dengan presisi tinggi.
Mengapa Kontrol Memori Masih Penting di C
Fleksibilitas C berasal dari kemampuannya untuk memperkecil skala. Bahasa ini memungkinkan Anda menghapus suatu program hingga berjalan pada perangkat keras minimal. Ini bukan sekadar nostalgia. Komputer awal lemah. Saat ini, permintaan akan perangkat elektronik berdaya rendah—ponsel, peralatan medis berukuran kecil—mengembalikan kendala tersebut. C tetap menjadi pilihan utama ketika Anda memerlukan kontrol granular atas penggunaan memori.
Pemahaman ini dimulai dengan bagaimana suatu program hidup di RAM. Saat Anda meluncurkan file yang dapat dieksekusi, file tersebut dimuat ke dalam memori dan mulai menjalankan instruksi melalui prosesor. Fungsi dimuat ke dalam blok memori tertentu saat dijalankan. Mereka meninggalkan blok-blok itu setelah selesai. Setiap titik data baru menghabiskan ruang seumur hidup program.
Alokasi Penyimpanan Dinamis Dijelaskan
Untuk mengatasi kekacauan ini, Anda memerlukan alokasi penyimpanan dinamis. Ini berarti menyimpan memori hanya bila diperlukan dan segera mengosongkannya setelahnya. Banyak bahasa menangani hal ini secara otomatis dengan pengumpulan sampah. C tidak. C membutuhkan manajemen eksplisit.
Perpustakaan standar menyediakan alatnya. Anda mengontrol siklus hidup.
- malloc : Kependekan dari alokasi memori. Ini mencadangkan satu blok memori dengan ukuran tertentu. Ini mengembalikan pointer ke blok itu. Anda menggunakan ini untuk struktur data seperti array, bukan bilangan bulat tunggal seperti
int i. - calloc : Mirip dengan malloc, tetapi juga menghapus memori saat reservasi.
- realoc : Mengubah ukuran blok memori yang dialokasikan sebelumnya.
- gratis : Memaksa program melepaskan memori yang ditetapkan ke penunjuk tertentu.
Praktik terbaiknya sederhana: alokasikan dengan malloc, gratis dengan gratis.
Jika Anda mengalokasikan memori, bahkan untuk sementara, memori tersebut akan tetap berada di RAM hingga sistem operasi membersihkannya. Untuk menjaga ukuran tetap kecil, kosongkan memori sebelum fungsi keluar. Ini mencegah kebocoran memori. Kebocoran memori terjadi ketika suatu program menghabiskan lebih banyak memori hingga terhenti atau mogok. Namun, jangan gratiskan apa yang Anda perlukan nanti dalam fungsi yang sama. Kehilangan data lebih buruk daripada kebocoran.
C vs C++ dan Konsep Inti
Apakah C sama dengan C++? Tidak. C++ memperluas C. Ini bukan bahasa yang sama. Pemrograman C adalah konsep untuk membuat perangkat lunak portabel dan efisien. Itu bergantung pada bahasa C yang dikembangkan di Bell Labs pada tahun 1970an.
C kuat dan serbaguna. Cocok untuk berbagai aplikasi. Memahami struktur dan sejarahnya mengungkap mengapa ia tetap unik. Bahasa ini menawarkan fitur yang tidak dimiliki bahasa lain.
Untuk panduan lebih lanjut, jelajahi sumber daya pemrograman tambahan. Ini akan memperdalam perjalanan Anda ke C.





























