C Programming Language

Memory Address dan C

Aldimhr
09-08-2025
4 min read

Ketika membaca terkait konsep pointer di C ini sebenarnya saya cukup terbantu dari materi Rust Ownership di bukunya Blandy Orendorff & Tindall. Bahasa C juga memiliki konsep reference seperti di bahasa Rust atau C++, sehingga kita bisa membuat beberapa variabel yang menunjuk ke alamat memory yang sama, hanya saja berbeda nama, di bahasa C ini disebut dengan pointer.

Memory Address

Semua data di komputer akan disimpan di dalam memory, jika diibaratkan, memory ini seperti tumpukan box yang dapat berisi angka dalam rentang 0-255 (1 byte atau 8 bit).

Agar lebih mudah dalam mencari angka didalam box, maka disetiap box akan ditambahkan nilai yang unik atau disebut dengan memory address.

Kita bisa melihat memory address dari variable menggunakan ampersand (&).

int main() {
  int var = 123;
  printf("Alamat memory variable var: %p\n", &var); // 0x7fff99265f14

	return EXIT_SUCCESS;
}

Contoh di atas akan menampilkan memory address dari variable var yang memiliki value 123.

Sekarang kita sudah punya variable, value, dan alamat memory. Bisa nggak kita simpan alamat memory tersebut ke variable lain? Bisa! caranya adalah dengan pointer. Dengan begitu, kita bisa mengakses atau mengubah nilai yang sama dari tempat lain.

Pointer

Pointer merupakan variabel yang menyimpan memory address dari variabel lain, dan karena kedua variabel tersebut memiliki memory address yang sama, maka keduanya juga memiliki value yang sama.

Note: variabel pointer dan variabel yang akan ditunjuk harus memiliki tipe data yang sama.

int main() {
  int var = 123;
  printf("Alamat memory variable var: %p\n", &var); // 0x7fff99265f14
  
  int *var2 = &var;
  printf("Alamat memory variable var2: %p\n", var2); // 0x7fff99265f14

	return EXIT_SUCCESS;
}

Sekarang kita bisa lihat untuk variable var2 menyimpan memory address dari variable var. Sekarang, bagaimana jika kita ingin mengambil value var melalui pointer var2? kita bisa mengambil nilainya dengan dereference.

Dereference

Sebelumnya kita bisa mengambil memory address dari suatu variable menggunakan ampersand &, lalu kita bisa menggunakan pointer variable int *var untuk menyimpan memory address dari variable lain, dan kita bisa mengambil nilai dari pointer variable dengan dereference operator (*).

int main() {
  int var = 123;
  printf("Alamat memory variable var: %p\n", &var); // 0x7fff99265f14
  
  int *var2 = &var;
  
  printf("Value dari pointer variable var2: %p\n", var2); // 0x7fff99265f14
  printf("Value dari pointer variable var melalui var2: %d\n", *var2); // 123

	return EXIT_SUCCESS;
}

Jadi, ada dua kegunaan simbol * disini,

  1. Sebagai pointer variable ketika ditambahkan di declaration int *var.
  2. Selain digunakan saat deklarasi maka akan bertindak sebagai dereference operator *var.

Array dan pointer

Ada yang menarik hubungan antara array dan pointer di C. Misalnya, kita punya sebuah array di variable arr.

int arr[3] = {11, 12, 13};

Kalau kita coba print memory address dari variable arr maka hasilnya akan sama dengan memory address untuk element pertama dari variable arr tersebut arr[0].

int arr[3] = {11, 12, 13};
printf("Memory Address &arr %p\n", &arr); // 0x7fff1ceb7fdc
printf("Memory Address &arr[0] %p\n", &arr[0]); // 0x7fff1ceb7fdc

Di memori, elemen-elemen array disimpan di alamat yang berurutan. Jadi, jika kita melihat alamat memori dari arr[0], maka alamat arr[1] akan berada tepat setelahnya.

Nah, pointer bisa digunakan untuk akses value dari array, seperti ini

int arr[3] = {11, 12, 13};
printf("Value dari arr[0]: %d\n", *(arr + 0)); // 11

Untuk akses element pertama kita bisa menggunakan seperti ini *(arr + 0) tapi karena x + 0 = x, maka kita bisa tuliskan seperti ini *arr. Akses element selanjutnya kita bisa tambahkan angkanya seperti ini *(arr + 1) dan seterusnya.

Selain untuk mengambil angka, kita bisa gunakan konsep yang sama untuk merubah value dari array

int arr[3] = {11, 12, 13};
*arr = 20;
*(arr + 1) = 40;
// dan seterusnya

Pass By Reference dan Pass By Value

Pass by value artinya kita akan lempar variable ke function hanya valuenya saja, variable aslinya tidak berubah. Contoh

void testByValue(int val) { 
	val += 10; 
  printf("nilai dari val: %d\n", val); // 110
}

int main(){
  int val = 100;
  printf("nilai awal dari val: %d\n", val); // 100
  testByValue(val);
  printf("nilai dari val: %d\n", val); // 100

}

Perubahan nilai hanya bisa diakses di dalam function, ketika kita coba akses dari luar function maka value dari variable akan tetap atau tidak ada perubahan.

Pass by reference artinya kita berikan reference atau memory address ke function, jadi ketika ada perubahan value didalam function, variable aslinya ikut berubah. Contoh

void incre(int *ref) {
  *ref += 1;
}

int main(){
  int a = 10;
  printf("nilai dari a: %d\n", *ref); // 10
  incre(&a);
  printf("nilai dari a: %d\n", *ref); // 11
  incre(&a);
  printf("nilai dari a: %d\n", *ref); // 12
  incre(&a);
  printf("nilai dari a: %d\n", *ref); // 13
  incre(&a);
  printf("nilai dari a: %d\n", *ref); // 14
}

https://www.w3schools.com/c/c_memory_address.php

Tags
  • C
  • Memory Address
View All Posts