Aldimhr Home Page

Memory Address dan C

C Programming Language

Aldimhr • 09-08-2025 • 4 min read

Ketika membaca terkait konsep reference di C ini sebenarnya saya cukup terbantu dari materi Rust Ownership di bukunya Blandy Orendorff & Tindall. Meski C tidak memiliki konsep reference seperti Rust atau C++, tetapi dengan menggunakan pointer, kita bisa membuat beberapa variable menunjuk ke alamat memory yang sama. Dengan cara ini, perubahan melalui satu pointer akan berdampak pada nilai di alamat yang sama, mirip seperti behavior reference di bahasa lain.

Memory Address

Setiap variable yang ditulis dengan C, akan memiliki memory address. Memory address ini bisa dibilang sebuah alamat untuk value. Misalnya variable A memiliki value 10, dan C tanya nih, ada dimana value dari variable A? maka jawabannya adalah memory address tadi.

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

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—dan caranya adalah dengan pointer. Dengan begitu, kita bisa mengakses atau mengubah nilai yang sama dari tempat lain.

Pointer

Pointer adalah variable yang menyimpan memory address dari variable yang lain sebagai valuenya. Pointer harus memiliki tipe data yang cocok dengan tipe data yang ditunjuk agar saat dereference, compiler tahu ukuran dan tipe data yang dibaca dari alamat tersebut. Kita bisa tulis seperti ini

int main() {
  int var = 123;
  printf("Alamat memory variable var: %p\n", &var); // 0x7fff99265f14
  
  int *var2 = &var;
  printf("Alamat memory variable var di 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 reference operator &, 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