Aritmetika Penunjuk di C

Halo semua, pemrogram masa depan! Hari ini, kita akan memulai perjalanan yang menarik ke dalam dunia aritmetika penunjuk di C. Jangan khawatir jika Anda masih baru dalam pemrograman; saya akan memandu Anda langkah demi langkah, seperti yang saya lakukan untuk banyak mahasiswa selama tahun-tahun pengajaran saya. Jadi, ambil minuman kesukaan Anda, rasakan kenyamanannya, dan mari kita melompatlah!

C - Pointer Arithmetics

Apa itu Penunjuk?

Sebelum kita melompat ke aritmetika penunjuk, mari kita singkatkan kembali apa itu penunjuk. Di C, penunjuk adalah variabel yang menyimpan alamat memori dari variabel lain. Pernahkah Anda membayangkan seperti sebuah papan tanda menunjuk tempat beberapa data disimpan di memory komputer Anda.

Berikut adalah contoh sederhana:

int x = 10;
int *ptr = &x;

Dalam kode ini, ptr adalah penunjuk yang menyimpan alamat x. Operator & memberikan kita alamat x.

Sekarang saat kita telah melepaskan ingatan kita, mari kita jelajahi dunia magis aritmetika penunjuk!

Penambahan dan Pengurangan Penunjuk

Seperti variabel reguler, kita dapat menambahkan dan mengurangi penunjuk. tapi di sini tempat hal yang menarik terjadi: ketika kita menambahkan atau mengurangi penunjuk, itu tidak hanya menambah atau mengurangi 1 dari alamat. Sebaliknya, itu berpindah ke elemen berikutnya atau sebelumnya dari jenis data yang penunjuk itu menunjuk.

Mari kita lihat contoh:

int arr[] = {10, 20, 30, 40, 50};
int *ptr = arr;  // ptr menunjuk ke elemen pertama dari arr

printf("%d\n", *ptr);  // Output: 10
ptr++;
printf("%d\n", *ptr);  // Output: 20
ptr--;
printf("%d\n", *ptr);  // Output: 10

Dalam kode ini, ketika kita menambahkan ptr, itu tidak hanya menambah 1 ke alamat. Itu sebenarnya berpindah ke integer berikutnya di dalam array. Demikian juga, ketika kita mengurangi, itu berpindah kembali ke integer sebelumnya.

Hal ini seperti berjalan melalui array, langkah demi langkah. Setiap langkah (penambahan atau pengurangan) memindahkan kita ke elemen berikutnya atau sebelumnya, terlepas dari berapa banyak byte elemen itu menempati di memory.

Penambahan dan Pengurangan Integer ke Penunjuk

Kita juga dapat menambahkan atau mengurangkan integer ke/dari penunjuk. Operasi ini mirip dengan menambahkan atau mengurangi, tapi kita dapat berpindah beberapa langkah sekaligus.

Berikut adalah contoh:

int arr[] = {10, 20, 30, 40, 50};
int *ptr = arr;

printf("%d\n", *(ptr + 2));  // Output: 30
printf("%d\n", *(ptr + 4));  // Output: 50
printf("%d\n", *(ptr - 1));  // perilaku tidak terdefinisi! Harap hati-hati!

Ketika kita menambahkan 2 ke ptr, kita tidak menambah 2 ke alamat memori. Kita melompat 2 integer ke depan di dalam array. Demikian juga, ptr + 4 memindahkan kita 4 integer ke depan.

Harap hati-hati! Jika Anda mencoba mengakses memory sebelum awal array (seperti ptr - 1 ketika ptr berada di awal array), atau setelah akhir array, Anda akan mendapat perilaku yang tidak terdefinisi. Itu seperti mencoba membaca halaman sebelumnya dari sebuah buku ketika Anda sudah berada di halaman pertama – itu tidak ada!

Pengurangan Penunjuk

Berikut adalah trik yang baik: kita dapat mengurangkan satu penunjuk dari yang lain untuk menemukan berapa banyak elemen di antara mereka. Ini hanya bekerja jika kedua penunjuk menunjuk ke elemen di dalam array yang sama.

Mari kita lihat contoh:

int arr[] = {10, 20, 30, 40, 50};
int *ptr1 = arr;
int *ptr2 = &arr[3];

printf("%ld\n", ptr2 - ptr1);  // Output: 3
printf("%ld\n", ptr1 - ptr2);  // Output: -3

Dalam kode ini, ptr2 - ptr1 memberikan kita 3, karena ada 3 elemen antara arr[0] dan arr[3]. Catatan bahwa hasilnya adalah ditandatangani – jika kita mengurangkan penunjuk yang lebih besar dari yang lebih kecil, kita mendapat angka negatif.

Perbandingan Penunjuk

Terakhir tapi tidak sedikit, kita dapat membandingkan penunjuk menggunakan operator relasional (<, >, <=, >=, ==, !=). Ini sangat berguna ketika bekerja dengan array.

Berikut adalah contoh:

int arr[] = {10, 20, 30, 40, 50};
int *ptr1 = arr;
int *ptr2 = &arr[3];

if (ptr1 < ptr2) {
printf("ptr1 menunjuk ke elemen yang datang sebelum elemen yang ditunjuk ptr2\n");
}

if (ptr1 == &arr[0]) {
printf("ptr1 menunjuk ke elemen pertama dari array\n");
}

Dalam kode ini, kita membandingkan posisi elemen yang ditunjuk oleh ptr1 dan ptr2. Ingat, ketika kita membandingkan penunjuk, kita sebenarnya membandingkan alamat memori.

Ringkasan Operasi Aritmetika Penunjuk

Berikut adalah tabel ringkas yang menyummarikan operasi aritmetika penunjuk yang kita pelajari:

Operasi Deskripsi Contoh
Penambahan (++) Pindah ke elemen berikutnya ptr++
Pengurangan (--) Pindah ke elemen sebelumnya ptr--
Penambahan (+) Pindah ke depan oleh n elemen ptr + n
Pengurangan (-) Pindah ke belakang oleh n elemen ptr - n
Pengurangan Penunjuk Menghitung elemen di antara penunjuk ptr2 - ptr1
Perbandingan Membandingkan posisi elemen ptr1 < ptr2

Dan itu semua, teman-teman! Kita telah melakukan perjalanan melalui wilayah aritmetika penunjuk di C. Ingat, dengan kekuatan besar datang tanggung jawab besar. Aritmetika penunjuk adalah alat yang kuat, tetapi bisa menyebabkan bug jika tidak digunakan dengan hati-hati. SelaluPastikan Anda tidak mengakses memory yang tidak seharusnya!

Seperti yang saya selalu katakan kepada mahasiswa saya, cara terbaik untuk benar-benar memahami konsep ini adalah dengan praktek. Jadi, nyalakan compiler C Anda dan mulailah untuk eksperimen dengan operasi ini. Happy coding, dan semoga penunjuk Anda selalu menunjuk ke tempat yang Anda inginkan!

Credits: Image by storyset