Modul 3 : Pointer Lanjut - IvanSholana/Algoritma-dan-Struktur-Data GitHub Wiki

Materi tentang pointer telah dibahas pada mata kuliah algoritma dan pemograman. Dijelaskan bahwa pointer merupakan sebuah variabel yang menyimpan alamat suatu memori sebagai nilai, dengan melakukan hal demikian variabel pointer sama saja merujuk memori tersebut dan dapat melakukan pengaksesan terhadap nilai yang disimpan oleh alamat memori yang pointer rujuk menggunakan tanda asterik (*). Kemudian lebih lanjut terdapat beberapa penyebutan pointer tergantung dari sifat dia bekerja pada program dan pada materi kali ini akan dibahas hal tersebut. Pemahaman sifat dan jenis pointer diperlukan untuk memahami materi dynamic allocate memory.

Void Pointer

Void Pointer merupakan pointer yang tidak memiliki tipe data. Sebelumnya dijelaskan bahwa pointer merupakan variabel dan seperti yang diketahui bahwa perlu dideklarasikan tipe data suatu nilai pada variabel. Namun, pada void pointer hal tersebut tidak perlu dilakukan. Dengan kondisi demikian maka void pointer dapat merujuk alamat memori dari seluruh jenis tipe data. Perhatikan contoh berikut:

int main(){
    int a = 10;
    void *ptr = &a;
    printf("%d",*(int*)ptr);
}   

Untuk mendeklarasikan void ptr maka hanya perlu gunakan void sebagai jenis variabel ptr. Kemudian, ketika ingin mengakses nilai di dalam memori yang dirujuk maka ptr perlu dilakukan casting atau dirubah tipe datanya terlebih dahulu ke tipe data nilai yang dirujuk.

Null Pointer

Null pointer merupakan pointer yang tidak merujuk alamat memori dan memiliki nilai NULL. Tujuan null pointer adalah menyiapkan pointer sebelum dilakukan assigment value terhadap pointer tersebut. Contoh penggunaan dari null pointer adalah ketika ingin melakukan pengaksesan terhadap ekternal file. Ketika eksternal file ada, maka pointer akan berisi alamat memori dari eksternal file tersebut tetapi jika tidak maka pointer akan bernilai null. Kondisi ketika pointer bernilai null dapat dijadikan sebagai handling error dari suatu kejadian sehingga program tidak mengalami error.

char str[50];
	FILE *fptr;

	fptr = fopen("file.txt", "w");

	if(fptr == NULL){
		printf("Error");
		exit(1);
	}

Untuk melakukan deklarasi null pointer maka cukup mudah

int *ptr = NULL;

Dangling Pointer

Dangling pointer adalah pointer yang merujuk terhadap sebuah alamat memori tidak ada. Kejadian ini memungkinkan ketika alamat memori yang dialokasikan secara dinamis dikenai fungsi free() atau ketika merujuk alamat memori dari lokal variabel pada fungsi. Dengan begitu memori dengan alamat memori tersebut tidak ada lagi tetapi alamat memori tersebut masih tersimpan di dalam variabel ptr. Oleh karena itu, pointer yang merujuk sautu alamat memori yang tidak ada tersebut disebut dengan Dangling Pointer.

Contoh dari Dangling Pointer:

#include <stdio.h>

int* func(){
    int num = 10;
    return &num;
}

int main(){
  int *ptr = NULL;
  ptr = func();
  printf("%d",*ptr);
  return 0;
}   

Pada program di atas akan terjadi segmentation fault atau kesalahan yang terjadi ketika program mencoba mengakses alamat memori yang ilegal.

Wild Pointer

Wild pointer merupakan pointer yang merujuk pada alamat memori yang tidak ada. Namun berbeda dengan dangling pointer, alamat memori yang dirujuk oleh wild pointer memang tidak ada sejak awal bukan tidak ada karena dilakukan free function. Wild pointer tentu akan menyebabkan crash pada memori dikarenakan program tidak mengetahui alamat memori apa yang ingin dirujuk oleh pointer.

Contoh dari wild pointer adalah sebagai berikut:

int *ptr = 10; // --> secara sengaja memberikan sembarang value, jika tidak ada alamat memori dengan alamat 10 maka pointer tersebut aka menjadi wild pointer.
⚠️ **GitHub.com Fallback** ⚠️